📌 Intro
이전에는 MNIST 데이터 셋을 이용하여 기본적은 ANN(DNN)모델을 구성해보고 학습 및 추론까지 진행해봤다. 다음에는 CNN으로 모델을 구성하고 진행을 하려고 했는데 그 전에 CNN에 대한 내용을 정리하고 시작하면 좋을 것 같아서 글을 작성하게 되었다.
📌 CNN?
CNN은 Convolutional Neural Network의 줄임말이며 보통 CNN으로 쓰인다. 이는 인간의 시신경을 모방하여 만든 딥러닝 구조 중 하나이며, 특히 이미지 분류에서 좋은 성능을 보이는 것으로 알려져 있다.
CNN은 위의 그림처럼 크게 두 부분으로 나눌 수 있는데 하나는 이미지의 특징을 추출하는 것이고(Feature Learning) 또 다른 하나는 추출한 특징을 이용하여 클래스를 분류(Classification)하는 것이다.
📌 용어 정리
CNN에 대한 설명을 하기 위해 먼저 자주 사용되는 용어에 대해 알아보도록 하자.
- 합성곱(Convolution)
- 필터(Filter), 커널(Kernel)
- 피처맵(Feature map)
- 채널(Channel)
- 스트라이드(Stride)
- 패딩(Padding)
- 풀링(Pooling)
- 플래튼(Flatten)
- 소프트맥스(Softmax)
✔ Convolution & Filter & Feature map
위 그림은 이미지, 필터, 피처맵을 나타낸 그림이다. 이미지는 사실 픽셀 하나하나로 이루어져 있고 픽셀은 모두 다른 값을 가지고 있다. 이 픽셀들이 모여서 하나의 이미지가 되는 것인데, 우리는 픽셀이 9개인 하나의 이미지가 있고, 각 픽셀의 값은 위의 그림처럼 채워져 있다고 가정해보자.
또한 필터는 2X2 크기이며 위와 같은 값을 가지고 있는 필터라고 가정해보자.
Feature map은 이미지와 필터의 합성곱 연산의 결과를 말하는데 이미지로부터 필터를 이용하여 뽑아내는 특징점의 집합정도로 이해하고 넘어가도 된다.
그러면 그림과 함께 스텝을 따라가보며 Feature map이 어떻게 채워지는지 확인해보자.
이미지는 필터의 크기에 맞춰 연산을 진행하게 된다. 이미지 위에 필터를 올려놓고 같은 자리에 있는 숫자끼리 곱한 뒤 모두 더해주는 것이다.
위의 그림에서 (1 x 1) + (2 x 0) + (4 x 0) + (5 x 1) = 6 이 되는 것이다. 따라서 Feature map에서 해당하는 위치에 값을 적어준다.
다음 스텝에서는 위 그림과 같이 이미지 위에 필터를 올려놓는 위치를 옆으로 옮긴다. 단지 위치만 변경된 것이고 연산하는 방법은 같다.
(2 x 1) + (3 x 0) + (5 x 0) + (6 x 1) = 8 이 될 것이다. 이도 마찬가지로 Feature map에서 해당하는 위치에 값을 적어준다.
다음, 다다음 스텝도 같기 때문에 이미지만 첨부하고 설명은 생략하도록 하겠다.
✔ Stride
이미지에 필터를 적용할 때 위의 예에서는 한 칸씩 움직였다. 이 때 움직이는 간격을 Stride라고 한다.
아래 그림은 5x5 크기의 이미지에서 2x2 크기의 필터를 적용할 때 Stride가 각각 1,2,3일 때 필터의 이동을 나타낸 예다.
✔ Padding
위의 예시에서도 보이듯이 이미지를 필터를 통해 Feature map을 추출하면 원래의 사이즈보다 작아지게 된다. 이를 원래의 이미지 크기로 만들어주는 것이 패딩이라고 생각하면 된다.
5x5 크기의 이미지를 3x3 필터를 적용하면 3x3의 Feature map이 나오게 되고 이를 5x5사이즈로 변환하며 빈 공간을 0으로 채워주면 Zero Padding이 되는 것이다.
✔ Pooling
풀링은 이미지 데이터의 공간적인 특성은 유지하며 크기를 줄여주는 역할을 한다. 때문에 전체를 대변하는 특징을 추출할 수 있다는 장점이 있고, 보통 합성곱 연산 후에 넣어준다. 풀링의 종류는 여러가지가 있지만 자주 사용되는 것은 Max Pooling과 Average Pooling 2가지로 볼 수 있다.
Max Pooling과 Average Pooling 모두 Max, Average라는 단어의 뜻에서도 알 수 있듯이 정해진 크기에서 가장 큰 값, 평균 값을 가져오는 것이다. 아래 그림은 Max Pooling의 예시다.
5x5 이미지에서 Stride를 1로 움직이면 3x3의 Pooling 결과가 나오게 된다. (CNN을 사용할 때는 보통 Max Pooling을 사용하는데 이는 결과가 더 좋게 나오기 때문이라고 한다.)
✔ Channel
채널이란 데이터의 차원이라고 생각하면 이해하기 좋다.
지금까지 예로 들었던 이미지는 모두 흑백 이미지를 가정하고 있다. 그 이유는 흑백 이미지는 Grayscale만을 사용하여 이미지를 나타내기 때문에 1차원 데이터이기 때문이다. 하지만 컬러 이미지는 R,G,B 세 개의 값이 합쳐져야 하나의 유효한 값이 된다. 따라서 컬러 이미지는 3차원 데이터 즉 3채널이라고 부를 수 있다. 컬러 이미지의 경우 Feature map을 생성하는 과정은 다음과 같다.
3x3x3 컬러 이미지에 대해 2x2x3 크기의 필터로 Feature map을 뽑아내는 방법은 각 채널에 맞는 이미지와 필터를 계산하여 다시 합쳐주는 방식으로 진행된다.
✔ Flatten Layer
Flatten Layer는 이미지로부터 합성곱 연산, 풀링 연산을 진행하여 특징점들을 추출한 뒤 이를 Fully Connected Layer에 넣어주기 위해 필요한 Layer다. Fully Connected Layer에 데이터를 넣어주기 위해서는 1차원 형태의 데이터가 필요하다. 하지만 합성곱 연산과 풀링 연산을 진행하면 최소 2차원의 결과가 나온다. 이 때문에 Flatten Layer가 필요로 하게 되고 동작은 다음과 같이 진행된다.
✔ Softmax
Softmax는 세 개 이상으로 분류하는 다중 클래스 분류에서 사용되는 활성화 함수이다.
또한 입력받은 값을 출력할 때 모두 0에서 1사이의 값으로 정규화 하며 이의 총 합은 항상 1인 특징을 갖고 있는 함수다.
분류하고 싶은 클래스의 수 만큼 출력으로 구성되며 (만약 MNIST 데이터 셋을 사용한다면 출력의 형태는 10x1이 될 것임) 각 클래스일 확률을 부여하는 것으로 한다. 그 중 가장 큰 확률 값을 부여받은 클래스가 모델이 추론한 결과 라벨이 되는 것이다.
Sigmoid와 많이 비교가 되는데 Sigmoid는 output layer의 값을 보고 임계값보다 크면 1, 작으면 0과 같이 이진분류를 하고 Softmax는 output layer로 나오는 모든 값들을 normalize한 뒤, 각각에 대한 확률을 구한다.
- 장점 : 총합이 1이므로 어떤 분류에 속할 확률이 가장 높을지 쉽게 알 수 있다.
- 단점 : 은닉층(hidden layer)에서 softmax함수가 사용되는 경우, 기울기 소실 문제 등의 이유로 기울기를 제대로 찾지 못하게 되고, 학습 효율성이 감소할 수 있다.
📌 정리
지금까지 간략하게 CNN에 대해 그리고 CNN을 공부하고 이해하는데 필요한 용어까지 정리해보았다. CNN에 대한 나의 이해를 높이기위해 내용을 작성하게 되었으며 이해하고 있다고 생각했던 부분도 글을 작성하며 부족함을 느꼈으며 정리를 시작한 것은 시간이 들지만 아주 좋은 선택이라고 생각된다.
📌 참고
[1] https://yjjo.tistory.com/8
[2] https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53
[3] https://m.blog.naver.com/wideeyed/221021710286