개요
AlexNet 다음으로 큰 성능 발전을 보였던 VGG에 대해 알아보자.
VGG란?
2014년에 제시된, ImageNet classification에 등장한 CNN 모델이다.
이 모델은 AlexNet과 유사한 형태를 가지고 있으나 아주 큰 특징이 하나 있다.
그것은 바로 3x3 Convolution layer만을 사용하여 층을 쌓았다는 점이다.
이것이 왜 특징인가?
1. 3x3 Convolution layer만을 이용하여 network의 depth를 깊게 만들어냈다.
2. 연산 시에 발생하는 parameter의 수를 줄일 수 있다. 이에 더불어 계산 속도도 높일 수 있다.
3. 더 많은 비선형을 적용시킬 수 있다.
따라서 3x3 Convolution layer만을 이용하여 network의 깊이를 깊게 만드는 것이 성능에 어떤 영향을 미치는지 확인해볼 수 있다.
또한 3x3 convolution layer를 여러 개 쌓아서 7x7 convolutioni layer가 가지는 receptive field, 즉 한 뉴런이 볼 수 있는 field를 만들어낼 수 있도록 만들었다.
위는 Convolution layer가 가지는 receptive field를 구할 수 있는 공식이다.
L: layer의 개수
F: filter의 fxf의 f
VGG의 과정
우선 VGG의 구조는 아래와 같다. (VGG16 기준이다.)
Structure(모든 conv layer의 stride와 padding= 1)
Input: 224x224x3(RGB)
Conv-1: nums= 64, kernel size= 3
Conv-2: nums= 64, kernel size= 3
MaxPool-1: size= 2, stride= 2
Conv-3: nums= 128, kernel size= 3
Conv-4: nums= 128, kernel size= 3
MaxPool-2: size= 2, stride= 2
Conv-5: nums= 256, kernel size= 3
Conv-6: nums= 256, kernel size= 3
Conv-7: nums= 256, kernel size= 3
MaxPool-3: size= 2, stride= 2
Conv-8: nums= 512, kernel size= 3
Conv-9: nums= 512, kernel size= 3
Conv-10: nums= 512, kernel size= 3
MaxPool-3: size= 2, stride= 2
Conv-11: nums= 512, kernel size= 3
Conv-12: nums= 512, kernel size= 3
Conv-13: nums= 512, kernel size= 3
MaxPool-3: size= 2, stride= 2
FC-1: 4096 fully connected layers
FC-2: 4096 fully connected layers
FC-3: 1000 fully connected layers
VGG에서 발생하는 이미지의 output, parameter의 수, 연산 개수는 아래와 같다.
Layer | Tensor output size | Params(w/ biases) | Ops |
Input | 224x224x3 | 0 | |
Conv-1 | 224x224x64 | 64*(3*3*3+1) | 224*224*64*3*3*3 |
Conv-2 | 224x224x64 | 64*(3*3*64+1) | 224*224*64*3*3*64 |
MaxPool-1 | 112x112x64 | 0 | |
Conv-3 | 112x112x128 | 128*(3*3*64+1) | 112*112*128*3*3*64 |
Conv-4 | 112x112x128 | 128*(3*3*128+1) | 112*112*128*3*3*128 |
MaxPool-2 | 56x56x128 | 0 | |
Conv-5 | 56x56x256 | 256*(3*3*128+1) | 56*56*256*3*3*128 |
Conv-6 | 56x56x256 | 256*(3*3*256+1) | 56*56*256*3*3*256 |
Conv-7 | 56x56x256 | 256*(3*3*256+1) | 56*56*256*3*3*256 |
MaxPool-3 | 28x28x256 | 0 | |
Conv-8 | 28x28x512 | 512*(3*3*256+1) | 28*28*512*3*3*256 |
Conv-9 | 28x28x512 | 512*(3*3*512+1) | 28*28*512*3*3*512 |
Conv-10 | 28x28x512 | 512*(3*3*512+1) | 28*28*512*3*3*512 |
MaxPool-4 | 14x14x512 | 0 | |
Conv-11 | 14x14x512 | 512*(3*3*512+1) | 14*14*512*3*3*512 |
Conv-12 | 14x14x512 | 512*(3*3*512+1) | 14*14*512*3*3*512 |
Conv-13 | 14x14x512 | 512*(3*3*512+1) | 14*14*512*3*3*512 |
MaxPool-5 | 7x7x512 | 0 | |
FC-1 | 1x1x4096 | 4096*(25088+1) | 4096*25088 |
FC-2 | 1x1x4096 | 4096*(4096+1) | 4096*4096 |
FC-3 | 1x1x1000 | 1000*(4096+1) | 1000*4096 |
Total | 138,357,544 | 15,470,264,320 |
AlexNet과 비교하면 파라미터가 2배 정도 더 늘어났지만 network의 depth와 정확도도 2배 늘어난 것을 확인해볼 수 있다.