2022.11.22 - [implement_ml_models] - implement_cnn
implement_cnn
합성곱 연산을 사용하는 신경망 row = [] matrix = [] for matrix_row in range(input.shape[0]-w.shape[0]+1): for matrix_col in range(input.shape[1]-w.shape[1]+1): matrix = [] for w_row in range(w.shape[0]): row = [] for w_col in range(w.shape[0]):
teach-meaning.tistory.com
패딩
패딩을 통해 입력 데이터 주변을 특정값으로 채울 수 있다.
입력의 커널에 대한 합성곱 연산 후 입력과 동일한 크기의 결과를 만들기 위한 패딩의 경우
위 연산 결과를 가져야 하며, 이항하여 padding_matrix 크기를 계산할 수 있다.
padding_matrix.shape[0] = input.shape[0] + w.shape[0] - 1
이 때, 패딩 값이 입력값 전체를 감싸는 것이 아닌, 가중치 커널, 입력의 크기에 따라 일부만을 감싸는데, 입력의 패딩 위치를 결정해야 한다. (상하좌우)
padding_matrix = np.zeros((input.shape[0]+w.shape[0]-1, input.shape[1]+w.shape[1]-1))
padding_matrix
>>>
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
input
>>>
array([[0.8383069 , 0.05095063, 0.62240076, 0.99743712],
[0.7950964 , 0.36897637, 0.79920073, 0.7719454 ],
[0.25481215, 0.75443591, 0.31732551, 0.48430807],
[0.54374886, 0.04103307, 0.72146801, 0.45896012]])
패딩 행렬을 생성 후 여기에 입력 값을 넣는 방식,
패딩 행렬에서의 입력값의 시작 위치를 결정하는 것이 패딩된 값의 위치를 결정하는 것,
입력값의 패딩 행렬에서의 시작 위치는 다음과 같이 정해진다.
for i in range(input.shape[0]):
for j in range(input.shape[1]):
padding_matrix[i+1][j+1] = input[i][j]
i, j 에 더하는 값의 변형을 통해 시작 위치를 정할 수 있다. 먼저 임의의 값 1로 지정했다.
padding_matrix
>>>
array([[0. , 0. , 0. , 0. , 0. ],
[0. , 0.8383069 , 0.05095063, 0.62240076, 0.99743712],
[0. , 0.7950964 , 0.36897637, 0.79920073, 0.7719454 ],
[0. , 0.25481215, 0.75443591, 0.31732551, 0.48430807],
[0. , 0.54374886, 0.04103307, 0.72146801, 0.45896012]])
연산 후 패딩이 좌상단에 위치한 것을 확인할 수 있다.
'implement_ml_models' 카테고리의 다른 글
implement_pooling (0) | 2022.11.22 |
---|---|
implement_stride (0) | 2022.11.22 |
implement_cnn (0) | 2022.11.22 |
implement_activation (0) | 2022.11.21 |
implement_multiLayerPerceptron (0) | 2022.11.21 |