CNN(Convolutional neural network) 기본 개념 되돌아보기

1. CNN 등장

 

CNN(Convolutional neural network)은 이미지나 영상을 다루는 컴퓨터 비전에서 가장 대표적으로 사용되는 인공신경망

 

1980년대 얀 르쿤(Yann LeCun)이 우편번호와 수표의 숫자 필기체를 인식하는 LeNet이라는 모델을 개발하면서 처음 소개

 

Gradient-based learning applied to document recognition

 

알고리즘이 성공적으로 동작했으나, 10개의 숫자도 학습하는데 3일이나 걸렸음

 

30년이 지난 후, 과적합과 학습 시간 문제를 해결하면서 지금은 이미지 분류는 기본이고 얼굴 인식, 자율주행같은 어려운 과제인 객체 인식에서도 효과적으로 CNN이 사용

 

 

2. 정형데이터와 이미지데이터의 차이?

 

정형데이터는 데이터베이스 시스템의 테이블과 같이 고정된 칼럼(column)과 개체(observation)의 관계로 구성

 

이미지는 사람의 눈으로는 한장의 사진처럼 보이더라도 컴퓨터가 읽을 때는 픽셀 단위의 숫자 행렬로 이루어짐

 

다층 퍼셉트론의 입력층 노드 수는 정형데이터의 입력 변수 개수와 같은데, 이미지를 넣을려면 어떻게 해야할까?

 

하나의 방법은 이미지 행렬을 1차원의 벡터로 펼쳐준다.

 

$3\times3$행렬의 각 원소는 하나의 픽셀(pixel)을 나타내고,

 

$v_{n}$ n=1,2,3,4,5,6,7,8,9가 되어 정형데이터 벡터에서 하나의 변수를 나타낸다.

 

픽셀 하나는 정형데이터에서 하나의 변수 역할을 하게 된다.

 

그런데 이렇게 행렬을 정형데이터의 하나의 행으로 풀면, 이미지가 갖는 고유의 특성인 공간적 정보(spatial feature)를 잃어버리게 된다.

 

공간적 정보가 무슨말이냐면, 사진에 임의의 한점의 인접한 픽셀들은 비슷한 색을 가지고 있다.

 

 

점 A 주위 사각형은 비슷한 색으로 구성되어 있음

 

컴퓨터가 인식하는 데이터 형태로 생각하면, 위치가 근접한 픽셀끼리는 굉장히 유사한 정보를 가지고 있음

 

그렇지만 이미지를 정형데이터로 바꾸는 순간, 행렬이 벡터로 변하면서 공간적 정보는 사라지게 된다.

 

이런 단점을 CNN은 이미지 행렬 그 자체를 입력받음으로써, 극복하게 된다.

 

 

3. CNN의 기본 구조

 

CNN은 크게 Convolutional layer, pooling layer, fully connected layer로 구성되어 있다.

 

 

convolutional layer는 이미지의 공간적 정보를 학습한다.

 

pooling layer는 convolutional layer의 차원 형태의 크기를 줄여서 학습 parameter 개수를 감소시킨다.

 

fully connected layer는 최종 출력을 위한 다층 퍼셉트론 구조로 구성

 

 

4. Convolutional layer

 

CNN에서 가장 핵심이 되는 부분

 

이미지의 중요한 지역 정보(region feature)를 뽑는 역할

 

이미지에 filter(=kernel)를 적용하여 convolution(합성곱) 연산을 수행

 

convolution은 filter가 입력 이미지를 훑으면서 겹치는 부분의 서로 대응하는 원소를 곱하여 모두 더한 값을 출력하는 연산

 

 

 

filter이 input 이미지를 다음과 같이 훑어서 계산하게 됩니다.

 

 

 

1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 +0*0 + 1*2 = 2 + 3 + 1 + 4 + 3 + 2 = 15

 

여기서 filter가 적용되는 현재 파란색의 겹치는 영역을 receptive field라고 합니다.

 

 

2*2 + 3*0 + 0*1 + 1*0 + 2*1 + 3*2 + 0*1 + 1*0 + 2*2 = 4 + 0 + 0 + 0 + 2 + 6 + 0 + 0 + 4 = 16

 

 

 

0*2 + 1*0 + 2*1 + 3*0 + 0*1 + 1*2 + 2*1 + 3*0 + 0*2 = 0 + 0 + 2 + 0 + 0 + 2 + 2 + 0 + 0 = 6

 

 

1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 + 0*0 + 1*2 = 2 + 0 + 3 + 0 + 1 + 4+ 3+ 0 + 2 = 15

 

input에 filter를 거쳐 나온 output을 feature map이라고 부른다.

 

 

5. filter

 

filter는 CNN에서 학습할 가중치이다.

 

다층 퍼셉트론과 마찬가지로 filter에 들어있는 값들은 랜덤으로 주어지지만 학습을 통해 손실 함수가 줄어드는 방향으로 학습된다.

 

잘 학습된 filter는 이미지의 특징을 추출한다. 

 

다양한 특징을 뽑기 위해 여러개의 filter를 사용하며,

 

CNN내부에서는 다양한 filter를 적용한 여러개의 feature map으로 이미지의 여러 정보를 결합하여 분류를 잘하도록 학습이 진행된다.

 

 

 

 

6. hyperparameter

 

Convolutional layer에서 정해야할 hyperparameter로 filter의 크기, stride, padding 등이 있다.

 

filter의 크기는 filter의 높이와 너비를 말하고

 

stride는 filter를 움직이는 간격을 말한다.

 

padding은 convolution을 수행하면, feature map의 크기가 input에 비해 줄어드는데, input size와 동일하게 만들기 위해 input size의 둘레에 0을 씌우는 기술을 말함

 

만약 stride = 2로 정하면.. 다음과 같이 2*2 filter가 한번에 오른쪽으로 2칸씩 움직인다

 

 

 

stride는 위와 같이 filter가 입력 이미지를 순회할때 움직이는 단위이다

 

원래는 4*4 input에 2*2 filter를 stride = 1로 적용하면 아래와 같이 3*3 feature map이 나온다.

 

stride=2로 하면 위 그림을 보면 2*2 feature map이 나올 것이다.

 

그래서 stride가 커질수록 feature map이 작아지므로, 기본적으로는 stride = 1로 CNN을 구현하는 것이 기본이다.

 

feature map이 작으면 추출한 정보를 많이 못쓰니까

 

 

padding을 적용해서 input size와 output size를 동일하게 만든다.

 

물론 항상 동일하게 나오는 것은 아니다.. 적절한 사이즈를 적용해야 동일해짐

 

 

convolution은 이미지의 크기를 줄이므로, convolutional layer를 여러개 거치면서 이미지의 크기는 계속해서 작아지고,

 

이미지의 가장자리에 위치한 픽셀은 중앙에 위치한 픽셀에 비해 상대적으로 연산에 잘 활용되지 않아 점점 정보가 사라지게 된다.

 

순회하다보면.. 중앙에 있는 얘들은 계속 쓰이는거 위 그림만 봐도 초록색 겹치는 부분 보면 알겠지

 

이런 점을 방지하고자 padding으로 이미지 가장자리에 임의의 값(보통은 0을 준다)이 설정된 픽셀을 추가하여 입력 이미지의 크기와 feature map의 크기가 같아지도록 만든다

 

feature map의 크기가 O이고, 입력의 크기가 I, stride의 크기가 S, padding의 크기가 P이면, 

 

$$O = \frac{I+2P-F}{S} + 1$$이 성립한다고 함

 

 

7. pooling layer

 

convolutional layer로 계산된 feature map의 크기를 줄여, 연산량을 줄이는 역할을 한다.

 

크기를 압축하는 대표적인 방법은 max pooling과 average pooling이 있다.

 

계산하는 방법은 지정한 크기의 픽셀 값중에서 최댓값을 가져오면 max pooling이고 평균값을 가져오면 average pooling이다.

 

2*2 max pooling을 적용해보면 다음과 같다.

 

 

 

좌상단부터 2*2 크기의 8,14,3,1중 최댓값인 14를 가져오고, 4,9,19,11중 최댓값인 19를 가져오고,

 

2,3,27,21중 최댓값인 27을 가져오고, 8,5,14,33중 최댓값인 33을 가져온다.

 

인접한 픽셀 중에서 중요한 정보만 남기는 강조 효과를 줄 수 있고

 

단순한 계산만 하므로 convolutional layer의 filter과는 다르게 학습할 가중치는 없다.

 

또한 pooling layer는 모든 convolutional layer의 feature map에 적용할 필요는 없으며 선택사항이다.

 

 

8. fully connected layer

 

CNN은 회귀와 분류에 모두 적용가능하다.

 

다층 퍼셉트론과 마찬가지로 최종 출력값은 분류 문제이면 각 클래스에 대한 예측 확률 벡터

 

회귀 문제면 예측값을 담은 벡터

 

이미지의 입력 데이터는 convolutional layer와 pooling layer를 통과하면서 주요 특징만 추출된 여러개의 feature map의 형태이다.

 

고차원의 feature map이 출력값의 형태인 1차원 벡터로 변환되기 위해 flatten layer를 거치게 된다.

 

이거는 앞에서 이미지 행렬을 퍼셉트론에 넣기 위해 정형데이터로 바꿀때랑 동일함

 

 

데이터 하나당 8*8 feature map이 32개를 만들어낸다면, 일차원 벡터로 바꾸면.. 32*8*8 = 2048 크기의 1차원 벡터로 바뀐다.

 

fully connected layer는 flatten layer를 통과한 벡터를 최종 출력값으로 변환시키는 역할을 한다.

 

다층 퍼셉트론의 구조와 같으므로, 여러 layer를 쌓아 원하는 구조로 구성하면서 마지막 출력층의 노드 개수만 현재 task의 목적에 맞게 설계한다.

 

분류 클래스가 150개라면.. output vector의 크기가 150개가 나오게..

 

일반적으로 fully connected layer는 convolutional layer보다 가중치가 많이 필요하므로, layer를 많이 쌓는 것은 과적합과 학습 속도를 늦추는 원인이 된다??? 그런가???

 

 

참조

 

 

0608 - CNN 전체적인 네트워크 구조 및 구성 연산_1 (velog.io)

 

0608 - CNN 전체적인 네트워크 구조 및 구성 연산_1

CNN의 구조는 기존의 완전연결계층(Fully-Connected Layer)과는 다르게 구성되어 있다.완전연결계층(또는 Dense Layer이라고도 합니다)에서는 이전 계층의 모든 뉴런과 결합 되어있는 Affine계층으로 구현

velog.io

 

 

Visualizing the Feature Maps and Filters by Convolutional Neural Networks | by Eugenia Anello | DataSeries | Medium

 

Visualizing the Feature Maps and Filters by Convolutional Neural Networks

A simple guide for interpreting what Convolutional Neural Network is learning using Pytorch

medium.com

TAGS.

Comments