IT Repository

(5) VGGNet (Small Filters with Deeper Networks) 본문

CNN/Study

(5) VGGNet (Small Filters with Deeper Networks)

IT찬니 2020. 1. 14. 18:20

 

 

 

 

VGGNet (2014)

2014년도 ILSVRC 에서 근소한 차이로 2위를 차지한 모델입니다.
그 해에 1위를 차지한 모델은 이후 설명할 GoogLeNet 입니다. 그러나 GoogLeNet에 비해 훨씬 더 간단한 구조로써 이해가 쉽고 변형하기에 용이하기 때문에
실제로 많은 논문과 실험에서 GoogLeNet 보다 더 많이 사용되는 모델이었습니다.

16~19개의 레이어를 사용하고 16개를 사용한 모델을 VGG16, 19개를 VGG19로 명명했습니다.
VGGNet의 특징은 작은 필터로 더 깊은 네트워크를 구성하는 것입니다.

 

Small filters, Deeper networks

동일한 Receptive Field를 가지는 두 개의 뉴런이 있다고 가정합니다.

(1) 9x9 filter 1개를 통과한 뉴런의 Receptive Field는 9x9 입니다.
(2) 3x3 filter 4개를 stride 1로 통과한 뉴런의 Receptive Field는 9x9 입니다.
(1개 통과했을 때의 Receptive Field는 3x3, 2개는 5x5, 3개는 7x7, 4개는 9x9 가 됩니다.)

그러면 파라미터 관점에서 볼 때 두 모델은 어떠한 차이가 있을까요?

(1)의 경우 9x9 filter 1개이므로 9x9 개의 파라미터를 갖게 됩니다. (81개)
(2)의 경우 3x3 filter 4개이므로 3x3x4 개의 파라미터를 갖게 됩니다. (36개)

이와 같이 동일한 Receptive Field를 볼 때 작은 필터를 여러개 사용해서 깊은 네트워크를 만드는 것은 파라미터의 수를 획기적으로 줄일 수 있습니다.
위의 사례에서도 (2)가 (1)에 비해 1/2 이하의 파라미터를 갖게 됩니다.
파라미터의 수를 줄인다는 것은 두 가지 장점을 가져오게 됩니다.

  1. 연산량 감소
  2. 트레이닝이 더 쉬워지고 Overfitting이 덜 일어남
  3. 층이 더 깊어지므로 더 많은 Activation을 사용하게 되고 더 많은 Non-linearity, 즉 복잡성을 갖게 됨 (= 더 복잡한 정보를 다룰 수 있음)
 

Problem of VGGNet

  1. 여전히 파라미터 수가 너무 많음 (특히 FC layer에서 122M개의 파라미터)
  2. 이미지 1개당 Memory 사용량이 약 96MB x 2 (Gradient 포함)으로 너무 큼
    (즉, 배치사이즈가 작아질 수 밖에 없어 속도가 느림)

 

Architecture of VGG16
Conv layer: 3x3 filter size, stride 1, pad 1
Maxpool: 2x2 filter size, stride 2

(http://cs231n.github.io/convolutional-networks/#case 참고)

Layer Filter size Number of filters Output size Memory Params
Input - - 224x224x3 224x224x3 = 150K 0
Conv 3 64 224x224x64 224x224x64 = 3.2M (3x3x3)x64 = 1,728
Conv 3 64 224x224x64 224x224x64 = 3.2M (3x3x64)x64 = 36,864
Pool 2 - 112x112x64 112x112x64 = 800K 0
Conv 3 128 112x112x128 112x112x128 = 1.6M (3x3x64)x128 = 73,728
Conv 3 128 112x112x128 112x112x128 = 1.6M (3x3x128)x128 = 147,456
Pool 2 - 56x56x128 56x56x128 = 400K 0
Conv 3 256 56x56x256 56x56x256 = 800K (3x3x128)x256 = 294,912
Conv 3 256 56x56x256 56x56x256 = 800K (3x3x256)x256 = 589,824
Conv 3 256 56x56x256 56x56x256 = 800K (3x3x256)x256 = 589,824
Pool 2 - 28x28x256 28x28x256 = 200K 0
Conv 3 512 28x28x512 28x28x512 = 400K (3x3x256)x512 = 1,179,648
Conv 3 512 28x28x512 28x28x512 = 400K (3x3x512)x512 = 2,359,296
Conv 3 512 28x28x512 28x28x512 = 400K (3x3x512)x512 = 2,359,296
Pool 2 - 14x14x512 14x14x512 = 100K 0
Conv 3 512 14x14x512 14x14x512 = 100K (3x3x512)x512 = 2,359,296
Conv 3 512 14x14x512 14x14x512 = 100K (3x3x512)x512 = 2,359,296
Conv 3 512 14x14x512 14x14x512 = 100K (3x3x512)x512 = 2,359,296
Pool 2 - 7x7x512 7x7x512 = 25K 0
FC - - 4096 - 7x7x512x4096 = 102,760,448
FC - - 4096 - 4096x4096 = 16,777,216
FC - - 1000 - 4096x1000 = 4,096,000
Total - - - 24M x 4bytes = 93MB 138M

Memory: 메모리에 올리는 인풋 이미지를 포함한 각 레이어의 텐서들
Params: 필터(weight)에 있는 파라미터의 개수
 Convolution layer: 필터 1개의 파라미터 수(H x W x Depth) x 필터의 수 (참고. Depth = 인풋 tensor의 channel 개수)
 FC layer: 인풋 노드의 수 x 아웃풋 노드의 수

직접 확인하고 싶으신 분은 아래 코드를 참조하여 모델의 구조를 확인해보시기 바랍니다.

from tensorflow import keras

VGG16 = keras.applications.vgg16.VGG16()
VGG16.summary()

'CNN > Study' 카테고리의 다른 글

(7) ResNet (Residual Connection)  (16) 2020.01.14
(6) GoogLeNet (Inception Module & BottleNeck Layer)  (0) 2020.01.14
(4) AlexNet  (0) 2020.01.14
(3) Basic of CNN - Structure of CNN  (4) 2020.01.14
(2) Basic of CNN - Convolutional Operation  (0) 2020.01.14
Comments