2023년 3월 15일 – (모든 범주 표시) – implement_CNN(CNN_backpropagation_pooing)
풀링 레이어로의 역전파에 의한 델타 값이 계산되었습니다.
계산된 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: 컨볼루션 작업 수행 및 저장