-
Convolution Layers with Multiple Channel | Pooling, Striding, Padding | 패스트캠퍼스 챌린지 05일차딥러닝 2022. 1. 28. 21:42
RGB 채널 등으로 색상 정보를 가진 이미지--즉, (n_H x n_W x n_C)의 이미지 텐서--의 경우에도 마찬가지 원리로 convolution 연산이 적용된다. 이 때, 커널(필터)는 (f x f x n_C)의 크기를 가지고, 편향 b는 실수 스칼라이다. 이를 거친 A는 (n'_H x n'_W)의 크기를 가지게 되는데, 이 떄 n'_H = n_H - f +1, n'_W = n_W - f +1이다. 즉, 이미지 크기가 (4 x 4 x 3)이고, 커널 크기 f = 3이라면, 커널은 (3 x 3 x 3)의 크기를 가지게 되고, 이를 거친 A는 4 - 3 + 1 = 2이므로 (2 x 2)의 크기의 텐서가 된다. 여기서 주목할 점은 n_C가 날아간다는 점인데, 이는 윈도우나 커널이 채널에 거쳐서 적용되어서 그렇다고 이해했다.
본격적으로 convolution layer를 구축할 때면 dense layer에서 인공 뉴런이 여러개 적용되었듯 여러개의 kernel이 적용될 수 있다. L_1개 만큼의 커널이 있다고 하자(위에 필기에서는 길이로 l을 썼지만, 너무 헷갈려서 여기서는 L로 길이를 나타내도록 한다). 입력되는 채널의 수가 L_I 만큼 있다고 하면(Input의 I다. 제법 헷갈린다), 입력 이미지 텐서는 (n[I]_H x n[I]_W x L_I)의 크기를 가지게 된다. 각 커널의 크기는 위와 같은데 그런 커널이 L_1개가 있으므로 커널들은 (f[1] x f[1] x L_I x L_1)의 텐서가 된다. 편향또한 마찬가지로 1차원의 텐서가 L_1개 있으므로 (1 x L_1)의 텐서다. 이를 거치면 결과 A[1]은 (n[1]_H x n[1]_W x L_1)의 텐서가 된다. 이 때, n[1]_W = n[I]_W - f[1] + 1이며, n[1]_H도 마찬가지로 계산된다.
미니배치로 N개 만큼의 이미지가 들어가서 입력 텐서 X의 크기가 (N x n[I]_H x n[I]_W x L_I)가 된다 해도 동일한 파라미터가 N번 적용되는 것이므로 커널들과 편향들의 크기는 위와 같고, 다만 결과 A[1]만 (N x n[1]_H x n[1]_W x L_1)의 텐서가 된다.
이러한 Convlution Layer를 실제로 구현할때는 pooling과 같은 다른 기법들도 같이 사용된다. Pooling은 convolution과 같이 이미지 텐서를 입력받아 windowing을 시켜 값을 계산하는 작업이지만, 훈련되는 파라미터를 가지는 convolution과는 달리 최댓값 하나만 내보내거나 전체 윈도우의 평균 하나만을 내보내는 연산을 진행한다. 이들이 각각 max pooling과 average pooling이다. 결과값은 1차원 실수 텐서이다. 채널이 여러개 있을 경우 각 풀링은 채널 단위가 아니라 이미지 단위로 적용된다. 즉, 3개의 채널이 있을 때 풀링은 2차원 단면 하나 하나에 적용되므로, 미니배치 사이즈까지 고려해서 (N x n_H x n_W x n_C)의 입력 이미지 텐서가 크기가 f인 풀링을 거치면 (N x n'_H x n'_W x n_C)의 텐서가 되며, 이 때 n'_H = n_H - f + 1이고 n'_W도 마찬가지다.
패딩과 스트라이딩은 보다 직관적인 개념이다. (제로)패딩은 이미지 텐서의 가장자리에 0을 덧붙이는 과정이다. 패딩 사이즈 p에 따라 0을 여러겹 쌓을 수 있다. 이렇게 하면 p = (f-1)/2일 때 입력과 출력 이미지의 크기가 유지된다는 장점이 있으며, 원래 모서리 부분이었던 부분의 정보 또한 잘 표현할 수 있게 된다. 스트라이딩은 윈도우를 한 칸 씩 움직이는 게 아니라 s칸 만큼 움직이는 것을 뜻한다. 즉, s=2라면 x축으로 0, 1, 2, 3, ..., (n_W - f)만큼 움직이는 것이 아닌, 0, 2, 4, ...와 같이 움직이게 된다.
p만큼 패딩을 하고 s만큼 스트라이딩을 한 크기 f의 windowing 결과는 다음과 같다: n'_H = [(n_H + 2p - f)/s + 1], n'_W = [(n_W + 2p - f)/s + 1]. 이 때, [x] 기호는 바닥함수를 뜻하는데, 즉 x보다 크지 않은 최대의 정수를 내보내는 것으로, 이는 s로 나눈 것이 꼭 정수로 맞아떨어지지 않을 수 있기 때문이다. n_H + 2p - f라는 식은 지금까지 봐 왔던 n_H - f에 풀링을 더한 것이다. 즉, 1차원으로 잘랐을 때 풀링한 결과의 사이즈는 풀링 사이즈 p의 두 배 만큼이기 때문에(풀링이 좌우 혹은 상하에 있으므로), + 2p를 해 준 다음 윈도우 사이즈만큼 자른다. 이를 스트라이드 값 만큼 나눈 다음에, 1을 더해 차를 조정해 주는 것이다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다. https://bit.ly/37BpXi
'딥러닝' 카테고리의 다른 글
역방향전파(Backpropagation) | 패스트캠퍼스 챌린지 07일차 (0) 2022.01.30 Convolutional Neural Networks | 패스트캠퍼스 챌린지 06일차 (0) 2022.01.29 Convolution Layers | 패스트캠퍼스 챌린지 04일차 (0) 2022.01.27 Loss functions: MSE, BCE, CCE | BLAS 문제를 만나다 | 패스트캠퍼스 챌린지 03일차 (0) 2022.01.26 Activation Functions: Sigmoid & Softmax | 패스트캠퍼스 챌린지 02일차 (0) 2022.01.25