CNN 기본개념

CNN(Convolutional Neural Network)란?

CNN(Convolutional neural network)는 전통적인 뉴럴 네트워크 앞에 여러 계층의 Convolutional Layer를 붙인 모양입니다.  Convolutional Layer를 통해서 입력 받은 이미지에 대한 특징(Feature)를 추출하게 되고, 추출된 특징을 바탕으로 기존의 Fully-connected Layer(일반적인 뉴럴네트워크)를 이용하여 이미지에 대한 분류(Classification)를 수행합니다. CNN structure는 아래 그림과 같습니다.

Convolutional Layer란?

Convolutional Layer는 입력된 이미지 데이터로부터 특징을 추출하는 역할을 수행합니다. Convolutional Layer에는 특징을 추출하는 기능을 하는 필터(Filter)와 이 필터의 값을 비선형 값으로 바꾸어 주는 Activation 함수(주로 ReLu함수를 사용)로 이루어져 있습니다.

  • Filter는 어떠한 특징이 테이터에 있는지 없는지 검출해주는 역할을 수행합니다. 예를 들어 밑의 사진과 같이 우상향하는 곡선을 검출해주는 필터가 존재한다고 가정을 해보겠습니다.(필터에 대한 설명을 위해 ‘https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner’s-Guide-To-Understanding-Convolutional-Neural-Networks/’ 에서 예시 사진을 가져왔습니다.)

  • 좌측은 우측의 우상향 그림을 행렬로 나타낸 것입니다.   input으로 들어가게되는 이미지는 아래와 같이 filter와 곱해지게 됩니다.  쥐 이미지를 input 데이터 사용하여 예시를 들어보겠습니다.

  • 해당 이미지의 좌측 상단의 이미지 부분을 잘라서 필터를 적용하게 됩니다.

  • 잘라낸 이미지는 가운데 행렬과 같이 나타내질 수 있고 이에 필터를 곱하게 되면 6600이라는 매우 큰 값이 나오게 됩니다.
  • 이번에는 쥐 그림에서 아래와같이 곡선이 없는 부분에 같은 필터를 적용해보겠습니다.

  • 위와 같은 방식으로 노란색 부분의 행렬값을 필터와 곱하게 되면 0이라는 값이 나오게 됩니다.
  • 즉 필터는 입력받은 데이터에서 그 특성을 가지고 있으면 결과 값이 크게 나오게 되고, 특성을 가지고 있지 않으면 결과 값이 0에 가까운 값이 나오게 되어 데이터가 해당 특성을 가지고 있는지 없는지를 파악할 수 있게 합니다.
  • 입력된 이미지들은 다양한 특징을 지니고 있기 때문에 여러개의 다중 필터가 적용됩니다. 아래와 같이 |, +, – 모양을 가지고 있는 이미지가 있습니다.

  • 해당 이미지들의 특성을 파악하기 위해 |(세로) 필터와 -(가로) 필터를 적용해 보겠습니다. 우선 |(세로)필터가 적용된 결과 이미지를 살펴보겠습니다.

  • 맨 왼쪽의 그림이 |(세로) 필터를 의미하고 나머지는 입력된 이미지에 해당 필터를 곱한 결과 값을 이미지로 출력한 것입니다. 결과 이미지를 살펴보면 세로선이 있는 경우(2,3,4,5,6,8,9번째)는 이미지에 세로선이 있고 세로선이 없는 경우(1,7번째)는 결과이미지에 출력이 거의 없는 것을 확인할 수 있습니다.
  • -(가로)필터 또한 마찬가지입니다.

  • 이번에는 가로선이 있는 경우(1,4,6,7번째)만 가로선이 출력되어 있고 나머지는 출력되지 않는것을 확인할 수 있습니다. 이렇게 각기 다른 특징을 추출하는 필터를 조합하여 input image 데이터의 특징을 추출해낼 수 있습니다.
  • 그렇다면 이 필터를 어떻게 원본 이미지에 적용하게 될까요?(어떻게 원본이미지를 잘라서 필터를 적용하게 될까요?) 아래 그림과 같이 5×5 원본 이미지가 있을때, 3×3인 필터를 적용하게 된다면 좌측 상단에서부터 왼쪽으로 한칸씩 그 다음 한줄을 내려서 또 왼쪽으로 한칸씩 적용해서 특징을 추출해냅니다(좌측 그림). 그 결과 우측 그림과 같은 행렬이 산출됩니다.

  • 이렇게 필터를 적용하는 간격값을 Stride라 하며, 필터를 통해 산출된 행렬을 Feature map이라고 합니다.
  • 위의 예시처럼 5×5 원본 이미지가 3×3의 1 stride 값을 가지고 적용되었을때, 결과 값은 3×3으로 작아지게 됩니다. CNN은 여러 filter layer 거쳐서 많은 filter들이 적용되기 때문에 특징을 추출하는 과정에서 처음에 비해 많은 특징들이 유실될 수 있습니다. 이를 방지하기 위해 padding이라는 기법을 사용하게됩니다.
  • padding은 결과 값이 작아지는 것을 방지하기 위해 입력이미지 주위 흰테두리를 그려넣는 것이라 생각하면 됩니다. 즉, 입력값 주위로 0값을 넣어서 입력 값의 크기를 인위적으로 키워 결과값이 작아지는 것을 방지하는 기법입니다.
  • 아래 그림을 살펴보면, 32x32x3 입력 값이 있을때, 5x5x3 필터를 적용시키면 feature map의 크기는 28x28x3이 됩니다. 여기에 padding을 적용하게 되면 input 계층 주위를 0값으로 둘러 싸서,  feature map이 작아지는 것을 막습니다. 32x32x3 입력값 주위로 2의 두깨 만큼 0을 추가하였기 때문에 36x36x3이 되고 5x5x3 필터를 적용하더라고, feature map의 크기는 32x32x3으로 기존의 크기와 같게 유지됩니다.

  • CNN에서 사용되는 필터는 학습과정에서 자동으로 특징을 인식하고 필터를 만들어내게 됩니다.

 

  • Filter를 통해 Feature map이 추출되었으면, 해당 특징이 ‘있다, 없다’의 비선형 값으로 바꿔주기 위해 Activation function을 적용합니다. Activation function으로는 Relu함수를 가장 많이 사용합니다(sigmoid를 사용할 경우 back propagation이 제대로 동작하지 않게됨).

 

Pooling Layer란?

convolutional layer를 거쳐 추출된 특징들은 필요에 따라 pooling(혹은 sub sampling)이라는 과정을 거치게 됩니다. Convolutional layer를 통해 어느정도 특징이 추출되었지만, 추출된 모든 특징을 고려하지 않습니다. 예를들어 고해상도의 사진(많은 특징을 지닌 데이터)을 보고 물체를 판별할 수 도 있지만, 저해상도의 사진(보다 적은 특징을 지닌 데이터)를 보고도 물체를 판별할 수 있는 원리입니다.

추출된 Feature map를 인위적으로 줄이는 작업을 하는데, 이를 pooling이라 하며 max pooling, average pooling, L2-norm pooling 등의 기법이 있으며 그중에서도 max pooling 기법이 많이 사용됩니다.

  • Max pooling은 Feature map을 MxN의 크기롤 잘라낸 후, 그 안에서 가장 큰 값을 뽑아내는 방법입니다. 아래의 예시 그림은 4×4의 feature map에서 2×2 max pooling filter를 stride 2로하여 적용한 예 입니다.
  • 좌측 상단 빨간색 부분에서는 6이 가장 큰 값이기 때문에 6, 우측 상단 초록색 부분에서는 8, 좌측하단 연노랑색 부분에서는 3, 우측 하단 파랑색 부분에서는 4 값이 추출됩니다.

  • 이런 Pooling 작업을 통해서 얻을 수 있는 장점은 아래와 같이 2가지가 있습니다.
  1.  전체 데이터의 사이즈가 줄어들어 연산에 들어가는 컴퓨팅 리소스를 줄일 수 있다.
  2. 데이터의 크기를 줄이면서 소실이 발생하기 때문에 오버피팅을 방지할 수 있다.

출처: 조대협블로그(http://bcho.tistory.com/1149), https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner’s-Guide-To-Understanding-Convolutional-Neural-Networks/, Sung Kim

답글 남기기