이미지를 맞히는 알고리즘 대회인 'ILSVRC'에서 2014년에 2위를 한 VGGNet에 대해서 정리해보려고 한다.
2014년에 1등한 알고리즘은 'GoogLeNet'인데, 1등을 한 GoogLeNet 보다도 구성이 간단하여 응용하기 좋아서 많은 사람들이 VGG 기반의 신경망을 즐겨 사용한다.
>> 논문 주소 : https://arxiv.org/pdf/1409.1556.pdf
1. 참고 사항
(1) VGGNet16과 VGGNet19 두 종류가 있는데, 숫자는 각각의 레이어 개수에 따른 숫자이다.
(2) VGGNet 연구의 핵심은 네트워크의 깊이를 깊게 만드는 것이 성능에 어떤 영향을 미치는지에 관한 것이었기 때문에, convolution 필터 커널 사이즈를 3 x 3으로 고정했다.
필터 크기를 작게 만들어서 네트워크의 깊이를 깊게 만들 수 있었고, 만약 더 큰 필터를 만들었다면 이미지의 크기가 금방 축소되어 네트워크를 깊게 만들기 어려웠을 것이다.
2. VGGNet의 구조
VGGNet이 CNN 학습의 표준 모델로까지 자리잡을 수 있었던 이유는 CNN의 기본 아키텍처 3개인
'Convolution layer', 'Pooling layer', 'Fully Connected layer'
만을 사용해서 만들었기 때문이다.
VGGNet 이전의 CNN인 AlexNet의 Layer 개수는 8개였다. 그에 비해 VGGNet은 16개의 Layer를 가지고 있으니, 더 깊어진 신경망이라는 것을 알 수 있다. 신경망이 더 깊어지면서 훨씬 복잡한 문제를 풀 수 있게 되었다.
위의 그림을 단순화하여 나타내보면 다음과 같다.
(0) Input
224 x 224 크기의 3개 채널 (R, G, B)을 가지는 이미지
(1) 1층 - conv1_1
입력 - 224 x 224 크기의 3개 채널 (R, G, B)을 가지는 이미지
필터 - 3 x 3 x 3 필터 (채널수 x 세로 x 가로) 64개
(패딩은 0으로 1만큼 해주었고, stride는 1로 설정한다.)
출력 - 224 x 224 사이즈의 64개의 피처 맵
(출력값은 ReLU 함수 적용시킨다.)
(2) 2층 - conv1_2
입력 - 224 x 224 사이즈의 64개의 피처 맵
필터 - 3 x 3 x 64 사이즈의 64개 필터 (즉, 3 x 3 x 64 x 64)
출력 - 224 x 224 사이즈의 64개의 피처 맵
(출력값은 ReLU 함수 적용시킨다.)
(3) pool1
입력 - 224 x 224 사이즈의 64개의 피처 맵
풀링 - Max pooling으로 2 x 2 사이즈에 stride 2로 학습을 진행한다.
출력 - 112 x 112 사이즈의 64개의 피처 맵
(피처 맵의 크기가 줄어든 것을 알 수 있다.)
(4) 3층 - conv2_1
입력 - 112 x 112 사이즈의 64개의 피처 맵
필터 - 3 x 3 x 64 사이즈의 128개 필터 (즉, 3 x 3 x 64 x 128)
출력 - 112 x 112 사이즈의 128개의 피처 맵
(5) 4층 - conv2_2
입력 - 112 x 112 사이즈의 128개의 피처 맵
필터 - 3 x 3 x 128 사이즈의 128개 필터 (즉, 3 x 3 x 128 x 128)
출력 - 112 x 112 사이즈의 128개의 피처 맵
(6) pool2
입력 - 112 x 112 사이즈의 128개의 피처 맵
풀링 - Max pooling으로 2 x 2 사이즈에 stride 2로 학습을 진행한다.
출력 - 56 x 56 사이즈의 128개의 피처 맵
(피처 맵의 크기가 줄어든 것을 알 수 있다.)
(7) 5층 - conv3_1
입력 - 56 x 56 사이즈의 128개의 피처 맵
필터 - 3 x 3 x 128 사이즈의 256개 필터 (즉, 3 x 3 x 128 x 256)
출력 - 56 x 56 사이즈의 256개의 피처 맵
(8) 6층 - conv3_2
입력 - 56 x 56 사이즈의 256개의 피처 맵
필터 - 3 x 3 x 256 사이즈의 256개 필터 (즉, 3 x 3 x 256 x 256)
출력 - 56 x 56 사이즈의 256개의 피처 맵
(9) 7층 - conv3_3
입력 - 56 x 56 사이즈의 256개의 피처 맵
필터 - 3 x 3 x 256 사이즈의 256개 필터 (즉, 3 x 3 x 256 x 256)
출력 - 56 x 56 사이즈의 256개의 피처 맵
(10) pool3
입력 - 56 x 56 사이즈의 256개의 피처 맵
풀링 - Max pooling으로 2 x 2 사이즈에 stride 2로 학습을 진행한다.
출력 - 28 x 28 사이즈의 256개의 피처 맵
(피처 맵의 크기가 줄어든 것을 알 수 있다.)
(11) 8층 - conv4_1
입력 - 28 x 28 사이즈의 256개의 피처 맵
필터 - 3 x 3 x 256 사이즈의 512개 필터 (즉, 3 x 3 x 256 x 512)
출력 - 28 x 28 사이즈의 512개의 피처 맵
(12) 9층 - conv4_2
입력 - 28 x 28 사이즈의 512개의 피처 맵
필터 - 3 x 3 x 512 사이즈의 512개 필터 (즉, 3 x 3 x 512 x 512)
출력 - 28 x 28 사이즈의 512개의 피처 맵
(13) 10층 - conv4_3
입력 - 28 x 28 사이즈의 512개의 피처 맵
필터 - 3 x 3 x 512 사이즈의 512개 필터 (즉, 3 x 3 x 512 x 512)
출력 - 28 x 28 사이즈의 512개의 피처 맵
(14) pool4
입력 - 28 x 28 사이즈의 512개의 피처 맵
풀링 - Max pooling으로 2 x 2 사이즈에 stride 2로 학습을 진행한다.
출력 - 14 x 14 사이즈의 512개의 피처 맵
(피처 맵의 크기가 줄어든 것을 알 수 있다.)
(15) 11층 - conv5_1
입력 - 14 x 14 사이즈의 512개의 피처 맵
필터 - 3 x 3 x 512 사이즈의 512개 필터 (즉, 3 x 3 x 512 x 512)
출력 - 14 x 14 사이즈의 512개의 피처 맵
(16) 12층 - conv5_2
입력 - 14 x 14 사이즈의 512개의 피처 맵
필터 - 3 x 3 x 512 사이즈의 512개 필터 (즉, 3 x 3 x 512 x 512)
출력 - 14 x 14 사이즈의 512개의 피처 맵
(17) 13층 - conv5_3
입력 - 14 x 14 사이즈의 512개의 피처 맵
필터 - 3 x 3 x 512 사이즈의 512개 필터 (즉, 3 x 3 x 512 x 512)
출력 - 14 x 14 사이즈의 512개의 피처 맵
(18) pool5
입력 - 14 x 14 사이즈의 512개의 피처 맵
풀링 - Max pooling으로 2 x 2 사이즈에 stride 2로 학습을 진행한다.
출력 - 7 x 7 사이즈의 512개의 피처 맵
(피처 맵의 크기가 줄어든 것을 알 수 있다.)
(19) 14층 - fully connected 6
입력 - 7 x 7 사이즈의 512개의 피처 맵
과정 - 7 x 7 x 512 = 25088개의 뉴런이 되었고, 4096개의 뉴런과 fully connected 된다.
출력 - 1 x 1 x 4096
(20) 15층 - fully connected 7
입력 - 1 x 1 x 4096
과정 - 4096개의 뉴런과 fully connected 된다.
출력 - 1 x 1 x 4096
(21) 16층 - fully connected 8
입력 - 1 x 1 x 4096
과정 - 1000개의 뉴런과 fully connected 된다.
출력 - 1 x 1 x 1000
(22) softmax 함수
1000개의 뉴런으로 구성되어 1000개의 class로 분류한다.
3. 정리
(1) VGGNet은 3 x 3 사이즈의 작은 필터를 모든 convolution 레이어에 사용한다.
(2) 작은 필터를 사용해서 신경망의 깊이를 깊게 만들 수 있다.
(3) 층이 깊다보니 더 많은 ReLU 함수를 사용할 수 있어서 더 많은 비선형성을 확보할 수 있다.
참고 자료 : https://bskyvision.com/entry/CNN-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EB%93%A4-VGGNet%EC%9D%98-%EA%B5%AC%EC%A1%B0-1 / https://brunch.co.kr/@hvnpoet/126
'[ 딥러닝 ]' 카테고리의 다른 글
[ CNN ] ResNet / 층이 깊어지면 성능도 좋아지게! (0) | 2023.06.07 |
---|---|
[ CNN ] GoogLeNet / 2014 ILSVRC 1위 모델 (0) | 2023.06.06 |
딥러닝의 심층 표현이 중요한 이유 (0) | 2023.06.05 |
가중치 감소 (Weight Decay) (0) | 2023.06.02 |
배치 정규화 (Batch Normalization) (0) | 2023.05.31 |