ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기계학습] 합성곱 신경망(CNN : Convolutional Nerual Network) (Part 1/2)
    코딩(Coding)/기계학습 2022. 2. 9. 13:07
    728x90

    CNN(Convolutional nerual network)

    등장 배경

    • 기존의 Fully-Connected 모델은 1차원의 데이터 말고 2차원 이상의 데이터를 사용하게 된다면, 해당 입력 데이터를 Flatten 시켜 한줄의 데이터로 만들어야 한다.
    • 이 과정에서 데이터의 손상이 발생하게 된다.
      • 이미지의 경우에는 상하좌우, 이웃 픽셀의 정보가 손실된다.
    • 이 문제를 해결하기 위해 고안한 해결책이 바로 CNN이다.

     

    CNN 장점

    • 단순 Fully-Connected 보다 학습시켜야하는 Weight가 적다.
    • 학습과 연산속도가 빠르며, 효율적이다.
    • 이미지나 영상데이터 처리에 유용하다.

     

    CNN의 핵심 접근법

    image

    • 어떠한 이미지가 주어졌을때, 그 이미지가 새인지 아닌지를 결정하는 모델이 있다고 가정하자.
    • 사람은 새의 특징인 "부리"와 "날개" 같은 특징을 캐치하여 새인지 아닌지를 결정한다.
    • 이와 같이 신경망에서도 이미지에서 "특징(Feature)"을 찾아내도록 하는 것이다.
      • 즉, 이미지에서 특징을 찾아내는 필터(Filter, Kernel)를 학습하는 것이다.
    • 이미지 전체를 보기보다는 특징을 찾아내는 작업(Feature Extraction)

     

    이미지 표현 방법

    그렇다면 컴퓨터에서 이미지는 어떻게 표현할까?

    image

    이미지를 2차원의 배열로 표현할 수 있겠다.
    흔히 이미지의 해상도를 보고 배열의 크기를 알 수 있는데, 가령 이미지의 크기가 800x640이라면, (800, 640)의 Shape을 가진 배열로 표현할 수 있다. 즉 픽셀의 개수(원소의 개수)가 800x640라는 의미이다.

    위 그림에서 Mnist 손글씨 이미지는 28x28크기의 해상도를 가진 손글씨 이미지이다. 픽셀 단위로 쪼개서 배열로 표현했다면, (28, 28)의 배열로 표현될 것이며, 명암 데이터이기 때문에 픽셀의 값은 0255(01)의 명암 값으로 표현될 것이다.

    image

    뿐만 아니라, 우리가 흔히 보는 컬러 이미지의 경우에는 3차원의 배열이다.
    (Channel x Width x Height)로 표현 되는데, 여기서 Channel은 RGB 색 명암 채널이다.

    가령, 800x640 해상도의 컬러이미지라면, (3, 800, 640) Shape의 배열로 표현될 것이다.

     

     

    CNN 연산

    자 그럼, CNN의 핵심 연산 2가지를 알아보자,

    1. Convolutional Dot
    2. Pooling

     

    합성 곱(Convoluional Dot)

    앞서 언급했던, 특징을 추출하기 위한 작은 필터를 구성한다고 했는데,
    어떠한 특징을 찾아내는 일정한 크기를 가진 필터를 생성한다.
    해당 필터는 이미지 전체를 훑으면서, 이미지의 모든 영역에서 해당되는 특징(Feature)를 찾아낸다.
    정확히는 이미지와 필터간의 내적연산을 하는 것

    image

    보통 Filter는 이미지보다 작게 설정한다.(Kernel_size = 3 or 5 or 7 ...)

    image

    위 그림이 합성곱 연산의 첫 부분이다.
    이미지의 왼쪽 위부터 필터를 차례대로 훑어서 내적한다.
    그리고 그 결과는 새로운 특징맵(Feature Map)이 된다.

    합성곱 연산

    위 움짤은 합성곱 연산 움짤이다.

     

     

     

    image

    더 나아가서 Filter를 여러개를 쓴다면, Feature-Map의 개수도 늘어날 것이다.
    여기서 Filter를 여러 개를 쓴다는 의미는 해당 이미지에서 추출할 특징의 개수를 의미한다고 생각할 수 있다.

     

     

    image

    Feature map의 크기는 그림에서와 같은 공식에 의해 결정된다.
    $$
    Feature.Map.Size = \frac{(image - filter)}{Stride} + 1
    $$

     

     

    여기서 의문이 든다.
    "filter를 거치면 거칠수록 Feature map의 크기는 필연적으로 작아지는데, 결국에는 1개의 픽셀로 수렴하는 것이 아닌가?"

    이를 해결하기 위해 Padding이라는 개념이 있는데, Padding을 적용하면 Feature Map의 크기가 줄어드는 것을 막을 수 있다.
    $$
    Feature.Map.Size = \frac{(image - filter + 2Pad)}{Stride} + 1
    $$

     

    자, 그럼 계산을 해보자

    이미지의 크기 : 5 x 5
    필터의 크기 : 3 x 3
    Stride Step : 1 x 1
    Padding 크기 : 1

    ((5 - 3 + 2*1) / 1) + 1 = 5
    즉, 5 x 5의 Feature map이 생성된다.

    합성 곱(with padding)

    모델은 Filter 내부의 값을 특징을 잘 추출하도록 학습시키는 것이다.
    여기까지가 Convolutional Dot(합성 곱) 연산이었다.

     

    Pooling

    image

    Pooling은 각 결과 값(Feature Map)의 차원을 축소해 주는 것을 목적으로 둔다.
    특징이 낮은 부분을 과감히 삭제하고 특징이 도드라진 부분을 취하여 결과값의 크기(차원)를 줄이는 과정이다.

    Pooling의 대표적인 방법으로 2가지가 있다.

    1. Max Pooling
      • 범위(Filter) 내에서 가장 큰값을 가지는 픽셀을 취한다.
    2. Average Pooling
      • 범위(Filter) 내에서 픽셀들의 평균 값을 취한다.

    Pooling의 크기가 2x2일 경우 Feature map의 2x2 부분 마다 가장 큰(Max)값이나, 평균값(Average)를 가져와 결과값의 크기를 줄인다.

    Pooling

    Pooling도 엄연히 따지면, Filter의 개념이 있지만, 학습을 하지 않는다.
    따라서, Pooling에는 학습 가능한 가중치가 없다.
    WHY? : Max Pooling은 필터 내에서 가장 큰수를 찾는 작업이고, Average Pooling또한 필터 내의 픽셀 값의 평균을 구하는 단순 작업이기 때문이다. 즉, 가중치가 사용되지 않는다.

     

    CNN의 작동

    image

    CNN을 통해 모델을 설계할 때, 크게 2가지 작업이 일어난다고 할 수 있다.

    1. 입력 이미지에 대한 특징 추출(CNN)
    2. 추출된 특징을 기반으로 이미지를 분류(분류기)

    CNN은 입력 이미지에 대한 Feature(특징)을 잘 추출하여 숫자로 표현(= 특징벡터)한다.
    그 특징 벡터를 분류기(선형 변환)에 입력으로 넣어서 Label에 맞게 분류하는 작업이다.

    image

    잘 추출된 특징 벡터를 우리가 잘 다루는 선형 분류기에 넣고 SoftMax를 취하여 확률로 만든 다음 해당 이미지가 새 인지 개인지 고양인지를 분류할 수 있게 되는 것이다.

     


    다음 포스팅은 CNN을 통해서 Fashion Mnist 데이터 분류 코드실습을 해보려고 한다.
    Linear Net과 CNN의 성능 비교 위주로 코드실습을 해보려 한다.

     

    포스팅에 사용된 PPT는 아래 링크에서 다운받을 수 있습니다.
    https://github.com/JoSangYeon/Machine_Learning_Project/blob/master/PPT/03.%20CNN.pdf

    728x90

    댓글

Designed by black7375.