AI & BigData/모두를 위한 딥러닝(정리)

딥러닝(DeepLearning) #7_CNN(Convolutional Neural Networks) introduction

Tigercow.Door 2018. 5. 3. 17:28


안녕하세요. 문범우입니다.

이번포스팅에서는 Convolutional Neural Networks에 대해 알아보도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/



1. Convolutional Neural Networks


이번 포스팅에서 사용되는 슬라이드는 대부분 위의 사진에 나와 있는 주소에서 가져오게 되었습니다.




우리가 알아볼 Convolutional Neural Networks의 기본적인 개념은 고양이 실험에서 시작되었습니다.


고양이에게 어떤 이미지를 보여줬더니, 그림을 읽어들이는 뉴런들이 동시에 동작하는 것이 아니라, 특정 그림의 특정 부분에 대해서만 동작하는 것을 알게 되었습니다.


즉, 고양이가 이미지의 입력을 나누어서 받아 뉴런에서 나누어진 입력들을 처리하게 된 것이죠.


하나의 레이어씩 어떻게 처리되는지 조금 더 자세히 살펴보도록 하겠습니다.


위와 같이 32x32x3 형태의 이미지(또는 벡터)가 존재합니다.

이때 32x32는 크기라고 가정하고, 3은 이미지의 색상의 종류라고 생각해보겠습니다.

그리고 위에서 이야기했던 것과 같이 이미지에 대해 전체적으로 처리하는 것이 아니라, 아래와 같이 빨간색 부분과 같이 일부분을 처리합니다.


이러한 일부분을 우리는 filter라고 부르는데 이 필터의 형태는 우리가 정할 수 있습니다. 예외적으로 이미지의 대한 색의 종류, 3은 고정시키고 단순히 크기에 대한 형태만 우리가 지정할 수 있습니다.

그럼 이 필터는 전체 이미지의 5x5의 영역만 읽어들이게 됩니다.

그리고 그 영역을 읽어서 하나의 숫자를 뽑아내게 됩니다.

이것이 필터의 역할입니다.

근데 이것을 어떻게 하나의 값으로 만들어낼 수 있을까요?

그것은, 위의 사진에서 나온것과 같이 우리가 자주 사용하던 Wx+b 의 형태를 이용해서 하나의 값을 뽑아냅니다.

그리고 여기서 W는 우리가 어떤 영역에 대해서 하나의 숫자를 만들어내는데 사용되는 필터의 값이라고 생각하면 되겠습니다.

그리고 이렇게 결정된 W에 대해서 변하지 않도록 고정하고 전체의 이미지를 훑도록 합니다. 즉 아래와 같이 하나의 필터가 전체의 이미지를 스캔합니다.

위의 그림에서 빨간색, 파란색, 초록색 테두리를 가진 것과 같이 하나의 필터를 한칸 또는 그 이상씩 이동시키며 전체 이미지를 확인합니다.


그럼 위의 그림을 예시로 생각해보면 전체 9x9 의 형태에서 3x3 형태의 필터를 사용하는데 위와 같이 한칸씩 움직이면서 하나의 값을 뽑아내게 되면 뽑아낸 값들은 어떤 형태를 가지게 될까요?

결과값들은 7x7 형태를 가지게 될 것입니다.

이때 우리가 한칸씩 필터를 움직이게 됬는데, 이때 움직이는 크기를 stride라고 합니다. 즉, stride를 2로 설정해보면 아래와 같이 2칸씩 필터가 움직이면서 전체 이미지를 읽게됩니다.



그리고 위와 같이 stride를 2로 설정한다면, 전체 결과의 형태는 4x4 형태를 가지게 될 것입니다.


이를 전반적으로 살펴보면, 우리가 NxN형태의 이미지에서 FxF형태의 필터를 이용했을때 stride 설정하면 위와 같은 식으로 output size를 알아낼 수 있습니다.

그리고 위의 사진에서 stride 를 3으로 설정했을때와 같이 정수로 나누어 떨어지지 않을때는 그 필터의 형태나 stride를 사용할 수 없는 것 입니다.


그런데, 이렇게 사용하게 되면 기본 이미지보다 output 의 size가 작아지면서 어떤 정보가 사라지는 등의 문제가 발생할 수 있습니다.

이를 막기 위해서 우리가 사용하는 방법은 padding이라는 개념입니다.



위의 사진과 같이 기본이미지의 모서리에 0이라는 값으로 채워주는 것을 padding 이라고 합니다.

이렇게 하는 이유는, 이미지의 형태가 급격하게 작아지는 것을 막기 위한 이유와, 이미지의 모서리임을 알려주는 이유 두가지가 있습니다.


위의 사진에서 pad를 1 pixel로 설정하여 output size를 확인해보면 7x7 이 나오게 됩니다. 즉 입력 이미지와 출력 이미지의 size가 같게 됩니다.


지금까지 알아본 것이 기본적으로 하나의 Convolution layer를 만드는 방법입니다.


그리고 이러한 방법을 이용하여 위의 사진과 같이 여러개의 레이어를 만듭니다. 이때 새롭게 이용되는 filter는 이전의 filter와 W의 값이 다를 것 입니다.



그리고 이것을 한개, 두개의 레이어만 만들 것이 아니라 위와 같이 여러개의 레이어를 만듭니다. 그리고 각 레이어의 W값이 다르기 때문에 각 레이어의 값이 서로 다를 것입니다.

그리고 이렇게 만들어진 레이어들의 형태, (?, ?, ?)에서 마지막 세번째 값을 그 레이어의 숫자가 됩니다.


즉 여러개의 레이어를 만들면서 그 결과를 통해 또 다른 레이어를 만들면서 위와 같은 Convolution layers를 만들 수 있습니다.


728x90