[논문 구현] Deep Residual Learning for Image Recognition

CIFAR-10 데이터를 사용하여 ResNet-18 구현

우선 아래와 같은 BasicBlock을 설정해 준다.

표 1. 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를 가진다고 한다.