딥러닝 합성곱 연산 (스트라이드, 패딩, 풀링) 알아보는 글

딥러닝 합성곱에 쓰이는 다양한 연산들

이번 글에서는 합성곱 연산 시에 모든 배열 원소가 동일한 참여도를 갖게 하는 방법을 알아보려고 합니다. 그 방법은 바로 풀 패딩입니다. 풀 패딩은 원본 배열 원소의 연산 참여량을 동일하게 합니다. 이때 패딩을 사용하는데 주로 사용되는 제로 패딩을 사용합니다. 제로 패딩은 끝과 끝을 0으로 채우는 작업을 말합니다. 이 제로 패딩의 개수를 적당하게 넣어준다면 배열의 모든 원소가 동일한 연산 참여량을 갖게 됩니다. 이런 식의 패딩 방법을 풀 패딩이라고 합니다. correlate 함수의 mode 베개 변수를 full로 설정만 하면 끝입니다. 그럼 결과로 출력되는 배열을 원본과 동일하게 해 주려면 어떻게 해야 할까요? 이때 사용하는 방법은 바로 세임 패딩입니다. 세임 패딩은 출력을 동일한 길이의 배열로 만들어줍니다. 역시 마찬가지로 mode를 same으로 설정하면 됩니다. 이때 합성곱 신경망에서 주로 사용하는 패딩 방법은 어떤 것일까요? 바로 세임 패딩입니다. 나머지 벨 리드와 풀 패딩의 경우에는 사용되지 않는 편입니다. 다음으로 알아볼 개념은 스트라이드입니다. 스트라이드는 한 계단 한 계단 올라가듯이 그 간격을 조정하는 파라미터입니다. 즉 지금까지 배열의 경우에는 한 칸씩 이동을 해왔지만 이간 격을 두 칸, 세 칸, 네 칸 등으로 조절하는 것을 말합니다. 합성곱 신경망은 보통 1을 지정해서 사용합니다. 지금까지는 1차원 배열을 에 시로 들며 설명을 했는데요? 이제부터는 2차원 배열에 합성곱을 진행하는 방법을 알아보고자 합니다. 비슷하지만 약간 다른 점이 있는데요? 2차원에 합성곱 배열을 데고서 왼쪽에서 오른쪽으로 위에서 아래로 내려가면서 연산을 해나면 됩니다. 사실 방향은 반대로 해도 상관없겠지만, 이와 같이 하는 것이 통념상 편하기 때문입니다. 이때 2차원 배열에도 세임 패딩을 지정할 수 있습니다. 지정 시에는 오른쪽, 아래 부분에 0을 전부 추가합니다. 스트라이드도 물론 지정이 가능합니다. 여기서 딥러닝의 개념을 조금 적용시켜보자면, 원본 배열을 입력, 움직이며 합성곱을 수행하는 배열을 가중치라고 부를 수 있습니다. 텐서 플로우에서 2차원 합성곱을 수행하는 함수는 conv2d()입니다. 입력값으로는 4차원 배열을 넘깁니다. 주로 R, G, B 컬러 채널을 가지므로 그런 이미지들이 여러 개 있을 경우에 4 채널이 되는 것입니다. 차원의 순서대로 보통 배치, 이미지 높이, 이미지 높이, 컬러 채널을 뜻하게 됩니다. 그러면 가중치는 어떨까요? 가중치도 마찬가지로 4 채널로 이루어져야 합니다. 차원의 순서대로 높이, 너비, 채널, 가중치의 수에 해당합니다. 일반적으로 입력 이미지의 채널과 가중치의 채널은 일치시키므로 채널 단위의 스트라이드는 이루어지지 않습니다. 텐서 플로우에서 사용되는 conv2d() 함수의 경우에는 리턴 값으로 텐서 플로의 Tensor 객체를 반환합니다. 사실 텐서는 다차원 배열입니다. 간단하게 넘 파이 매서드를 사용하면 텐서를 넘 파이식 배열로 변경 가능합니다. MNIST 데이터 셋에 있는 가로 세로 28 크기의 입력을 사용하고 가중치로는 삼 곱하기 삼 배열이나 오 곱하기 오 배열을 사용해서 합성곱 연산이 가능합니다. 다음에는 풀링이라는 개념 또한 필요합니다. 다른 곳에서는 가중치를 필터나 커널이라고 칭하기도 합니다만, 주로 케라스에서 가중치를 커널이라고 하죠. 이것을 혼동하지 마시기 바랍니다. 커널과 가중치는 같은 것이므로 기억하시기 바랍니다. 이번에 알아볼 것은 바로 풀링층입니다. 말 그대로 합성곱이 이루어지는 곳을 합성곱층, 풀링이 이루어지는 곳을 풀링층이라고 호칭합니다. 합성곱 그리고 풀링층에서 만들어진 결과물을 특성 맵 즉, 피쳐 맵이라고 부릅니다. 생성된 특성 맵은 계속해서 합성층과 풀링층을 통과하면서 또 다른 특성 맵으로 진화합니다. 이때 풀링층이 하는 역할은 그저 평균값을 계산하거나 최댓값을 고르게 됩니다. 그것이 바로 맥스 풀링 연산입니다. 특성 맵을 돌면서 가장 큰 값을 꺼내오는 연산이죠. 맵이 줄어들면 있는 장점이 하나의 원소가 큰 부분을 커버할 수 있다는 점입니다. 또 다른 방법은 평균값을 내는 풀링 방법입니다. 말 그대로 값의 모든 평균을 내서 뽑아냅니다. 전문가들은 보통 평균보다는 최대를 많이 씁니다. 이미지를 분류할 때는 특히나 최대 풀링을 많이 쓴다고 하니 참고하시기 바랍니다. 이때 텐서 플로우의 max_pool2 d() 함수를 사용하시면 됩니다. 중요한 점은 풀링층은 가중치가 포함되지 않는다는 점입니다. 풀링은 배치나 채널 차원으로 적용되지 않으며 각 채널마다 독립적으로 적용됩니다. 여기까지 합성곱 신경망에서 사용하는 패딩, 풀링, 스트라이드 등을 알아보았습니다. 하지만 더 알아야 할 것이 수두룩 합니다. 앞으로 이 블로그를 통해서 딥러닝에 관련한 내용을 자주 올려드리려고 하니 자주 방문하셔서 좋은 팁들 얻어가셨으면 좋겠습니다. 공부를 해도 해도 끝이 없기 때문에 정말 노력해서 하지 않으면 남들과 뒤쳐지게 됩니다. 노력을 하면 나중에 꼭 보상이 달려옵니다. 멀리서 대포를 쏘듯이 날아옵니다. 여러분도 무조건 할 수 있습니다. 누가 했으면 여러분도 그냥 할 수 있습니다. 자기 본인 자신을 믿고 따라오세요. 저도 힘든 시간들을 많이 겪고 지금도 사실 힘든 시간들을 보내고 있습니다만, 어디 이 세상에 힘들지 않은 영혼이 있을까요? 다 힘들고 지쳐있는 세상에 서로 돕고 열심히 살아봅시다. 그럼 파이팅입니다.

Leave a Comment