CIFAR-10 데이터를 사용하여 ResNet-18 구현
우선 아래와 같은 BasicBlock을 설정해 준다.
kerner size 는 (3 x 3) 그리고 Batch Normalize를 거친 값을 다시 다음 layer로 넘겨준다.
forward 계층에서는 실질적으로 identity shortcut을 더해주며 계층을 연산해준다.
stride 1이 아니라면 입력값과 출력 값의 dimension이 다르다는 의미이다. 즉 동일한 차원으로 맞춰준다.
stride 값을 다르게 하여, dimension 값을 맞춰 줄 수 있다.
ResNet 클래스 정의
ImageNet에서의 Architecture를 그대로 차용하였다. 필터의 갯수는 논문의 필터와 같게 구현하였다.
여기서 각각이 layer 들의 filter의 갯수가 증가하는 만큼 stride의 값이 커지는(너비와 높이가 줄어 듦) 것을 확인할 수 있다.
layer 하나당 총 4개의 convolution layer를 가지고 있는 것을 확인할 수 있다.
_make_layer 메소드
맨 처음 convolution layer에만 stride 값을 적용될 수 있게끔 한다.
즉 너비와 높이가 줄어들게끔 해준다. 그리고 나머지 convolution layer에는 stride 값이 1로 설정하게끔 한다.
return nn.Sequential(*layers)은 모든 레이어로 반환해준다라는 의미이다.
※참고 [1] + [1] = [1, 1]이 된다.
최종적으로 10개의 클래스 값이 나오게끔 한다. 충분히 capacity가 큰 함수라 클래스 값을 더 크게 잡고 학습 시켜도 학습이 가능하다.
표1처럼 BsicBlock을 두 개로 묶어주는 것을 보여주고 있다.
데이터셋 다운로드 및 불러오기
torchvision이 제공하는 CIFAR10 데이터를 다운 받는다. 그리고 CIFAR10에서 사용되는 일반적인 테크닉을 사용한다.
transforms.ToTensor() - 이미지 데이터를 tensor로 바꿔준다.
transforms.RandomCrop(size) - 이미지를 랜덤으로 잘라서 size 크기로 출력한다.
trnasforms.RandomHorizaontalFlip() - 이미지를 수평으로 뒤집는다. 즉 좌우 반전해준다. 확률의 기본값은 0.5이다.
이제 위에서 설정한 하이퍼 파라미터로 ResNet-18을 트레인 시킨다.
네트워크를 evalution 모드로 바꾼 다음, 테스트를 실행한다.
adjust_learning_rate 메소드는 단계별로 러닝 레이트를 1/10로 줄여주는 방향으로 설정해 준다.
모델 학습 및 평가
20번 학습에 86.42%가 나왔다. 200번 학습을 하면 95%의 accuracy를 가진다고 한다.