2025. 5. 1. 22:57ㆍ인공지능/CNN
이 글은 DNN(Depp Neural Network)을 이미 이해하고 있는 사람을 위한 글이다.
CNN은 Convolutional Neural Network 의 약자이다.
기존의 DNN은 아래 그림과 같이

기존 레이어가 레이어에 순차적으로 연결되는 레이어였다.
CNN은 여러 개의 노드가 하나로 모이는(Merge) 형태의 유형이라고 볼 수 있다.

CNN의 전체적인 동작 과정은 아래와 같다.

먼저 Convolution layer가 쓰이고, Vanishing gradient(기울기 소실) 문제를 해결하기 위해 ReLU activation function을 사용한다.
그 후 POLL과정을 거쳐 결과가 나오게 된다.
먼저 CONV 과정에 대해 알아보자.
CNN에서 주로 사용하는 이미지 처리에서 이미지는 대부분
width * hight * depth 로 이루어진다. 여기서 depth란 color영상일 경우 3이되고, 흑백일 경우엔 1이 된다.

청록색이 32X32X3 의 이미지라고 했을 때 빨간색 부분인 마스크(필터)라는 것을 얹게 된다.
이 필터가 Convolution 연산을 하게되어 아래 처럼 값을 만들어낸다.

이미지의 모든 영역을 돌아다니며 one number 를 계산하게된다. 아래 그림을 보며 이해해보자

초록색이 필터라고 했을 때 이미지에 그려져있는 파란색 선 처럼 옆으로 n 칸씩 움직이며 하나의 값을 계산하여 추출해낸다.
3X3에서 가운데인 2, 2 부분(중앙)에 값이 계산되어 나오게 된다.
그렇다면 당연히 생각할 수 있다. 7X7에서 필터가 연산하여 output을 내보낼 때에는 5X5의 output이 나올 것이다.
위와 같은 경우는 필터가 옆으로 한 칸씩 움직이기 때문에 "stride가 1이다." 라고 말할 수 있다.
그러므로 7X7의 이미지에 stride가 1인 필터연산을 수행하면 5X5의 output이 나온다는 것이고,
stride가 2라면 3X3의 output이 나오게 된다.
그렇다면 전체 이미지 영상 개수가 N개이고, 필터의 크기가 F라고 한다면 (N - F) / stride + 1이 output size가 된다.
위 이미지로 예를 들어보면 N=7, F=3 이니 (7 - 3) / 1 + 1 = 5 이므로 5X5의 ouput이 나온다고 알 수 있고,
만약 stride가 2라면 (7 - 3) / 2 + 1 = 3 이므로 3X3 임을 알 수 있다.
또 경우에 따라서는 만약 이미지에 무의미한 0을 주변에 두른다면 output은 온전히 7X7 로 출력될 수 있을 것이다.
아래와 같은 작업을 zero-padding이라고 한다.

패딩의 두께를 정하는 수식은 다음과 같다. (F-1) / 2 왜냐하면
필터의 사이즈가 3이라고 가정하면 (3-1) / 2 = 1 이니 zero-padding의 두께가 1이면 되는 것이고
필터의 사이즈가 5라고 한다면 (5-1) / 2 = 2의 두께로 zero-padding을 줄 수 있다.
다시 돌아와서 아까 이미지에서 필터가 이미지를 돌아다니며 연산한 값이 나오면 아래 그림과 같이
노란색의 결과 값을 만들어낼 수 있을 것이다.

그 후 노란색을 뒤로 미루고 필터를 하나 더 만들어 또 결과를 낸다면 아래 그림처럼 겹이 쌓일 것이다.

이렇게 얻은 결과를 activation map이라고 한다.

그렇다면 32X32X3의 이미지를 5X5X3 필터 (이미지의 dept이 3이기 때문에 동일하게 사용) 6개를 사용하여 activation map을 만든다면 6장의 결과물을 만들 수 있을 것이다. 그리고 또 만들어진 결과물에 5X5X6 의 필터가 연산하면 dept이 10인 actication map이 만들어진다.
이렇게 연산해나가는 과정을 Convolution layers 라고 한다. (줄여서 conv라고 함)
레이어가 진행될 수록 점점 두꺼워진다고 생각할 수 있다.
아래의 그림은 위의 과정을 시각화 한 것이다.

점점 층이 진행될 수록 High Level Feature를 파악하게 되고 최종적으로 학습된 분류기를 통해 값을 얻어내게 된다.
POOL 과정에 대해 알아보자
pool은 정보 압축, 영역 축소 등의 뜻으로 이해하고 들어가보자.
말 그대로 데이터의 차원을 줄인다거나, 특징 맵의 사이즈를 줄인다고 볼 수 있다, 한 마디로 중요한 정보를 추리는 것이다.
pooling은 conv layer의 사이즈를 작게 만드는 과정이다.

2X2필터를 사용하여 stride가 2일 때 가장 큰 값을 골라서 2X2의 output을 만드는 것이다.
그림의 특징맵에서 가장 강렬하게 반응한 정보만 골라서 축소하는 과정이라고 볼 수 있다.
최종적으로 정리하자면
CONV(필터링) -> RELU(activate) -> CONV(필터링) -> RELU(activate) -> POOL(축소,중요 정보 추출) -> ...반복
-> FC -> 결과이다.
FC란 Fully Connected Layer로 CNN이 추출한 특징을 종합하여 최종적으로 어떤 클래스에 해당하는지 분류하는 단계이며
모든 노드가 FC로 연결되어있어 Fully Connected라고 부른다.
이해가 어렵다면
http://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html
위 링크에 접속하여 JS로 시각화된 CNN을 살펴보자. 각각의 층이 어떤 결과를 내는지 볼 수 있을 것이다.
'인공지능 > CNN' 카테고리의 다른 글
| TensorFlow 1.n 버전에서 tf.layers 를 사용한 CNN 모델 구현 (0) | 2025.05.27 |
|---|---|
| tensorflow를 사용한 CNN 저수준 구현 (0) | 2025.05.27 |