딕셔너리 형태로 레이어들이 전달되는 구조,
cnn 연산의 수정,
데이터 입력, cnn 연산의 결과는 각 필터에 의해 cnn 연산이 이뤄진다.
때문에 처음 반복에서 필터의 개수만큼 이를 수행,
해당 필터에 해당하는 임의의 가중치를 생성,
입력 데이터 크기, 필터 크기, 스트라이드 값에 따라 연산 결과 크기를 미리 알 수 있다. 이에 맞는 패딩을 수행한다.
출력 이미지의 크기는
(W - 1) / s +1
# 각 필터별 연산 결과를 저장 리스트
filter_result_arr = []
# 출력 이미지의 크기
result_shape = int((data.shape[0] - 1) / stride) + 1
# 패딩이 수행된 입력 데이터의 크기
data_shape = (filter_size * (result_shape - 1)) + filter_size
# 입력 받은 필터의 개수만큼 반복
for filter in range(filter_count):
# 0으로 초기화된 합성곱 연산 결과 행렬
result_cnn = np.zeros((result_shape, result_shape))
# 필터 크기에 맞는 임의의 가중치 생성
weight = np.random.random(filter_size[0] * filter_size[1]).reshape(filter_size[0], filter_size[1])
# 입력 데이터의 패딩 수행
data = self.padding(data, data.shape[0] - data_shape)
# 합성곱 연산 수행
for col in range(result_shape):
for row in range(result_shape):
result = 0
for w_col in range(weight.shape[0]):
for w_row in range(weight.shape[1]):
result = result + data[col * stride + w_col][row * stride + w_row] * weight[w_col][w_row]
result_cnn[col][row] = result
# 연산 결과의 저장
filter_result_arr.append(result_cnn)
각 필터에 대한 연산결과가 filter_result_arr 에 저장,
해당 값을 모두 더하여 출력 데이터를 구한다.
for filter in range(filter_result_arr):
for col in range(filter.shape[0]):
for row in range(filter.shape[1]):
result_cnn[col][row] = result_cnn[col][row] + filter[col][row]
필터별 연산 결과의 합을 통해 cnn 연산 결과의 획득
# 입력 데이터의 차원 수 만큼의 반복
for dimension in range(data.shape[2]):
# 입력 받은 필터의 개수만큼 반복
for filter in range(filter_count):
# 0으로 초기화된 합성곱 연산 결과 행렬
result_cnn = np.zeros((result_shape, result_shape))
# 필터 크기에 맞는 임의의 가중치 생성
weight = np.random.random(filter_size[0] * filter_size[1]).reshape(filter_size[0], filter_size[1])
weight_arr.append(weight)
# 입력 데이터의 패딩 수행
data = self.padding(data, data.shape[0] - data_shape)
# 합성곱 연산 수행
for col in range(result_shape):
for row in range(result_shape):
result = 0
for w_col in range(weight.shape[0]):
for w_row in range(weight.shape[1]):
result = result + data[col * stride + w_col][row * stride + w_row] * weight[w_col][w_row]
result_cnn[col][row] = result
# 연산 결과의 저장
filter_result_arr.append(result_cnn)
result_cnn = np.zeros((result_shape, result_shape))
for filter in range(filter_result_arr):
for col in range(filter.shape[0]):
for row in range(filter.shape[1]):
result_cnn[col][row] = result_cnn[col][row] + filter[col][row]
'ml_framework' 카테고리의 다른 글
cnn 정리 (0) | 2023.05.11 |
---|---|
cnn 연산 수정 (0) | 2023.05.09 |
cnn(layer) (0) | 2023.05.04 |
gradient_descent(momentum) (0) | 2023.05.02 |
gradient_descent(1) (0) | 2023.05.02 |