본문 바로가기

implement_ml_models/CNN

implement_CNN(CNN_backpropagation_cnn)

2023.03.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 - [분류 전체보기] - implement

teach-meaning.tistory.com

풀링층까지의 역전파에 의한 delta 값을 계산하였다.

계산한 delta 값은 (12544, 1) 의 크기를 가지며, 이는 합성곱 연산 후 데이터에 대한 변화량값이다.

합성곱 연산 전의 delta 값을 구하기위해서는 앞서 구한 delta 값에 데이터 입력값의 변화량에 대한 결과의 변화량,

즉 가중와의 연산을 통해 delta 를 업데이트 가능, (입력에 대한 미분값은 가중치 이므로)

cnn 연산에 사용된 가중치를 사용해 delta 값에 해당 가중치를 통한 cnn 연산을 수행한다.

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

먼저 일렬로 저장된 delta 값을 크기에 맞게 바꿔줘야 한다.

(12544,1) 의 형태로 저장되어 있고, (7,7) 크기의 delta 값이 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 : 현재 델타값을 불러온다. 마지막으로 저장된 delta 값의 호출

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

3 : 필터의 모양, 크기, (12544, 1) 의 형태에서 (256, 49) 의 계산, 49의 제곱근 7이 필터의 행과 열의 크기

4 : 필터의 개수만큼 합성곱 연산의 수행

5 : 현재 필터의 델타값 [0:49] , [49:98] , ... 의 저장

6 : 행렬 형태의 변환

7 : 해당 필터에 대한 가중치 저장

8 : 합성곱 연산 수행, 저장

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

implement_cnn (수정2)  (1) 2023.03.18
implement_cnn (수정1)  (0) 2023.03.17
implement_CNN(CNN_backpropagation_pooing)  (0) 2023.03.15
implement_CNN(CNN_backpropagation)  (0) 2023.03.14
implement_CNN(MLP_weight_update)  (0) 2023.03.12