본문 바로가기

ML & AI/supervised

[알고리즘] 컨볼루션 신경망(CNN, Convolution Neural Network)

CNN은 이미지(영상)를 분석하기 위한 패턴을 찾아 이를 직접 학습하고, 학습한 패턴을 이용하여 이미지를 분류한다. CNN은 Convolution Layer, Pooling Layer(Sub Sampling), Fully Connected Layer 를 사용하여 사람의 시각처리방식을 모방한 딥러닝 학습 모델이며, 이미지(영상) 분류에 적합한 딥러닝 모델이다.

 

Convolution Layer는 이미지의 특징점을 찾기 위해 사용되고, Pooling Layer는 이미지 처리에 필요한 가중치와 연산량을 줄이기 위해 사용되며, Fully Connected Layer는 이미지를 분류하기 위해 사용된다.

 

1. Convolution Layer

컨볼루션 레이어는 입력 이미지를 특정 Filter(Kernel)를 이용하여 탐색하면서 이미지의 특징들을 추출하고, 추출한 특징들을 Feature Map으로 생성한다. 피처맵은 필터가 전체 이미지를 Stride하며 모든 픽셀과 연산을 거쳐 나온 결과값이며, 필터의 크기와 같다.

CNN 합성곱

위의 그림에서 이미지는 4x4 크기이고, 필터는 2x2 로 표시했다. 필터가 전체 이미지를 탐색하기 위해 Stride=2 만큼 이동한다고 가정한 그림이다. 결과적으로 2x2 크기의 피처맵이 만들어졌다. 

피처맵의 각 픽셀(노란색, 파란색, 초록색, 붉은색)은 필터가 입력 이미지를 4번 Stride하면서 입력 이미지의 픽셀값과 필터값을 연산(합성곱)한 결과를 표시한 것이다. (예 : 피처맵의 노란색 픽셀의 값, 15 = (0x1)+(1x0)+(5x1)+(5x2))

CNN은 이런 컨볼루션 레이어를 여러 번 중첩해서 사용하는데, 이 경우 필터로 인하여 입력 이미지의 결과가 너무 작아지는 문제가 발생한다. 이를 방지하기 위해 Padding이라는 기법을 사용한다.

 

패딩은 입력 이미지의 가장자리를 특정 값으로 채운 픽셀들을 추가함으로써 필터 적용 후 출력 이미지의 크기가가 입력 이미지의 크기와 비슷해지도록 만드는 효과를 준다.

zero-padding 적용 예시

입력 이미지에 패딩(회색부분)을 적용하여 컨볼루션 레이어를 적용하면 위 그림과 같이 출력 이미지의 크기가 입력 이미지와 비슷해짐을 알 수 있다.

 

결과적으로 컨볼루션 레이어는 필터를 이용하여 단일 픽셀의 특징을 추출하는 것이 아닌 필터 범위 내의 여러 픽셀들의 연산(합성곱)을 통해 주변 픽셀과의 연관관계까지를 고려하여 특징을 추출할 수 있는 장점을 가진다.   

 

[참고] 필터에 적용하는 활성함수(Activation Funtion)

  • Step Funtion
  • Sigmoid Function
  • Tanh Function
  • Relu Function

 

2. Pooling Layer

풀링 레이어는 컨볼루션 레이어 다음에 주로 배치되는 레이어다. 컨볼루션 레이가 필터를 이용하여 입력 이미지로 부터 특정 범위의 값을 압축(연산)하여 특징을 추출하는 방법이라면, 풀링 레이어는 범위 내의 픽셀 중 대표값을 추출하는 방식으로 특징을 추출한다. 풀링 레이어에서 Max Pooling, Average Pooing, Min Pooling 세 가지 방식으로 대표값을 추출할 수 있다.

컨볼루션 레이어는 패딩을 통해 출력 이미지의 크기를 보존하지만 풀링 레이어는 범위 내 대표값을 추출하기 때문에 출력 이미지의 크기가 작아질 수 밖에 없다. 만약 16x16 이미지를 4x4 로 변경하면 이미지의 품질은 떨어지게 되지만 하나의 픽셀로 부터 형태를 분석하기에는 수월해지는 장점이 있다. 즉 풀링 레이어는 이미지의 크기를 적절히 줄이면서 특정 Feature를 강조할 수 있는 장점을 가진다. 

풀링을 통한 대표값 추출 예시

 

위 그림을 간략히 정리하자면 Max Pooling 에서의 20(좌측 상단, 붉은색)은 입력 이미지의 좌측 상단(2x2) 붉은색 픽셀 중 가장 큰 값이며, Average Pooling 에서의 13(좌측 상단, 붉은색)은 입력 이미지 붉은색 범위의 평균값이다.

 

 

3. Fully Connected Layer

Fully Connected Layer(이하 FCL)은 이미지를 분류하는 인공신경망이다. 예전에는 이미지 인식/분류를 위해 FCL만 사용했다. 하지만 FCL은 이미지를 분류할 때 픽셀간의 연관성을 유지하지 못하는 한계가 있다. 이렇한 한계를 극복하기 위해 컨볼루션 레이어와 풀링 레이어를 FCL의 앞에 구성한 CNN이 개발되었다. CNN을 사용하는 최종 목적은 입력 이미지를 분류하기 위한 것이고, 기존의 FCL의 문제점을 보완하여 분류성능을 높이는 것이다.

 

사실 FCL이 이미지를 분류하기 위해 왜? 전 노드를 1차원으로 배열하는지, 그랬을 경우에 데이터 손실은 왜 발생하는지 아직 이해하지 못한다. 다만 분류에는 '0' 또는 '1' 같은 이진 분류와 '자동차', '비행기', '배' 와 같이 여러 클래스를 분류로 크게 구분할 수 있으며, FCL의 활성화 함수(sigmoid, softmax)를 통해 이렇한 분류를 수행할 수 있다는 정도로 이해하고 정리한다.

 

 

4. CNN 기본 구성

CNN LeNet-5 구조

3개의 컨볼루션 레이어와 2개의 풀링 레이어, 1개의 fully connected layer로 구성되어 있다.


이해가기도 어려운데, 글로 정리하려니 더 어려운 것 같다. 다음 기회?에 인공신경망에 대해서 조금 더 공부해 봐야겠다.

 

(사내에서 내부 세미나로 진행하다 보니 여기 저기 고수님들의 블로그를 통해 작성된 자료들을 사용하게 됬습니다. 출처를 잘 몰라 표기하지 못한 것이 몹시 죄송하지만, 혹시 그림의 원작자께서 이 글을 보시게 되면 넓은 이해와 아량을 부탁드립니다.)

 

'ML & AI > supervised' 카테고리의 다른 글

[알고리즘] SVM(Support Vector Machine)  (0) 2020.10.27