T'SPACE

다채로운 에디터들의 이야기

컴퓨터공학/인공지능

Maximum Pooling 최대값 풀링

Tonny Kang 2024. 8. 7. 15:56
반응형

CNN의 최대 풀링과 글로벌 평균 풀링 이해하기

컨볼루션 신경망(CNN)은 이미지 분류 및 분석에서 중요한 도구입니다. 이번 글에서는 CNN의 중요한 구성 요소인 최대 풀링(Max Pooling)글로벌 평균 풀링(Global Average Pooling)에 대해 알아보겠습니다.


최대 풀링(Max Pooling)


최대 풀링은 CNN의 특성 맵에서 중요하지 않은 정보를 제거하고 중요한 정보를 추출하는 역할을 합니다. 이는 주로 이미지의 활성화된 부분을 강조하는 데 사용됩니다. 예를 들어, 아래의 코드에서 최대 풀링을 적용한 모델을 정의할 수 있습니다.

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(filters=64, kernel_size=3), 
    layers.MaxPool2D(pool_size=2),
    # 추가 레이어
])

최대 풀링의 원리


최대 풀링은 주어진 크기의 윈도우 내에서 최대 값을 추출하여 특성 맵을 축소합니다. 이는 많은 '0' 값, 즉 활성화되지 않은 픽셀을 제거하여 모델의 크기를 줄이고 중요한 정보를 보존합니다. 아래는 최대 풀링의 예시입니다.

728x90
import tensorflow as tf

image_condense = tf.nn.pool(
    input=image_detect,  # Detect 단계의 이미지
    window_shape=(2, 2),
    pooling_type='MAX',
    strides=(2, 2),
    padding='SAME',
)

plt.figure(figsize=(6, 6))
plt.imshow(tf.squeeze(image_condense))
plt.axis('off')
plt.show();

번역 불변성(Translation Invariance)


최대 풀링은 위치 정보를 일부 제거하여 번역 불변성을 제공합니다. 이는 이미지 내의 특징이 위치에 관계없이 인식될 수 있도록 도와줍니다. 예를 들어, 아래 이미지를 보면 최대 풀링을 반복 적용했을 때 두 점의 위치 정보가 손실됩니다.

이는 CNN이 작은 거리 내에서 위치 변화에 불변하도록 도와줍니다. 즉, 특징이 약간 다른 위치에 있어도 동일한 특징으로 인식할 수 있게 됩니다.

반응형

글로벌 평균 풀링(Global Average Pooling)


글로벌 평균 풀링은 CNN의 마지막 단계에서 주로 사용되는 풀링 기법입니다. 이는 각 특성 맵의 평균 값을 계산하여 특성 맵을 1D로 변환합니다. 이를 통해 모델의 파라미터 수를 크게 줄일 수 있습니다.

model = keras.Sequential([
    pretrained_base,
    layers.GlobalAvgPool2D(),
    layers.Dense(1, activation='sigmoid'),
])

글로벌 평균 풀링의 동작 원리


글로벌 평균 풀링은 특성 맵의 모든 값을 평균하여 하나의 값으로 대체합니다. 아래는 랜덤으로 생성된 특성 맵에 글로벌 평균 풀링을 적용하는 예시입니다.

feature_maps = [visiontools.random_map([5, 5], scale=0.1, decay_power=4) for _ in range(8)]

gs = gridspec.GridSpec(1, 8, wspace=0.01, hspace=0.01)
plt.figure(figsize=(18, 2))
for i, feature_map in enumerate(feature_maps):
    plt.subplot(gs[i])
    plt.imshow(feature_map, vmin=0, vmax=1)
    plt.axis('off')
plt.suptitle('Feature Maps', size=18, weight='bold', y=1.1)
plt.show()

# 텐서플로우 포맷으로 재구성
feature_maps_tf = [tf.reshape(feature_map, [1, *feature_map.shape, 1])
                   for feature_map in feature_maps]

global_avg_pool = tf.keras.layers.GlobalAvgPool2D()
pooled_maps = [global_avg_pool(feature_map) for feature_map in feature_maps_tf]
img = np.array(pooled_maps)[:,:,0].T

plt.imshow(img, vmin=0, vmax=1)
plt.axis('off')
plt.title('Pooled Feature Maps')
plt.show();

위 코드에서 5×5 크기의 특성 맵이 단일 값으로 축소되어 전체 파라미터 수가 25배 줄어드는 것을 확인할 수 있습니다.

글로벌 평균 풀링의 장점


글로벌 평균 풀링은 각 특성 맵의 평균 값이 특정 특징의 존재 여부를 나타내는 점수를 제공한다고 볼 수 있습니다. 이는 분류기의 학습을 단순화하여 모델의 효율성을 크게 향상시킵니다.

car = next(ds_iter)

car_tf = tf.image.resize(car[0], size=[128, 128])
car_features = model(car_tf)
car_features = tf.reshape(car_features, shape=(16, 32))
label = int(tf.squeeze(car[1]).numpy())

plt.figure(figsize=(8, 4))
plt.subplot(121)
plt.imshow(tf.squeeze(car[0]))
plt.axis('off')
plt.title(["Car", "Truck"][label])
plt.subplot(122)
plt.imshow(car_features)
plt.title('Pooled Feature Maps')
plt.axis('off')
plt.show();

위 예시에서 자동차와 트럭의 특성 맵이 충분히 다르다면 글로벌 평균 풀링을 통해 분류할 수 있습니다. 각 특성 맵의 값은 특정 특징의 존재 여부를 나타내며, 이는 분류기를 쉽게 학습시킬 수 있게 합니다.

글로벌 평균 풀링은 현대 CNN에서 자주 사용되며, 모델의 파라미터 수를 줄이면서도 효과적인 분류를 가능하게 합니다. CNN을 설계할 때 글로벌 평균 풀링을 사용하는 것을 고려해보세요!

반응형

'컴퓨터공학 > 인공지능' 카테고리의 다른 글

Custom Convnets 특수 제작 Convnet  (79) 2024.08.14
Stride CNN, 보폭  (82) 2024.08.13
합성곱과 ReLU, Convolution  (64) 2024.08.06
CNN - Convolution Neural Networks  (85) 2024.08.05
이진 분류 Binary Classification  (82) 2024.08.03