implement_CNN(CNN_backpropagation_cnn)

2023년 3월 15일 – (모든 범주 표시) – implement_CNN(CNN_backpropagation_pooing)

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 – (모든 범주 표시) – 구현

티스토리-의미.tistory.com

풀링 레이어로의 역전파에 의한 델타 값이 계산되었습니다.

계산된 delta 값은 (12544, 1)의 크기를 가지며, 이는 convolution 연산 후 데이터의 변화량입니다.

컨벌루션 연산 이전에 델타 값을 구하기 위해서는 데이터 입력 값의 변화량 결과의 변화량이 이전에 구한 델타 값이 되며,

즉, 가중치에 대한 연산으로 델타를 업데이트할 수 있습니다(입력의 미분이 가중치이므로).

cnn 연산에 사용된 가중치를 이용하여 델타 값의 적절한 가중치만큼 cnn 연산을 수행합니다.

이러한 과정을 통해 각 입력 값에 대한 입력 변화에 대한 비용 함수의 변화량을 구할 수 있다.

먼저 하나씩 저장된 델타 값을 크기에 맞게 조정해야 합니다.

(12544,1)의 형태로 저장되며 크기(7,7)의 델타값 256개가 저장된다.

  # delta 값 계산을 위한 cnn 연산
  def delta_cnn(self, weight):
    # 각 필터별 연산 결과를 저장 리스트
    filter_result_arr = ()

    # 현재 델타값
    delta = self.delta(len(self.delta) - 1)

    # 필터의 개수
    filter_count = len(weight)

    # 필터의 모양양
    filter_shape = int((len(delta) / filter_count) ** (1/2))

    # 필터의 개수만큼 반복
    for i in range(filter_count):
      # 현재 필터의 델타값
      filter_delta = delta(int(i * (len(delta) /filter_count)): int((i+1) * (len(delta) /filter_count)))
      
      # 델타값의 모양을 합성곱 연산에 맞게 바꿔준다.
      filter_delta = filter_delta.reshape(filter_shape, -1)

      # 합성곱 시 padding 을 수행했을 경우 역전파 계산에서도 padding 의 수행
      filter_delta = self.pad.padding(filter_delta, int(filter_shape))

      # 현재 필터의 가중치
      filter_weight = weight(i)

      # 합성곱 연산 결과의 저장
      result_arr = ()

      # 합성곱 연산 수행
      for col in range(filter_shape):
        for row in range(filter_shape):
          result = ()
          for w_col in range(filter_weight.shape(0)):
            for w_row in range(filter_weight.shape(1)):
              result.append(filter_delta(col + w_col, row + w_row) * filter_weight(w_col, w_col))
          result_arr.append(np.sum(result))

      # 연산 결과를 크기에 맞게 변경
      result_arr = np.array(result_arr).reshape(filter_shape, -1)

      filter_result_arr.append(result_arr)
    
    # 결과의 저장
    self.delta.append(filter_result_arr)

1 : 현재 델타 값을 로드합니다. 마지막으로 저장된 델타 값 가져오기

2: 필터의 개수는 가중치 행렬의 개수,

3: 필터의 모양과 크기, (12544, 1)의 형태로 (256, 49)의 계산, 49 7의 제곱근은 필터의 행과 열의 크기입니다.

4: 필터 개수만큼 컨볼루션 연산 수행

5 : 현재 필터의 델타 값 저장 (0:49) , (49:98) , …

6: 매트릭스 형태의 변환

7: 이 필터의 가중치 저장

8: 컨볼루션 작업 수행 및 저장