CNN의 convolution과 pooling(보충 필요)

yuns_u·2021년 11월 1일
0
post-custom-banner

💛 CNN(Convolutional Neural Networks)

최근 컴퓨터비전(computer vision, CV)은 대부분을 convolution에 의존하고 있다고해도 과언이 아니다. 가중치를 공유하며 특징을 추출하는데 이만한 방법론을 찾기 어렵기 때문이다.

이러한 CNN은 다양한 분야에서 사용되고 있다.

  • 사물인식(object detection)(YOLO) + RCNN(Fast, Faster, MASK RCNN)
  • 포즈예측(Pose Estimation) : PostNet
  • 윤곽분류(Instance Segmentation): Detectron
  • 그 외에도 매우 다양한 실제 사례들이 존재한다.

💛 Convolution

CNN은 생물학, 특히 고양이의 시각 피질의 수용 영역(receptive field)에서 영감을 받았다. 실제 뇌에서 시각 피질의 뉴런은 특정 영역, 모양, 색상, 방향 및 기타 일반적인 시각적 특징을 수용하도록 영역별로 전문화가 이루어진다. 시스템의 구조 자체가 원시 시각 입력을 변환하여 특정 하위 집합을 처리하는 데 특화된 뉴런으로 보낸다.

CNN은 컨볼루션(Convolution)을 적용하여 시각적 접근 방식을 모방한다. 컨볼루션은 한 함수가 다른 함수를 수정하는 방법을 보여주는 세 번째 함수를 생성하는 두 함수에 대한 연산이다.
컨볼루션에는 교환성, 연관성, 분배성 등 다양한 수학적 속성이 있다. 컨볼루션을 적용하면 입력의 '모양'(shape)이 효과적으로 변환된다.

컨볼루션이라는 용어는 세 번째 공동 함수(weight sharing)를 계산하는 프로세스와이를 적용하는 프로세스를 모두 지칭하는데 사용된다. 좀 더 간단하게 표현하자면 컨볼루션은 실제 동물의 시야에서 피질의 수용 영역으로의 매핑과 유사한 어플리케이션이라고 할 수 있다.

수학적인 이해

1D convolution

일차원의 데이터를 컨볼루션하는 것을 살펴보면 아래의 이미지처럼 나타낼 수 있다.

import numpy as np
input = [0, 0, 26, 51, 58, 59, 53, 29, 0, 0, 0]
patch = [-1, 2, -1]

output = np.convolve(input, patch)
print(output)
## [  0   0 -26   1  18   6   7  18   5 -29   0   0   0]

2D convolution

아래 이미지의 노란색 부분으로 변하는 부분이 Convolution filter와 만나는 부분이다.
그렇게 연산이 되었을 때, 분홍색의 output 값을 얻을 수 있다.

이렇게 연산이 되는 경우 가장 가장자리의 데이터들은 한 번밖에 학습이 되지 않게 된다. 가장자리의 데이터를 충분하게 학습하지 않으면 불필요한 데이터의 정보 손실이 일어나게 되므로 가장자리를 더 둘러주는 방식으로 가장자리의 데이터를 충분히 학습시킬 수 있다. 이러한 방식을 padding이라고 한다.

padding

흰 색 pixel의 경우 실제 이미지가 있는 부분이고 짙은 회색의 pixel은 feature map의 크기 조절과 데이터를 충분히 활용하기 위해 가장자리에 '0'을 더해준 것이다. 이러한 방식을 zero-padding이라고 한다.


feature map(특징맵)
합성곱 계층의 입출력 데이터를 특징 맵(feature map)이라고 한다. 입력 데이터는 입력 특징 맵(input feature map), 출력 데이터는 출력 특징 맵(output feature map)이라고 부른다.

Stride

Stride는 성큼성큼 걷다는 뜻이다. CNN에서 stride는 한 번에 얼마 만큼씩 걸을 것인지 나타내는 것이다. stride가 1일 때는 한 걸음씩, 2일 때는 두 걸음씩 걸어가면서 연산한다는 것이다.

stride에서 주의할 점은 output의 사이즈가 달라진다는 것이다. Stride를 이용한 Convolution의 경우는 pooling이 자동으로 되는 방식으로 이후 GAN에서 해당 방식을 정리하고자 한다.

  • stride = 1

  • Stride = 2

용어 정리

  • Filter:
    가중치 (weights parameters)의 집합으로 이루어져 가장 작은 특징을 잡아내는 창
  • Stride:
    필터(filter)를 얼마 만큼씩 움직이며 이미지를 볼 것인지 결정하는 수
    ex) Stride가 1이면 한 칸씩 이동하며, 누락 없이 모든것을 본다면 stride가 2이면 한 칸씩 건너뛰면서 Filter를 적용하게 되고, 건너 뛴 만큼 다음 레이어의 데이터의 수가 줄어든다.
  • Padding:
    Zeros(또는 다른 값)을 이미지의 외각(가장자리)에 배치하여 conv를 할 때 원래 이미지와 같은 데이터의 수를 갖을 수 있도록 도와줌 (Stride = 1일 때)

code

위의 공식에서 대괄호는 정수화를 의미하는 것으로 소수점 아래의 값들은 버림한다.

pooling layer


풀링 레이어를 사용하면 피처맵의 차원을 줄일 수 있다.
보통 컨볼루션을 적용한 이후 레이어를 풀링하여 점점 더 작은 피쳐맵을 얻는다.
이렇게 줄어든 피쳐들을 이용하여 ANN형태의 신경망에 넣어 classification 또는 regression을 수행하게 된다.

이렇게 CNN의 특징을 잡아내는 방식에 대해서 살펴보았다.
패치와 같은 형태로 특징을 잡아내기 때문에 얻어질 수 있는 장점을 간단히 정리하자면

  • local feature: 지역적 특징을 잡아냄
  • weight sharing
  • translation invariance: 어느 정도 움직임이 있더라도 해석이 큰 무리가 없다.

참고자료
padding의 종류 등에 대한 추가 정보
CNN(Convolution Neural Network)이란?

profile
💛 공부 블로그 💛
post-custom-banner

0개의 댓글