이번 포스트에서는 지난 포스트(CNN-합성곱 계층 구현)에 이어서
2020/07/28 - [Computer Science/Deep Learning] - [비전공자용] [Python] CNN(합성곱 신경망) - 합성곱 계층 구현
CNN에서의 풀링 계층을 Python으로 구현해보려 합니다.
여기서는 코드를 구성하는 것만 다루기 때문에 개념적으로 공부하고 싶으신 분들은 아래 포스트를 참고해주세요.
2020/07/10 - [Computer Science/Deep Learning] - [비전공자용]합성곱 신경망 (CNN) - 합성곱 계층 & 풀링 계층
2. 풀링 계층 구현
합성곱 계층과 마찬가지로 풀링 계층에서도 im2col 함수를 사용해서 입력 데이터를 전개합니다.
하나 차이점이 있다면, 풀링 계층에서는 채널 쪽이 독립적이라는 점입니다. 아래 그림과 같이 풀링 적용 영역을 채널마다 독립적으로 전개합니다.
전개한 행렬에서 행 별 MAX 최댓값 구해서 적절히 reshape하여 형상을 바꿔주면 된다. (아래 이미지 참고)
결국 이렇게 3 단계를 거쳐서 풀링 계층을 구현할 수 있다.
-
1. 입력 데이터를 전개한다.
-
2. 행별 최댓값을 구한다.
-
3. 적절한 모양으로 형상을 변환한다.
이제 Python 코드로 구현해봅시다.
class Pooling:
def __init__(self, pool_h, pool_w, stride=1, pad=0):
self.pool_h = pool_h
self.pool_w = pool_w
self.stride = stride
self.pad = pad
self.x = None
self.arg_max = None
def forward(self, x):
N, C, H, W = x.shape
out_h = int(1 + (H - self.pool_h) / self.stride)
out_w = int(1 + (W - self.pool_w) / self.stride)
col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
col = col.reshape(-1, self.pool_h*self.pool_w)
arg_max = np.argmax(col, axis=1)
out = np.max(col, axis=1)
out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)
self.x = x
self.arg_max = arg_max
return out
def backward(self, dout):
dout = dout.transpose(0, 2, 3, 1)
pool_size = self.pool_h * self.pool_w
dmax = np.zeros((dout.size, pool_size))
dmax[np.arange(self.arg_max.size), self.arg_max.flatten()] = dout.flatten()
dmax = dmax.reshape(dout.shape + (pool_size,))
dcol = dmax.reshape(dmax.shape[0] * dmax.shape[1] * dmax.shape[2], -1)
dx = col2im(dcol, self.x.shape, self.pool_h, self.pool_w, self.stride, self.pad)
return dx
forward 처리에서 np.max(col, axis=1)는 인수로 축을 지정할 수 있고, 이렇게 지정한 축마다 최댓값을 구할 수 있게 한다. 즉, 입력 col의 행별(가로 방향)로 최댓값을 구한다는 의미이다.
axis=0 이라고 쓰면 열 방향으로 최댓값을 구한다는 의미이다.
여기까지 CNN 합성곱의 풀링 계층 구현 방법에 대해서 알아보았다.
다음 포스트에서는 합성곱 계층과 풀링 계층 코드를 합쳐서 CNN을 최종적으로 구현하고 이미지를 직접 넣어서 테스트해볼 것이다.
2020/07/28 - [Computer Science/Deep Learning] - [비전공자용] [Python] CNN 합성곱 신경망 구현하기
<모든 코드는 아래 출처를 바탕으로 작성하였다.>
[출처] Deep Learning from Scratch, ゼロ から作る
'Computer Science > Deep Learning' 카테고리의 다른 글
[비전공자용] CNN (합성곱 신경망)에서 필터를 적용한다는 것의 의미 이해하기 (0) | 2020.07.29 |
---|---|
[비전공자용] [Python] CNN 합성곱 신경망 구현하기 (4) | 2020.07.28 |
[비전공자용] [Python] CNN(합성곱 신경망) - 합성곱 계층 구현 (2) | 2020.07.28 |
[비전공자용]합성곱 신경망 (CNN) - 합성곱 계층 & 풀링 계층 (2) | 2020.07.10 |
[비전공자용] [Python] 하이퍼파라미터 최적화 Hyperparameter Optimization (0) | 2020.07.10 |