[복숭아 연구주제 14] 비전공자도 떠나는 데이터 사이언스 기행 [파이토치 14 화: CNN 심화 VGG]
오늘은 우리가 이전에 알아본 CNN을 활용하여 더욱 진화시킨 버전들에 대하여 알아보는 시간이 되겠습니다.
CNN 기법을 사용해서 많은 심화 모델들이 파생되었는데 그 중에서도 VGG 모델에 대하여 알아보겠습니다.
VGG net 은 3 x 3 convolution, stride = 1, padding =1 으로 이루어진 11 레이어 혹은 그 이상으로 이루어진 convolution 인공지능망입니다.
위에서 보이는 것과 같이 vgg 는 11 레이어 ~ 19 레이어 까지 만들 수 있도록 되어있으며 3 채널 224 x 224 입력을 기준으로 합니다. 이제부터 함께 VGG net 을 활용해서 CNN 모델을 구현해 보도록 하겠습니다.
먼저 torchvision 에 포함되어 있는 vgg 모델의 코드를 뜯어보면서 이해해보겠습니다.
활용하는 라이브러리 들을 불러오고 이미지넷 챌린지 데이터셋으로 프리트레인 되어있는 vgg 모델들을 URL을 가져왔습니다.
이전에 만들었었던 MNIST CNN 모델과 같이 처음에 __init__ 함수로 초기화를 해주도록 합니다.
Features 는 이제부터 쌓아나갈 Convolution layer를 말합니다.
initialize_weights 함수에서는 m, 즉 feature에서 받은 값을 하나씩 받아 weight 이니셜라이징을 fan_out 모드로 nonlinearity는 relu를 쓴다는 뜻으로 어떤 activation funciton을 쓰느냐에 따라 웨이트 초기화 해주는 function 입니다.
Feature 값을 make layer 함수와 cfg 딕셔너리를 활용해 나누어 넣는 방법입니다.
cfg에서 하나씩 값을 뺴와서 레이어를 만드는 함수 입니다. M일때는 풀링, 숫자 일때는 베치 노말라이즈를 할 때는 batchnorm2d 다음 ReLU, 안할때는 ReLU 레이어만 추가하는 것을 확인 할 수 있습니다.
cfg 에서 'A': [ 'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'] 를 예를 들어서 make_layers 함수를 활성화 해본다면
이렇게 convolution layer가 생성이 되는 것을 확인 하실 수 있겠습니다.
cfg의 A 는 conv 레이어 8개 + fully connected layer 3개 해서 11개의 레이어의 VGG11 이라는 것을 알 수 있고
같은 논리로 B는 10 + 3 이므로 VGG13, C는 VGG16, 마지막으로 D는 VGG 19가 되겠습니다.
여기까지는 레이어를 쌓은 Sequential 을 쌓아보았습니다.
VGG 클래스를 활용해서 CNN이 정상적으로 출력되는 것을 볼 수 있습니다.
만약 이미지 싸이즈가 다른 커스텀 VGG net을 사용한다면 하드코딩 했었던
이 부분을 수정해주셔야 오류가 나지 않고 러닝이 제대로 될 것입니다.
다음번에는 CIFAR - 10 데이터셋을 활용하여 내가 만들어본 VGG NET을 적용해 보도록 하겠습니다.