Analyzing Vgg16 model’s Output Shape
Updated:
Vgg16모델
Vgg16모델은 16개의 계층으로 이루어진 신경망이다.
ImaegeNet으로 훈련된 모델을 불러들일수 있으며
이번 포스트에서는 Vgg16모델의 출력 형태가 어떻게 변하는지,
그리고 왜 그렇게 변하는지 알아보도록 한다.
from tensorflow import keras
from tensorflow.keras import layers
conv_base = keras.applications.vgg16.VGG16(
weights="imagenet",
include_top=False,
input_shape=(180, 180, 3))
그전에 vgg16모델의 출력층을 제외하고 입력층과 합성곱층만을 불러들이도록 했다.
또 input_shape를 (180,180,3)으로 지정해줬다.
이렇게 불러들이 모델을 살펴보자.
Layer의 이름들을 잘 살펴보면
block1_conv1
block1_conv2
block1_pool
이름의 앞부분이 block1으로 동일하다. 계속 살펴보면
block2_conv1
block2_conv2
block2_pool
이런식으로 반복이된다.
세번째 블럭부터는 Conv2D층이 블럭당 3개로 늘어나지만 큰 틀에서는 비슷하다.’
Conv2D
입력되는 데이터는 (180,180,3)의 형태로 들어오게된다.
데이터는 기본적으로 가로, 세로 180의 크기를 가지는 컬러(3)의 이미지 파일이 된다.
먼저 block1의 첫번째 Conv2D층을 지나게 된다.
이때 Output Shape가 (180,180,3)에서 (180,180,64)로 바뀌게 되는데
이는 필터의 갯수를 64개를 사용하여 정보의 수를 늘리게 해준다.
Conv2D층을 지나게되면서 데이터들이 (3,3,3)의 형태로 생긴 필터를 거치게 되는데
이 필터를 통과하면 (3,3,3)의 데이터에서 하나의 값이 나오게 된다.
이때 패딩 1, 보폭 1로 설정하면서 데이터의 손실을 최소화하여
Conv2D층을 통과하게 되면서도 Output shape에서 가로와 세로는 동일하게 유지되었다.
결국 (3,3,3)의 필터 한개를 패딩1, 보폭1을 지정하여 통과한 데이터의 출력형태는 180x180이 되는것이다.
Vgg16모델은 여기에 필터의 갯수를 64개를 적용해 180x180으로 되어있는 데이터가 64층이 되어
Conv2D레이어를 통과하게 되면 최종적으로 (180,180,64)가 된다.
두번째의 Conv2d층도 위와 마찬지이다.
MaxPooling2D
세번째로 block1의 마지막층인 MaxPooling2D층을 통과하게 되는데
Conv2D층을 통과할때 필터수를 64개로 설정하였기때문에
파라미터수가 급증하였는데 이러면 파라미터가 너무 많아지기때문에
이를 줄이기 위하여, 그리고 정보를 압축하여 데이터속의 유사성을 찾기위해
각 층(필터)에 대하여 (2,2)의 단위로 데이터에서 최대값을 선택하여 저장한다.
보폭은 겹치지 않게 2로하는게 가장 성능이좋다.
결국 가로 절반, 세로 절반이 되므로 Output shape는 (90,90,64)가 된다.
반복
이제 두번째 block을 통과하게 되면서 필터수는 64개에서 2배로뛰어 128개가 된다.
마찬가지로 두개의 Conv2D를 거치고, MaxPooling층을 거치면서 Output Shape는 (45,45,128)가 된다.
결국 한개의 블록(2~3개의 Conv2D, 1개의 MaxPooling2D)을 통과할때마다 Output Shape는 가로, 세로가 절반씩, 필터수는 두배씩 늘어나게 되어
세번재 Block을 통과하고 나면 Output Shape가 (22,22,256)이 된다.
이때 두번째 Block을 통과했을때의 가로, 세로의 형태가 (45,45)였는데
2로 나누었을때 나누어떨어지지 않은 데이터부분은 버려지게 된다.
마찬가지로 네번째 Block을 통과하고 나면 (11,11,512)가 되는데
다섯번째 Block의 Conv2D층에서는 더이상 필터수를 늘리지 않는다.
필터수는 그대로 사용하면서 MaxPooling2D층을 통과하게 되면서
Output Shape의 최종형태는 (5,5,512)가 된다.
Leave a comment