- 2차원 배열에서 합성곱 수행
1차원과 유사하게 원본 배열의 왼쪽에서 오른쪽으로, 위에서 아래쪽으로 1칸씩 이둥
2차원 원본 배열 x, 미끄러지는 배열 w
원본 배열의 왼쪽 모서리 끝에 미끄러지는 배열을 맞추고 합성곱 수행
(1x2+2x0+4x0+5x0)
미끄러지는 배열을 옮기며 합성곱 수행(밸리드 패딩)
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
w = np.array([[2, 0], [0, 0]])
from scipy.signal import correlate2d
correlate2d(x, w, mode='valid')
##출력:
array([[ 2, 4],
[ 8, 10]])
세임 패딩의 경우 오른쪽과 아래쪽 모서리에 제로 패딩 추가
correlate2d(x, w, mode='same')
##출력:
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
스트라이드는 미끄러지는 방향 유지하면서 간격의 크기 변화
- 텐서플로로 합성곱 수행
합성곱 신경망의 입력은 일반적으로 4차원 배열
입력 이미지의 높이와 너비 외에 더 많은 차원이 필요
이를 4차원 배열로 표현하면 (2,3,3,3)
(배치, 샘풀의 높이, 샘플의 너비, 컬러 채널의 차원)
2차원 배열을 4차원 배열로 바꿔 합성곱 수행
스트라이드=1, 패딩=세임패딩
conv2d()의 함수 패딩 옵션은 대문자 사용
import tensorflow as tf
x_4d = x.astype(np.float).reshape(1, 3, 3, 1)
w_4d = w.reshape(2, 2, 1, 1)
c_out = tf.nn.conv2d(x_4d, w_4d, strides=1, padding='SAME')
c_out.numpy().reshape(3, 3)
##출력:
array([[ 2., 4., 6.],
[ 8., 10., 12.],
[14., 16., 18.]])
합성곱의 가중치 = 필터(filter), 커널(kernel)
8-2 풀링 연산
- 최대 풀링(max pooling)
풀링으로 최댓값을 고르는 방식
특성 맵 위를 스캔하며 최댓값을 고릅
풀링 영역의 크기는 보통 2x2 지정
스트라이드는 풀링의 한 모서리 크기로 지정
2x2 풀링은 특성 맵의 크기를 절반으로 줄임(면적 25%로)
- 평균 풀링(average pooling)
풀링 영역의 평균값을 계산
일반적으로 최대 풀링 >> 평균 풀링
평균 풀링은 합성곱층을 통과하는 특징들을 희석시킬 가능성이 높음
최대 풀링은 가장 큰 특징을 유지시키는 성질이 있어 이미지 분류 작업에 잘 맞음
- 최대 풀링 수행
x = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
x = x.reshape(1, 4, 4, 1)
p_out = tf.nn.max_pool2d(x, ksize=2, strides=2, padding='VALID')
p_out.numpy().reshape(2, 2)
##출력:
array([[ 6., 8.],
[14., 16.]], dtype=float32)
풀링층에는 학습되는 가중치가 없음
풀링은 비치 차원이나 채널 차원으로 적용되지 않음
풀링층을 통과하기 전후로 배치 크기와 채널 크기는 동일
※ 해당 내용은 <Do it! 딥러닝 입문>의 내용을 토대로 학습하며 정리한 내용입니다.
'딥러닝 학습' 카테고리의 다른 글
8장 이미지 분류 - 합성곱 신경망 (4) (0) | 2023.03.19 |
---|---|
8장 이미지 분류 - 합성곱 신경망 (3) (0) | 2023.03.18 |
8장 이미지 분류 - 합성곱 신경망 (1) (0) | 2023.03.16 |
7장 여러개를 분류 - 다중 분류 (3) (0) | 2023.03.15 |
7장 여러개를 분류 - 다중 분류 (2) (0) | 2023.03.14 |