|
|
13장 정리문제
1) 훈련과 검증의 차이를 설명하라. 검증이 왜 필요한지 설명하고 훈련로스와 검증로스를 이용하여 과적합을 판단하는 방법을 설명하라.
훈련은 모델이 데이터를 보면서 패턴을 학습하고 가중치를 업데이트하는 과정이며, 검증은 훈련에 사용하지 않은 별도의 데이터로 모델의 성능을 평가하는 과정이다. 또한 검증 단계에서는 가중치를 업데이트하지 않고 평가만 수행한다.
검증이 필요한 이유는 모델이 훈련 데이터를 단순히 암기했는지, 아니면 진짜 패턴을 학습했는지 구별하기 위해서이다.
훈련 데이터만으로는 모델이 새로운 데이터에서도 잘 동작하는지 알 수 없기 때문에 검증 데이터가 반드시 필요하다.
과적합은 훈련 Loss와 검증 Loss를 비교하여 판단한다. 예로, 두 Loss가 함께 감소하면 정상적으로 학습 중인 것이고, 훈련 Loss는 계속 감소하는데 검증 Loss가 오히려 증가하거나 횡보하기 시작하면 과적합이 발생한 것으로 판단한다.
검증 Loss가 더 이상 감소하지 않는 지점이 해당 모델의 최대 성능이며, 성능을 더 높이려면 모델 구조 자체를 변경해야 한다.
2) 신경망의 훈련예제에서 훈련/검증 손실과 정확도를 matplotlib을 이용하여 그래프로 그리는 방법을 설명하라.
- 매 에퍽마다 실시간으로 그래프를 업데이트하도록 할것 -> 훈련동안 시간의 흐름에 따라 loss의 변화를 확인가능하도록 할것
훈련 루프 바깥에 훈련/검증 Loss와 정확도를 저장할 리스트를 초기화하고, 매 에폭마다 해당 값들을 리스트에 누적한다.
그래프를 실시간으로 업데이트하려면 에폭마다 이전 출력을 지우고 새로 그려야 하는데, clear_output(wait=True)로 이전 출력을 지운 뒤 matplotlib으로 다시 그리는 방식을 사용한다.
wait=True 옵션은 새 그래프가 준비될 때까지 기다렸다가 교체하므로 화면 깜빡임을 방지한다.
그래프는 Loss와 Accuracy를 각각 별도의 subplot으로 나란히 그리며, 각 그래프에 훈련/검증 곡선을 함께 표시하여 과적합 여부를 시각적으로 확인할 수 있다.
이 방식은 Jupyter 노트북 환경에서 동작하며 코드 안에서 바로 그래프를 확인할 수 있다는 장점이 있다.
3) 신경망의 훈련예제에서 훈련/검증 손실과 정확도를 텐서보드를 이용하여 그래프로 그려보라.
- 매 에퍽마다 실시간으로 그래프를 업데이트하도록 할것 -> 훈련동안 시간의 흐름에 따라 loss의 변화를 확인가능하도록 할것
텐서보드는 브라우저에서 그래프를 확인하는 시각화 도구이다.
SummaryWriter 객체를 생성하여 로그를 저장할 폴더를 지정하고, 매 에폭마다 add_scalar()로 태그명, 기록할 값, 현재 에폭을 전달하면 해당 폴더에 로그 파일이 저장된다. 이후 훈련이 끝나면 writer.close()로 파일을 닫아야 한다.
저장된 로그는 터미널에서 tensorboard --logdir=저장폴더 명령어로 로컬 웹서버를 실행한 뒤 브라우저에서 localhost:6006으로 접속하여 확인할 수 있고, matplotlib과 달리 별도의 브라우저에서 확인해야 하지만 그래프가 더 깔끔하고 다양한 기능을 제공한다는 장점이 있다.
4) 신경망을 구현할때 사용하는 파이토치 클래스를 모두 설명하라.
nn.Module은 모든 신경망 모델의 부모 클래스로, 이를 상속받아 모델을 설계한다.
내부적으로 레이어들을 자동으로 추적하고 관리하며, model.parameters()를 통해 모든 레이어의 가중치에 한 번에 접근할 수 있다.
nn.Linear는 완전연결층으로, 입력 뉴런 수와 출력 뉴런 수를 지정하면 가중치와 편향을 자동으로 생성하고 선형 연산을 수행한다.
이를 여러 개 쌓고 사이에 활성화 함수를 끼워넣어 다층 신경망을 설계한다.
활성화 함수(ReLU, Sigmoid, Softmax)는 선형 연산만 반복할 때 발생하는 문제를 해결하기 위해 비선형성을 추가한다.
ReLU는 은닉층에서, Sigmoid와 Softmax는 출력층에서 주로 사용한다.
nn.Sequential은 레이어들을 순서대로 묶어주는 컨테이너로, 데이터가 입력되면 지정한 순서대로 자동으로 통과시켜준다.
Dataset은 데이터를 파이토치에서 사용할 수 있는 형태로 정의하는 클래스이며, DataLoader는 Dataset에서 데이터를 배치 단위로 꺼내주는 클래스이다. 또한 배치 크기와 셔플 여부 등을 설정할 수 있다.
옵티마이저는 역전파로 계산된 기울기를 받아 학습률 등의 설정값을 반영하여 실제로 가중치를 업데이트하는 역할을 하며, SGD, Adam 등 다양한 업데이트 전략이 있다.
손실함수는 모델의 예측값과 정답의 차이를 수치로 계산하며, 이 값이 역전파의 시작점이 된다.
분류 문제에는 CrossEntropyLoss, 회귀 문제에는 MSELoss를 주로 사용한다.
5) 신경망 모델의 입력텐서의 원소는 [0,1]사이로 정규화 하는 이유를 설명하라.
입력값의 스케일을 맞추기 위해서이다.
픽셀값이 0~255처럼 범위가 크면 가중치 업데이트가 불안정해지고, 활성화 함수가 효율적으로 동작하지 못하며, 가중치 초기값과 스케일이 맞지 않아 초반 학습이 불안정해지지만, 0~1로 정규화하면 이 세 가지 문제가 해결되어 학습이 안정적이고 빠르게 진행된다.
6) 신경망 모델의 출력값의 범위에 대하여 설명하라.
출력값의 범위는 문제 유형에 따라 결정되는데, 이진 분류 문제는 출력층에 Sigmoid를 사용하여 0~1 사이의 값 하나가 출력되며 확률로 해석하고 다중 분류 문제는 Softmax를 사용하여 0~1 사이의 값 여러 개가 출력되며 모든 출력의 합이 1이 되어 각 클래스에 속할 확률로 해석한다.
회귀 문제는 출력층에 활성화 함수를 사용하지 않아 범위 제한이 없는 실수값이 출력된다.
14장 정리문제
1) 합성곱 신경망에서 합성곱, 풀링, 완전연결레이어의 기능을 설명하라.
합성곱(Convolution) 레이어는 커널(Kernel, 필터)을 이미지 위에서 슬라이딩하면서 특징을 추출한다. 커널은 작은 패턴 탐지기로, 이미지 전체를 훑으면서 특정 패턴이 각 위치에 얼마나 강하게 나타나는지를 특성맵(Feature Map)에 기록한다. 커널 안의 값들이 곧 가중치이며, 이 값들이 역전파를 통해 학습된다.
레이어가 깊어질수록 수용야가 넓어져서 얕은 층은 엣지나 선 같은 단순한 패턴을, 깊은 층은 눈, 코, 얼굴 전체 같은 복잡한 패턴을 감지한다.
풀링 레이어는 특성맵의 크기를 줄이면서 중요한 정보를 보존한다. 최대 풀링은 영역 내 최댓값만 선택하고, 평균 풀링은 평균값을 계산한다.
풀링을 반복할수록 위치 정보는 사라지고 패턴의 존재 여부만 남는다.
이때 중요한 것은 풀링 자체가 중요한 특징을 골라내는 게 아니라, 커널 학습이 먼저 중요한 패턴에 큰 값을 부여하고 풀링은 단순히 큰 값을 선택하는 역할만 한다는 점이다.
완전연결 레이어는 앞에서 추출된 특징들을 바탕으로 최종 분류를 결정한다.
평탄화로 2차원 특성맵을 1차원 벡터로 펼친 후 다층 퍼셉트론과 동일하게 동작한다. 이때 펼쳐지는 것은 픽셀값이 아니라 합성곱과 풀링을 거쳐 추출된 특징의 강도 목록이기 때문에, 위치 정보가 사라져도 분류에는 문제가 없다.
2) 합성곱 신경망에서 특성맵, 커널, 패딩, 스트라이드의 의미를 설명하라.
커널은 패턴 탐지기 역할을 하는 가중치 행렬이다. 크기는 하이퍼파라미터로 사람이 결정하며 보통 3x3, 5x5를 사용한다.
한 레이어에 커널이 여러 개 있으면 각각 다른 패턴을 동시에 탐지한다.
커널 안의 값들이 역전파로 학습되면서 분류에 유용한 패턴을 탐지하도록 최적화된다.
특성맵은 커널이 이미지를 훑고 난 결과물로, 각 위치에서 해당 패턴이 얼마나 강하게 나타나는지를 나타내며, 커널이 32개면 특성맵도 32장이 만들어진다.
패딩은 입력 가장자리에 0을 추가하는 것으로, 커널이 가장자리 픽셀과 연산할 때 범위를 벗어나는 문제를 해결한다.
패딩 양에 따라 출력 크기가 달라지는데, 밸리드 패딩은 패딩 없이 출력이 가장 작고, 세임 패딩은 출력 크기를 입력과 동일하게 유지하며, 풀 패딩은 출력이 입력보다 커진다.
실전에서는 네트워크 설계가 편한 세임 패딩을 가장 많이 사용한다.
스트라이드는 커널이 한 번에 몇 칸씩 이동하는지를 결정하고, 스트라이드가 크면 특성맵 크기가 줄어들어서 풀링 대신 사용하기도 한다. 출력 크기 공식은 다음과 같다.
o = floor((n + 2p - m) / s) + 1
n은 입력 크기, m은 커널 크기, p는 패딩, s는 스트라이드, floor()는 버림 연산이다.
3) 583~593페이지의 수식을 완벽히 이해하라.
1차원 이산 합성곱의 수학적 정의는 다음과 같다.
y[i] = sum(k=0 to m-1) x_p[i + (m-1) - k] * w[k]
시그마는 k를 0부터 m-1까지 바꿔가면서 전부 더하라는 뜻이고, 대괄호[]는 몇 번째 값인지를 나타내는 인덱싱이다.
결국 이 수식은 커널을 특정 위치에 올려놓고 겹치는 부분끼리 곱한 뒤 전부 더하는 연산을 표현한 것이다.
합성곱과 교차상관의 차이는 커널을 뒤집느냐(x[i-k])와 뒤집지 않느냐(x[i+k])의 차이이다.
파이토치를 포함한 대부분의 딥러닝 프레임워크는 실제로 교차상관을 수행하지만 관례상 합성곱이라고 부르고 커널을 랜덤값으로 초기화 후 학습하기 때문에 뒤집어도 결과가 동일해서 구분이 의미없다.
2차원 이산 합성곱은 1차원과 동일한 원리인데 행과 열 두 방향으로 슬라이딩하는 것이다.
Y[i, j] = sum(k1) sum(k2) X[i - k1, j - k2] * W[k1, k2]
풀링은 최대 풀링과 평균 풀링 두 종류가 있는데 최대 풀링은 영역 내 최댓값을 선택해서 강한 특징을 보존하고 위치 불변성을 확보한다.
평균 풀링은 영역 내 평균값을 계산해서 전체적인 특징을 보존하는데 풀링의 장점은 지역 불변성(입력의 작은 변화가 결과를 바꾸지 않음)과 계산 효율성(특성 크기 축소로 계산량과 과적합 감소)이다.
4) 601페이지 분류를 위한 손실함수의 종류를 설명하라.
분류 문제에서는 문제의 종류(이진 분류 대 다중 분류)와 출력의 형태(로짓 대 확률)에 따라 적절한 손실함수를 선택해야 한다.
이진 교차 엔트로피(Binary Cross-Entropy)
클래스가 2개인 이진 분류에서 사용하는 손실함수다. 출력층에 시그모이드 활성화함수를 사용해서 0~1 사이의 확률 하나를 출력한다.
수식은 다음과 같다.
L = -[y * log(y_hat) + (1-y) * log(1-y_hat)]
y는 정답(0 또는 1), y_hat은 예측 확률이다. 정답이 1일 때 예측 확률이 높을수록 손실이 작아지고, 예측 확률이 낮을수록 손실이 매우 커진다.
범주형 교차 엔트로피(Categorical Cross-Entropy)
클래스가 3개 이상인 다중 분류에서 사용하는 손실함수이다.
출력층에 소프트맥스 활성화함수를 사용해서 각 클래스별 확률을 출력하며, 전부 더하면 1이 된다.
수식은 다음과 같다.
L = -sum(y_i * log(y_hat_i))
y_i는 정답 레이블의 원 핫 인코딩 값(정답 클래스만 1, 나머지는 0), y_hat_i는 각 클래스의 예측 확률이고, 정답 클래스의 예측 확률만 실제로 손실 계산에 영향을 준다.
예를 들어 정답이 고양이인데 고양이 예측 확률이 0.8이면 손실은 -log(0.8)=0.097로 작고, 예측 확률이 0.1이면 손실은 -log(0.1)=2.303으로 크다.
왜 평균제곱오차(MSE)를 쓰지 않나?
회귀 문제에서 쓰던 평균제곱오차(MSE)를 분류에 사용하면 시그모이드/소프트맥스와 조합할 때 역전파 과정에서 기울기가 너무 작아지는 기울기 소실 문제가 발생해서 학습이 매우 느려진다.
교차 엔트로피는 로그 함수 덕분에 기울기가 적절하게 유지되어 학습이 빠르고 안정적이다.
파이토치(PyTorch)에서의 구현
로짓은 활성화함수 적용 전의 날것의 출력값이다. 파이토치에서는 확률 입력 버전과 로짓 입력 버전을 따로 제공한다.
로짓 입력 버전이 선호되는 이유는 확률로 계산하면 시그모이드와 로그를 따로 적용하는 과정에서 극단적인 값이 생겨 오버플로우 위험이 있지만, 로짓으로 계산하면 두 연산을 수학적으로 합쳐서 한번에 계산하기 때문에 수치적으로 안정적이기 때문이다.
이진 분류에는 BCELoss(확률 입력)와 BCEWithLogitsLoss(로짓 입력)를 사용하고, 다중 분류에는 NLLLoss(로그 확률 입력)와 CrossEntropyLoss(교차 엔트로피 손실, 로짓 입력)를 사용한다.
실전에서는 이진 분류에 BCEWithLogitsLoss, 다중 분류에 CrossEntropyLoss를 주로 사용한다.
5) 604페이지의 단계별 객체의 차원의 유도과정을 설명하라.
MNIST(엠니스트)는 28x28 흑백 손글씨 숫자 이미지를 0~9로 분류하는 데이터셋이다. 각 층의 차원 변화는 다음과 같다.
입력: [배치크기 x 28 x 28 x 1]
합성곱_1: [배치크기 x 28 x 28 x 32] - 세임패딩으로 크기 유지, 커널 32개
풀링_1: [배치크기 x 14 x 14 x 32] - 2x2 풀링으로 절반 축소
합성곱_2: [배치크기 x 14 x 14 x 64] - 세임패딩으로 크기 유지, 커널 64개
풀링_2: [배치크기 x 7 x 7 x 64] - 2x2 풀링으로 절반 축소
평탄화(Flatten): [배치크기 x 3136] - 7x7x64=3136
완전연결_1: [배치크기 x 1024] - FC 레이어 출력 노드 수 (하이퍼파라미터)
완전연결_2: [배치크기 x 10] - 클래스 10개
합성곱에서 크기가 유지되는 이유는 세임 패딩을 사용하기 때문이고, 채널(Channel) 수가 늘어나는 이유는 커널 개수만큼 특성맵이 생성되기 때문이다.
풀링에서 크기가 절반이 되는 이유는 2x2 풀링에 스트라이드 2를 사용하기 때문이고, 평탄화 후 3136이 1024로 줄어드는 것은 완전연결 레이어에서 3136개 입력 노드가 1024개 출력 노드에 가중치 곱으로 연결되어 새로운 값을 만들기 때문이다.
6) 훈련 데이터 증식(augmentation)이란 무엇이고 왜 필요한지 설명하라.
데이터 증식은 기존 이미지를 다양하게 변환해서 새로운 학습 데이터를 만들어내는 기법이다. 필요한 이유는 세 가지다.
첫째, 딥러닝은 데이터가 많을수록 성능이 좋은데 현실에서 데이터 수집은 비싸고 어렵기 때문에 있는 데이터를 변환해서 양을 늘린다.
둘째, 데이터가 적으면 모델이 훈련 데이터를 통째로 외워버리는 과적합이 발생하는데, 다양한 변형을 학습시키면 일반화 성능이 향상된다.
셋째, 실제 환경에서 찍힌 사진은 각도, 밝기, 위치가 전부 다르기 때문에 다양한 변환을 학습해두면 실전에서도 잘 작동한다.
7) 614페이지에서 파이토치 예제에서 이미지변환을 통하여 데이터를 증식하는 과정을 설명하라.
원본과 변환후의 영상을 출력하여 증식의 효과를 비교설명하라.
교재에서는 CelebA 데이터셋을 사용해서 5가지 변환을 적용한다. CelebA는 유명인 얼굴 이미지 데이터셋으로 162,770장의 훈련 데이터를 포함한다.
적용하는 5가지 변환은 다음과 같다.
바운딩 박스로 자르기는 이미지의 특정 영역만 잘라내는 변환이다.
transforms.functional.crop(img, 50, 20, 128, 128)으로 구현하며, 숫자는 시작 행, 시작 열, 높이, 너비를 의미한다.
수평 뒤집기는 이미지를 좌우로 반전하는 변환이다. transforms.functional.hflip(img)으로 구현한다.
대비 조정은 밝고 어두운 부분의 차이를 강조하는 변환이다.
transforms.functional.adjust_contrast(img, contrast_factor=2)으로 구현한다.
명도 조정은 이미지 전체를 밝게 또는 어둡게 만드는 변환이다.
transforms.functional.adjust_brightness(img, brightness_factor=1.3)으로 구현한다.
중앙 자르기 후 리사이즈는 이미지 중앙 부분만 잘라서 원본 크기로 늘리는 변환이다.
transforms.functional.center_crop(img, [0.7218, 0.7178])으로 구현한다.
위의 변환들은 고정값을 사용하므로 결정적 변환이며, 모델 훈련을 위한 데이터 증식에서는 이 변환들을 랜덤하게 수행하는 것이 권장된다.
예를 들어 랜덤한 위치에서 바운딩 박스를 자르거나, 50% 확률로 수평 뒤집기를 적용하거나, contrast_factor를 랜덤하게 선택할 수 있다.
실제 훈련용 변환 파이프라인은 다음과 같이 구성한다.
transform_train = transforms.Compose([transforms.RandomCrop([178, 178]), transforms.RandomHorizontalFlip(), transforms.Resize([64, 64]), transforms.ToTensor()])
검증과 테스트 데이터에는 랜덤 변환 없이 고정된 변환만 적용한다.
transform = transforms.Compose([transforms.CenterCrop([178, 178]), transforms.Resize([64, 64]), transforms.ToTensor()])
교재 그림 14-17을 보면 같은 이미지 2장을 5번 반복해서 꺼낼 때 매 에폭마다 조금씩 다른 이미지가 만들어지는 것을 확인할 수 있다. 랜덤한 변환이므로 코드를 반복 실행할 때마다 조금씩 다른 이미지가 만들어진다.
8) 데이터 증식을 위한 이미지변환을 적용할때 변환의 파라미터(회전량, 확대축소비율, 노이즈비율 등)를 랜덤하게 결정하는 이유를 설명하라.
변환의 유형(회전, 뒤집기, 밝기 조정 등)은 사람이 미리 정하고, 변환의 파라미터(몇 도 회전, 얼마나 밝게 등)는 매번 랜덤하게 결정한다.
고정값을 사용하면 항상 같은 변환 결과가 나와서 모델이 그 특정 변환 패턴을 외워버릴 수 있고, 진짜 새로운 데이터가 아닌 편향된 데이터를 추가하는 것밖에 안 된다.
랜덤하게 결정하면 매 에폭마다 다른 변환 결과가 나와서 같은 이미지인데 모델 입장에서는 매번 새로운 이미지로 인식되고, 조합이 사실상 무한대가 되어 진짜 데이터 증식 효과가 발생한다.
9) DataLoader 객체에서 훈련데이터를 하나씩 꺼낼때 이미지 변환이 적용되어 데이터 증식의 효과가 발생하는 원리를 설명하라.
원본과 변환후의 영상을 출력하여 증식의 효과를 비교설명하라.
증식된 이미지를 미리 저장해두는 것이 아니라, 데이터로더가 이미지를 꺼낼 때마다 그 자리에서 변환을 적용한다.
데이터셋 생성 시에는 변환 레시피만 등록해두고 실제 변환은 일어나지 않는다. 데이터로더가 이미지를 꺼내는 순간 원본 파일을 읽고 변환 레시피를 적용하면서 랜덤 파라미터가 결정된다.
따라서 같은 원본 파일이라도 매 에폭마다 다른 변환이 적용되어 모델 입장에서는 매번 다른 이미지를 본 것과 같은 효과가 발생한다.
원본 파일은 디스크에 그대로 유지되고, 변환은 파이프라인처럼 원본→변환→모델 순서로 흘러간다. 검증과 테스트 데이터에는 랜덤 변환을 적용하지 않고 항상 동일한 고정 변환만 적용해서 일정한 기준으로 성능을 측정한다.
10) 621페이지 예제에서 실제 모델의 입력데이터, 출력값을 출력하시오. 또 텐서의 차원을 출력하고 설명하시오.
교재 621페이지의 CNN 모델은 CelebA 데이터셋으로 웃는 얼굴을 분류하는 이진 분류 모델이다. 입력은 3채널(RGB) 컬러 이미지이며 64x64 크기로 리사이즈된다.
모델 구조는 다음과 같다.
합성곱_1(conv1): 입력 채널 3개, 출력 채널 32개, 커널 크기 3x3, 패딩 1
활성화함수(relu1): ReLU 풀링_1(pool1): MaxPool2d, 커널 크기 2x2
드롭아웃_1(dropout1): p=0.5
합성곱_2(conv2): 입력 채널 32개, 출력 채널 64개, 커널 크기 3x3, 패딩 1
각 층의 텐서(Tensor) 차원 변화는 다음과 같다.
입력: [배치크기 x 3 x 64 x 64]
합성곱_1 후: [배치크기 x 32 x 64 x 64] - 세임패딩으로 크기 유지, 채널 32개
풀링_1 후: [배치크기 x 32 x 32 x 32] - 2x2 풀링으로 절반 축소
합성곱_2 후: [배치크기 x 64 x 32 x 32] - 세임패딩으로 크기 유지, 채널 64개
풀링_2 후: [배치크기 x 64 x 16 x 16] - 2x2 풀링으로 절반 축소
합성곱_3 후: [배치크기 x 128 x 16 x 16] - 세임패딩으로 크기 유지, 채널 128개
풀링_3 후: [배치크기 x 128 x 8 x 8] - 2x2 풀링으로 절반 축소
합성곱_4 후: [배치크기 x 256 x 8 x 8] - 세임패딩으로 크기 유지, 채널 256개
평균풀링(AvgPool2d) 후: [배치크기 x 256 x 4 x 4] - 2x2로 축소
평탄화(Flatten) 후: [배치크기 x 4096] - 256x4x4=4096
완전연결_1 후: [배치크기 x 1024]
완전연결_2 후: [배치크기 x 1] - 이진 분류이므로 출력 1개
출력값은 로짓(Logit) 1개이며, 이진 분류이므로 BCEWithLogitsLoss를 손실함수로 사용한다.
예측 시에는 로짓에 시그모이드를 적용해서 0~1 사이의 확률로 변환한 후 0.5 이상이면 웃는 얼굴, 미만이면 웃지 않는 얼굴로 분류한다.
11) 621페이지 예제에서 신경망의 훈련에서 손실(훈련,검증)과 정확도(훈련,검증)를 matplotlib을 이용하여 그래프로 그리는 방법을 설명하라.
- 매 에퍽마다 실시간으로 그래프를 업데이트하도록 할것, 교재처럼 훈련종료후 한번에 그리는게 아니고 훈련도중에 실시간으로 업데이트할것 -> 훈련동안 시간의 흐름에 따라 loss의 변화를 확인가능하도록 할것
- 그래프 업데이트 과정을 동영상으로 저장하라.
매 에폭마다 훈련 손실, 검증 손실, 훈련 정확도, 검증 정확도를 계산하고 그래프를 실시간으로 업데이트하는 방법이다.
핵심은 plt.ion()(인터랙티브 모드 활성화)과 plt.pause()(화면 갱신)의 조합이다. plt.ion()을 훈련 시작 전에 호출해서 인터랙티브 모드를 켜두면, 매 에폭마다 plt.pause(0.1)을 호출할 때마다 화면이 갱신되어 실시간으로 그래프가 업데이트된다. 훈련이 끝나면 plt.ioff()로 인터랙티브 모드를 끈다.
동영상 저장은 매 에폭마다 현재 그래프를 이미지 프레임으로 캡처해서 리스트에 저장한 후, 훈련이 끝나면 imageio.mimsave()로 프레임들을 GIF 파일로 합치는 방식으로 구현한다. 프레임 캡처는 fig.canvas.draw() 후 fig.canvas.tostring_rgb()로 현재 그래프를 바이트 데이터로 변환해서 저장한다.
전체 흐름은 다음과 같다.
plt.ion() 호출 후 훈련 루프 시작, 매 에폭마다 훈련/검증 손실과 정확도 계산, ax.cla()로 그래프 초기화 후 새 데이터로 그래프 그리기, plt.pause(0.1)로 화면 갱신, fig.canvas.tostring_rgb()로 프레임 캡처 후 리스트에 저장, 훈련 완료 후 plt.ioff() 호출, imageio.mimsave('training.gif', frames, fps=2)로 동영상 저장.
12) 621페이지 예제에서 손실(훈련,검증)과 정확도(훈련,검증)를 텐서보드를 이용하여 그래프로 그려보라.
- 매 에퍽마다 실시간으로 그래프를 업데이트하도록 할것, 교재처럼 훈련종료후 한번에 그리는게 아니고 훈련도중에 실시간으로 업데이트할것 -> 훈련동안 시간의 흐름에 따라 loss의 변화를 확인가능하도록 할것
텐서보드는 브라우저에서 훈련 과정을 실시간으로 모니터링할 수 있는 시각화 도구다. 매트플롯립과 달리 별도의 브라우저 탭에서 자동으로 업데이트되며, 여러 실험을 동시에 비교할 수 있다는 장점이 있다.
사용 흐름은 다음과 같다. SummaryWriter(요약 작성기)를 생성해서 로그 저장 위치를 지정하고, 매 에폭마다 writer.add_scalars()로 값을 기록한 후, 터미널에서 tensorboard --logdir=runs 명령으로 텐서보드 서버를 실행하면 브라우저에서 localhost:6006으로 접속해서 실시간으로 그래프를 확인할 수 있다.
매트플롯립과 텐서보드의 차이는 다음과 같다. 매트플롯립은 코드 실행 중 팝업 창에서 그래프를 확인하며 plt.pause()로 수동으로 갱신해야 하고, 동영상 저장을 위한 별도 코드가 필요하다. 텐서보드는 브라우저에서 자동으로 업데이트되며 로그가 자동 저장되고, 여러 실험을 동시에 비교하기 쉽다. 단, 텐서보드는 별도 설치(pip install tensorboard)가 필요하다.
13) 11~13장 mnist예제의 MLP를 이용한 영상분류와 14장의 CNN을 이용한 영상분류의 차이점을 설명하라.
- 그래프 업데이트 과정을 동영상으로 저장하라.
다층 퍼셉트론은 이미지를 강제로 평탄화해서 1차원 벡터로 만든 후 입력받기 때문에 공간 구조가 완전히 손실된다.
반면 CNN(합성곱 신경망)은 이미지를 2차원 그대로 입력받아서 공간 구조를 보존한다.
MLP는 픽셀값을 그대로 완전연결 레이어에 넣기 때문에 패턴을 파악하지 못하고, CNN은 합성곱으로 계층적으로 특징을 자동 추출한다.
가중치 수 측면에서 MLP는 입력 크기 x 레이어 노드 수만큼 가중치가 필요해서 매우 많은 반면, CNN은 커널 크기 x 커널 수만큼만 필요하고 같은 커널을 이미지 전체에 공유해서 쓰기 때문에 훨씬 적다.
위치 불변성 측면에서 MLP는 물체가 조금만 이동해도 완전히 다른 입력으로 인식하지만, CNN은 커널이 이미지 전체를 훑으면서 탐지하기 때문에 어디에 있든 같은 패턴이면 동일하게 반응한다.
성능은 MNIST 기준 MLP가 97~98%, CNN이 99% 이상이며, 이미지가 복잡해질수록 차이가 더 벌어진다.
14) 손실 또는 정확도 그래프를 이용하여 과적합 여부를 판단하는 방법을 설명하라.
과적합은 훈련 데이터는 잘 맞추는데 새로운 데이터인 검증 데이터에서는 성능이 나쁜 상태로, 모델이 훈련 데이터를 외워버린 것이다.
손실 그래프에서 정상적인 훈련은 훈련 손실과 검증 손실이 같이 내려가지만, 과적합이 발생하면 훈련 손실은 계속 내려가는데 검증 손실이 다시 올라가기 시작한다.
정확도 그래프에서는 훈련 정확도는 계속 올라가는데 검증 정확도가 정체되거나 떨어지면서 둘 사이의 차이가 계속 벌어지면 과적합이다.
반대로 훈련 손실도 높고 검증 손실도 높으면 모델이 너무 단순하거나 훈련이 부족한 과소적합이며, 이상적인 상태는 훈련 손실과 검증 손실, 훈련 정확도와 검증 정확도가 비슷하게 수렴하는 것이다.
과적합 발생 시 대처 방법으로는 데이터 증식, 드롭아웃 추가, 모델 복잡도 줄이기, 검증 손실이 올라가기 시작하는 시점에 훈련을 중단하는 조기 종료, L1/L2 정규화 등이 있다.
|
|

첫댓글 코딩문제 업데이트 할것