컴퓨터비전/CNN
[딥러닝] GAP(Global Average Pooling)
PIAI
2022. 3. 14. 00:37
GAP의 필요성
CNN에는 많은 Convolution layer를 쌓기 때문에 많은 필터가 있습니다. 그만큼 차원의 수가 많습니다.
예를들어 (8, 8, 512)의 Feature map들을 Flatten으로 1차원 형태로 바꾸면 8 x 8 x 512 = 32,768 의 파라미터가 생기고 여기서 100개의 뉴런으로 구성된 Layer에 연결하면 32,768,000개의 파라미터가 생깁니다. 파라미터가 너무 많아지면서 학습 시 over fitting이 발생할 수도 있습니다.
GAP의 구현
- 위의 그림과 같이 채널별로 평균 값을 추출합니다.
- 앞서 말한 Flatten처럼 GAP의 목적은 feature를 1차원 벡터로 만들기 위함입니다. Flatten과는 반대로 파라미터 수를 줄일 수 있습니다.
- 이는 충분히 채널수가 많을 경우 적용하고, 채널수가 적으면 Flatten이 더 나을 수도 있습니다.
코드
from tensorflow.keras.layers import GlobalAveragePooling2D
input = Input(shape=(IMAGE_SIZE, IMAGE_SIZE, 3))
x = Conv2D(filters=64, kernel_size=(3, 3), padding='same')(input)
x = GlobalAveragePooling2D()(x)
x = Dense(50, activation='relu')(x)
model = Model(inputs=input_tensor, outputs=output)