
Convolutional layer에서 추출된 feature map의 크기가 너무 커지게 되면 연산량이 급증하여 학습 자체가 불가능해질 수 있기 때문에, pooling layer (풀링층)에서 feature map의 크기를 줄인다

같은 색깔로 칠해져있는 칸에서 가장 큰 값을 리턴한다.
import cv2
import numpy as np
from google.colab.patches import cv2_imshow # Colab 전용
# Max Pooling 함수 정의
def max_pooling(img, pool_size=2, stride=2):
"""
Max Pooling 구현.
Parameters:
img (ndarray): 입력 2D 배열 (그레이스케일 이미지).
pool_size (int): 풀링 커널 크기 (기본값: 2).
stride (int): 풀링 스트라이드 크기 (기본값: 2).
Returns:
ndarray: Max Pooling 결과 이미지.
"""
height, width = img.shape
out_h = (height - pool_size) // stride + 1
out_w = (width - pool_size) // stride + 1
out_img = np.zeros((out_h, out_w), dtype=np.uint8)
for y in range(out_h):
for x in range(out_w):
out_img[y, x] = np.max(
img[y * stride : y * stride + pool_size,
x * stride : x * stride + pool_size]
)
return out_img
# 이미지 불러오기
img_path = '/content/sample_data/flower.jpg' # 이미지 경로
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 그레이스케일로 읽기
# Max Pooling 적용
pooled_img = max_pooling(img, pool_size=2, stride=2)
# 결과 출력
print("원본 이미지 크기:", img.shape)
print("Max Pooling 결과 이미지 크기:", pooled_img.shape)
print("원본 이미지")
cv2_imshow(img)
print("Max Pooling 적용 결과")
cv2_imshow(pooled_img)

✅ 공간적 크기가 줄어든 걸 확인할 수 있다!!

같은 색깔로 칠해져 있는 칸의 평균값을 리턴한다
import cv2
import numpy as np
from google.colab.patches import cv2_imshow # Colab 전용
# Average Pooling 함수 정의
def average_pooling(img, pool_size=2, stride=2):
"""
Average Pooling 구현.
Parameters:
img (ndarray): 입력 2D 배열 (그레이스케일 이미지).
pool_size (int): 풀링 커널 크기 (기본값: 2).
stride (int): 풀링 스트라이드 크기 (기본값: 2).
Returns:
ndarray: Average Pooling 결과 이미지.
"""
height, width = img.shape
out_h = (height - pool_size) // stride + 1
out_w = (width - pool_size) // stride + 1
out_img = np.zeros((out_h, out_w), dtype=np.uint8)
for y in range(out_h):
for x in range(out_w):
# 영역 내 평균 계산
out_img[y, x] = np.mean(
img[y * stride : y * stride + pool_size,
x * stride : x * stride + pool_size]
)
return out_img
# 이미지 불러오기
img_path = '/content/sample_data/cat.jpg' # 이미지 경로
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 그레이스케일로 읽기
# Average Pooling 적용
pooled_img = average_pooling(img, pool_size=2, stride=2)
# 결과 출력
print("원본 이미지 크기:", img.shape)
print("Average Pooling 결과 이미지 크기:", pooled_img.shape)
print("원본 이미지")
cv2_imshow(img)
print("Average Pooling 적용 결과")
cv2_imshow(pooled_img)

✅ 공간적 크기가 줄어든 걸 확인할 수 있다!! (max pooling이랑 average pooling이랑 같은 사진을 썻더니 같은 값이 나와서;; 사진 교체)