본문 바로가기

implement_ml_models/CNN

implement_CNN(CNN_backpropagation_pooing)

2023.03.14 - [분류 전체보기] - implement_CNN(CNN_backpropagation)

 

implement_CNN(CNN_backpropagation)

2023.03.12 - [분류 전체보기] - implement_CNN(MLP_weight_update) implement_CNN(MLP_weight_update) 2023.03.12 - [분류 전체보기] - implement_CNN(back_propagation) implement_CNN(back_propagation) 2023.03.10 - [분류 전체보기] - implement_CNN(M

teach-meaning.tistory.com

풀링 후 (256, 4, 4) 크기의 노드별 delta 값을 얻을 수 있었고, 이를 역전파를 위해 풀링 이전의 크기인 (256, 7, 7)로 확장시켜야 한다.

각 커널은 입력의 변화량에 대한 비용 함수의 변화량으로, 맥스 풀링의 영역 (2,2) 에서 선택되지 않은 나머지 3개의 delta 값을 0으로 설정하거나, 동일하게 설정해줄 수 있을 것,

먼저 0으로 설정하는 방법의 사용,

이전 글에서 맥스 풀링의 결과에 해당하는 입력 데이터의 위치를 미리 알 수 있었다. 이를 활용하여 delta 값의 계산

a = cnn.pool.matching_pooling_result(cnn.layer_result[4][0], cnn.layer_result[5][0], 2)

len(a)
>>>
16

1번째 커널 결과의 최댓값의 위치를 얻을 수 있었다. 

해당 위치를 통해 알맞는 위치에 delta 값 대입

  def cal_delta_pooling(self):
    n = 0

    # 새로 저장되는 delta 값의 크기 계산
    kernel_delta = np.zeros(((self.layer_result[self.layer - len(self.delta) - 2][0]).shape[0] ** 2) * len(self.layer_result[self.layer - len(self.delta) - 1])).reshape(-1,1)

    # 커널의 개수만큼의 반복, 풀링 후 커널의 개수
    for i in range(len(self.layer_result[self.layer - len(self.delta) - 1])):
      # 커널별 최댓값의 위치를 탐색한다.
      max_position = self.pool.matching_pooling_result(cnn.layer_result[self.layer - len(self.delta) - 2][0], cnn.layer_result[self.layer - len(self.delta) - 1][0])

      for j in range(len(max_position)):
        # 추가되는 값의 위치 계산
        delta_position = (i * (self.layer_result[self.layer - len(self.delta) - 2][i]).shape[0] ** 2)
        delta_position = delta_position + (max_position[j][0] * (self.layer_result[self.layer - len(self.delta) - 2][i]).shape[0]) + max_position[j][1]

        kernel_delta[delta_position][0] = self.delta[len(self.delta) - 1][n]
        
        n = n + 1

    self.delta.append(kernel_delta)

먼저 새로 계산할 delta 값의 numpy 행렬을 그 크기에 맞게 계산한다. 그 크기는 pooling 연산 전 데이터 크기와 커널의 개수를 곱한 것

(256, 7, 7)

반복문 i

커널의 개수만큼 반복하여 각 커널 별 풀링된 데이터의 위치를 계산한다.

반복문 j

(256, 4, 4) 의 풀링 후 데이터를 (256, 7, 7) 에 올바른 위치에 넣기 위한 계산, 먼저 i 의 값은 (7,7), 49 만큼의 증가 후 행값과 7의 곱, 열의 값을 더한 것이 데이터가 들어갈 위치가 된다.

해당 위치에 이전 delta 값을 넣는다. 4096,1 에 저장된 값을 순서대로 저장, i 는 256, j 는 16, 0 ~ 4095 의 값대로 n 이 순차적으로 증가한다.

계산한 delta 값을 저장한다.

'implement_ml_models > CNN' 카테고리의 다른 글

implement_cnn (수정1)  (0) 2023.03.17
implement_CNN(CNN_backpropagation_cnn)  (0) 2023.03.16
implement_CNN(CNN_backpropagation)  (0) 2023.03.14
implement_CNN(MLP_weight_update)  (0) 2023.03.12
implement_CNN(back_propagation)  (0) 2023.03.12