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 |