본문 바로가기

딥러닝 학습

8장 이미지 분류 - 합성곱 신경망 (2)

반응형

- 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! 딥러닝 입문>의 내용을 토대로 학습하며 정리한 내용입니다.

반응형