본문 바로가기

데이터 다루기/신경망

[신경망] 14. Convolution Neural Network

728x90
반응형

안녕하세요, 이번 포스팅에서는 Convolution Neural Network (CNN) 에 대해서 배워보도록 하겠습니다.

CNN 은 이미지 데이터를 입력값으로 받아들여서, Convolution layer를 통과하면서 Filter를 통해서 이미지의 특징을 추출합니다.

예를 들어서, MNIST 데이터 셋에서 ㅋ 을 이미지 데이터로 받아들인다고 합시다.

그리고 다음과 같은 4가지 필터로 이미지의 특징을 추출해보도록 하겠습니다.

1은 흰색을 의미하고, 0은 회색, 그리고 -1은 검정색을 의미합니다. 이는 이미지의 특징을 추출할 때, 명암을 의미합니다.

위의 그림은 이미지의 특징을 추출한 결과입니다. 첫번째와 세번째에서는 수평적인 이미지의 특징이 추출되었으며, 두번째와 네번째에서는 수직적인 이미지의 특징이 추출되는 것을 알 수 있습니다.

이처럼 Filter를 잘 설정하면, 수직적 및 수평적 특징 뿐만 아니라, 굵기, 회전각도, 명암, 확대, 축소 등의 특징을 추출할 수 있습니다.

물론 이러한 특징을 저희가 수동으로 찾는것이 아니라, CNN을 학습하면서 자동으로 발견해주니 걱정하지 않으서도 됩니다.

실제로 이러한 특징을 잘 찾는것은 매우 중요한 과정인데요. 저희가 앞서 배웠던 오토인코더가 이러한 특징을 잘 찾아주기 때문에 CNN에서 많이 사용된다고 합니다.

Filter는 일반적으로 행렬 형태를 하고 있습니다.

Filter가 이미지인 Feature map에 어떻게 적용되는지를 알아보기 위해서 간단한 예시를 준비해보았습니다.

다음과 같은 Feature맵에 Filter맵을 적용해보록 하겠습니다.

우선 Filter와 같은 크기를 가지는 행렬을 Feature 맵에서 뽑아내, 행렬내적을 시킵니다. 위에서는 값이 8로 나왔네요.

그리고 이 행렬을 사전에 정해준 칸만큼 이동을 해서 반복을 하면 됩니다. 이를 움직이는 칸의 수를 Stride라고 하는데, 저희는 1칸이라고 하고 진행해보도록 합시다.

이번에는 10이라는 값이 나오게 됩니다. 이러한 과정을 Feature 맵의 마지막까지 반복을 하면 다음과 같은 행렬이 만들어집니다.

행렬의 크기가 축소된것이 보이시죠??

Feature map이 하나의 Filter를 통과한 결과입니다.

일반적으로 i x i Feature맵에 k x k filter를 s라는 stride를 가지고 적용시킬 때, output의 사이즈는 다음과 같습니다.

그리고 다음으로 Pooling layer에 대해서 배워보도록 하겠습니다.

Pooling layer는 이미지를 압축하는데 의미가 있습니다.

Pooling layer는 주로 Max pooling과 Average Pooling을 쓰는데, Max pooling이 범용적으로 사용됩니다.

저희는 Max pooling에 대해서 간략하게 배워보도록 합시다.

위의 예시에서 Filter를 통과한 Feature맵에 대해 2x2 Max pooling (Stride = 2)을 적용해보도록 하겠습니다.

4x4 Feature 맵이 2x2 사이즈로 축소되었습니다.

참고로 Average pooling은 값을 반환할 때, 최대값이 아닌 평균값으로 반환됩니다.

일반적으로 i x i Feature맵에 k x k maxpooling을 s라는 stride를 가지고 적용시킬 때, output의 사이즈는 다음과 같습니다.

그런데 여기서 의문점이 하나 생길 수 있습니다.

"Filter를 적용하거나 Pooling을 적용하면 Feature 맵의 사이즈를 줄어드는데, 이것이 과연 좋은것인가?" 에 대한 의문입니다.

물론 Feature 맵의 사이즈를 줄이면 overfitting의 위험이 줄어드는 장점이 있습니다. 하지만 정보의 손실 또한 단점으로 들 수 있습니다.

따라서 사이즈를 줄이는 것도 좋지만, 그대로 유지해야 하는 경우도 있을것입니다.

이 때, Zero padding 이라는 방법을 사용합니다.

Zero padding은 기존의 Feature 맵의 가장자리에 0을 추가하는 것입니다. 3x3 Filter를 적용하면, 크기가 줄어드지 않게 됩니다.

일반적으로 i x i Feature맵에 k x k filter를 s라는 stride와 p의 padding을 가지고 적용시킬 때, output의 사이즈는 다음과 같습니다.

CNN에는 중요한 쟁점이 한가지 있습니다. 그것은 바로 Weight의 개수입니다.

예를 들어서 32x32x3 이미지가 있을 때, 5x5x3 filter로 30개의 feature맵을 만들어 낸다고 생각해봅시다.

만약 filter가 움직일 때마다, weight를 다른 값으로 준다면, weight의 개수는 기하급수적으로 증가할 것입니다.

그렇기 때문에, 일반적으로 1개의 feature맵을 생성할 때, filter의 weight는 고정시킵니다. 이를 Weight sharing이라도고 부릅니다.

하지만, Weight sharing을 가지고 간다고 하더라도 CNN에는 여전히 Weight의 개수가 기하급수적으로 많다는 문제점을 가지고 있습니다.

이에 대한 예시로 간단한 Convolution neural network 구조를 가지고 왔습니다.

227x227x3 의 이미지를 처리하는데 5개의 Convolution layer와 3개의 pooling layer 그리고, 2개의 Fully connected layer로 구성된 네트워크를 사용합니다.

이 때, 필요한 Weight의 수는 무려 1억개가 약간 넘습니다.

만약 네트워크의 층이 20개가 넘어간다면 상상하기도 힘들정도로 Weight의 수가 늘어나겠지요?

실제로, Weight의 수를 줄이는 것이 CNN에서는 핫한 연구과제입니다.

마지막으로 위에서 언급했던 Fully connected layer에 대해서 설명해보도록 하겠습니다.

CNN의 목적은 이미지의 분류이기 때문에, 원본 이미지가 Convolution layer와 Pooling layer를 거쳐서 중요한 특징을 포함하는 feature맵으로 결과가 나오게 되면 우리는 이를 input으로 받아들이고, MLP와 같은 방법으로 분류합니다.

 

반응형