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 |