수학/딥러닝 이론

[딥러닝] 합성곱 신경망(CNN) - 풀링 계층 구현하기

AI 꿈나무 2020. 10. 5. 20:54
반응형

사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다.

 


 

 

[딥러닝] 합성곱 신경망(CNN) - 합성곱 계층 구현하기

사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다. 을 공부하고 정리해보았습니다. 을 공부하고 정리해보았습니다. 을 공부하고 정리해보았습니다. 을 공부하고 정리��

deep-learning-study.tistory.com

 이전에는 합성곱 계층을 구현하는 방법에 대해 알아보았습니다.

 이번에는 풀링 계층을 구현하는 방법에 대해 알아보겠습니다.

 

풀링 계층 구현하기

 풀링 계층 구현도 합성곱 계층과 마찬가지로 im2col을 사용해 입력 데이터를 전개합니다.

 단, 풀링의 경우엔 채널 쪽이 독립적이라는 점이 합성곱 계층 때와 다릅니다.

 구체적으로는 아래 그림과 같이 풀링 적용 영역을 채널마다 독립적으로 계산합니다.

 

입력 데이터에 풀링 적용 영역을 전개 (2 X 2 풀링의 예)

 

 일단 이렇게 전개한 후, 전개한 행렬에서 행별 최댓값을 구하고 적절한 형상으로 성형하기만 하면 됩니다.

 

풀링 계층 구현의 흐름 : 풀링 적용 영역에서 가장 큰 원소는 회색으로 표시

 

 이상이 풀링 계층의 forward 처리 흐름입니다.

 이를 파이썬으로 구현해보겠습니다.

 

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
        
    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)
        
        # 전개 (1)
        col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
        col = col.reshape(-1, self.pool_h * self.pool_w)
        
        # 최댓값 (2)
        out = np.max(col, axis=1)
        
        # 성형 (3)
        out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)
        
        return out

 

 풀링 계층 구현은 아래와 같이 세 단계로 진행합니다.

 

1. 입력 데이터를 전개한다.

2. 행별 최댓값을 구한다.

3. 적절한 모양으로 성형한다.

 

반응형