CNN

kang9366·2023년 1월 25일
0

CNN은 Convolutional Neural Networks의 약자로 딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이는 Neural Network 모델이다. CNN이 나오기 이전, 이미지 인식은 2차원으로 된 이미지(채널까지 포함해서 3차원)를 1차원배열로 바꾼 뒤 Fully Connected 신경망으로 학습시키는 방법이었습니다. 이러한 방식은 raw data를 직접 처리하기 때문에 많은 양의 학습데이터가 필요하고 학습시간이 길어진다. 또한 이미지가 회전하거나 움직이면 새로운 입력으로 데이터를 처리해줘야 한다.

CNN은 이러한 단점을 보완하여 raw data를 그대로 받음으로써 공간적, 지역적 정보를 유지한 채 특성(feature)들의 계층을 빌드업한다.

CNN의 중요 포인트는 이미지 전체보다는 부분을 보는 것, 그리고 이미지의 한 픽셀과 주변 픽셀들의 연관성을 살리는 것이다.

예를 들어 어떠한 이미지가 주어졌을때 이것이 새의 이미지인지 아닌지 결정할 수 있는 모델을 만든다고 가정하였을 때 새의 주요 특징인 부리가 중요한 포인트가 될 수 있다. 그렇기 때문에 모델이 주어진 이미지에 새의 부리가 있는지 없는지 판가름 하는것이 중요 척도가 될 것이다.

하지만 새의 전체 이미지에서 새의 부리 부분은 비교적 작은 부분이기 때문에 모델이 전체 이미지를 보는 것 보다는 새의 부리 부분을 잘라 보는게 더 효율적이다. CNN이 이러한 역할을 한다. CNN의 뉴런이 패턴(새의 부리)을 파악하기 위해서 전체 이미지를 모두 다 볼 필요가 없다.

또한 위의 두 이미지를 보면 새의 부리부분이 이미지의 다른 부분에 위치해 있다는 것을 알 수 있다.

위의 이미지는 이미지의 새의 부리가 왼쪽 상단에 위치한 반면 아래의 이미지는 상단 가운데 부분에서 약간 왼쪽 부분에 위치하기 때문에 전체적인 이미지보다는 이미지의 부분 부분을 캐치하는 것이 중요하고 효율적일 수 있다.


CNN 구조

CNN은 크게 2가지 부분으로 나눠진다. 하나는 특징을 추출하는 feature extraction로 이루어져 있고, 다른 하나는 feature extraction를 통과한 이후에 결과값을 도출해 주는 classification으로 이루어져있다.

이때 Convolution layer와 Pooling layer가 섞여 있는것이 feature extraction이고, fully-connected layer로 이루어 진것이 Classification이다.

  • feature extraction (특징을 뽑아낸다) - Convolution, Pooling layer
  • classification (물체를 판단한다) - Fully-connected layer

1. Convolution Layer

Convolution Layer에서는 특징을 추출하는 층으로 일정 영역의 값들에 대해 가중치를 적용하여 하나의 값을 만드는 연산이 실행된다. 이때 이 가중치 행렬을 컨볼루션 필터(=커널 or 마스크)라 부른다.

또한 가중치 필터 연산 후에 활성화 함수를 적용하여 이후 연산에 넘겨진다. 이때 CNN의 경우 대부분 ReLU 활성화 함수를 사용한다.

위 이미지에서는 5x5 행렬의 이미지에 대해 3x3 필터를 1 스트라이드(연산마다 필터가 움직이는 칸 수)로 특징 추출하는 모습이다. 이후 나온 결과 행렬 Convolved Feature Map을 특징지도라고 한다.

1-1. Padding

컨볼루션 연산에 있어서 필요할 경우, 결과 값 행렬의 크기를 조정하기 위해 입력 배열의 둘레를 확장하고 0으로 채우는 연산이다.

패딩은 입력 데이터의 사이즈를 늘려주어 입력 데이터보다 출력 데이터가 작아지는것을 방지하는 역할을 한다. (여기서 입력 데이터란, 최초로 입력되는 이미지 데이터가 될 수도 있고 중간에 CNN layer를 거쳐서 나오게 된 특징들 데이터가 될 수도 있다.)

Padding이 추가된 상태에서 필터하는 과정

위 그림 속 점선으로 되어 있는 부분들이 바로 패딩에 해당한다. 패딩에 들어가는 값은 주로 0을 넣으며 이를 'zero padding'이라고 한다. 패딩값에 다른 임의의 값을 넣어줄 수도 있지만 이미지는 정적 상태이기 때문에 0을 채운다. (패딩에 임의의값을 넣는 경우는 연속되고 순환되는 움직이는 이미지일 경우 사용된다고 한다)

딥러닝 프레임워크로 구현 시 padding인자에 'SAME'이라는 값을 넣어줄 수 있는데 이는 입력 데이터 size와 필터링을 거친 후의 출력 데이터 size가 같도록 입력 데이터에 그만큼 패딩을 추가해주는 것이다. 또한 padding이 'VALID'라는 것은 padding 크기를 0으로 설정해준다는 의미이다. 이때에는 출력 데이터의 size가 입력 데이터 size보다 작아지게 된다.

1-2. Stride

Stride는 필터의 이동량을 의미한다. Stride를 설정하는 목적은 필터를 이동시키면서 Weight sharing을 하게 되면 중복된 값이 계속적으로 나오고 이를 방지하기 위한 것이다.

왼쪽과 같은 입력 데이터가 존재할 때, 3*3 사이즈의 필터를 Stride=2 일때, 적용한 그림이다. 왼쪽의 빨간색 표시된 부분을 보면 점선으로 된 부분에 첫 번째로 필터링을 진행하고 다음 필터링을 진행할 때 처음에 진행했던 이미지의 부분 데이터에서 2칸 만큼 띄어서 필터링을 적용하는 것이다.(Stride size를 3 by 1과 같이 직각형태로 설정할 수도 있다)

2. Pooling Layer

pooling layer는 convolution layer의 output 데이터를 받아서 output 데이터의 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용된다. pooling layer를 처리하는 방법으로는 Max Pooling, Average Pooling 이 있다. 일반적으로 풀링과 stride를 동일한 크기로 설정하여 모든 원소가 한번씩 처리 되도록 한다.

profile
강승구

0개의 댓글