본문 바로가기
딥러닝

[딥러닝] CNN(Convolutional Neural Network) 기본 구조

by 배써니 2024. 1. 29.

 

CNN이란?

 

CNN은 Convolutional Neural Network의 약자로, 주로 이미지 처리와 관련된 작업에서 사용되는 딥러닝 신경망 구조이다. CNN은 주로 이미지 분류, 객체 감지, segmentation과 같은 컴퓨터 비전(Computer Vision, CV) 작업에 특화되어 있다.

https://blog.naver.com/intelliz/221709190464

 

 

그렇다면 왜 CNN이 이미지 처리 및 패턴인식에 적합한 딥러닝 모델로 사용될까?

 

이에 대한 답을 찾기 위해서는 DNN(Deep Neural Network)에 대한 이해가 필요하다. DNN은 주로 1차원 형태의 데이터를 사용하는데, 그림이나 이미지와 같은 2차원 형태의 데이터를 사용하려면 1차원의 형태로 flatten 해야한다.

Image(7x7)의 픽셀값을 Flatten해서 Feature로 사용

 

여기서 발생하는 이미지의 공간적/지역적 정보의 손실 문제를 보완하기 위해 등장한 것이 CNN이다. CNN은 기존의 완전연결계층(Fully-Connected Layer)으로만 이루어진 형태와는 다르게, 이미지를 raw data의 형태로 받음으로써 2차원 형태의 배열을 그대로 사용할 수 있다. 즉, 기존의 형태를 변형하지 않고도 feature들을 반영할 수 있다.

 

 

그럼 CNN의 구조와 용어에 대해 구체적으로 알아보자.

 

CNN의 기본구조

 

위 사진에서도 볼 수 있듯이, CNN은 이미지의 특징을 추출하는 부분(Convolutional Layer/Pooling Layer)클래스를 분류하는 부분(Fully-Connected Layer)으로 나뉜다.

 


 

그럼 각 단계별로 하나씩 살펴보도록 하겠다.

Convolutional Layer

 

Convolutional Layer 단계에서는 입력 데이터(input data)와 필터(filter, 혹은 커널kernal)간의 합성곱 연산을 적용하여, feature가 강조된 이미지를 얻을 수 있다.

계산 예시는 아래와 같다. (처음과 마지막 계산식만 첨부)

 


 

합성곱 연산의 기본적인 원리에 대해 이해했다면, 다음 단계로 넘어가보자.

 

 

Stride

 

위와 같이 필터를 적용할 때에는 필터의 이동 단위를 의미하는 stride(보폭)를 설정해야 한다. 쉽게 말해, 몇 칸씩 이동하며 필터를 적용할 것인지를 결정해주는 것이다. stride가 1이면 필터가 한 칸씩 움직이고, stride가 2이면 두 칸씩 움직인다.

아래 사진은 stride가 1인 경우와 2인 경우의 결과값을 이미지로 나타낸 것이다.


 

정리하자면 원본 이미지의 크기가 m x m이고, 필터 커널의 크기가 n x n, 스트라이드의 크기를 s라고 하면, 필터링을 통해 얻은 이미지는 {(m-n)/s}+1 x {(m-n)/s}+1의 크기가 된다.

 

[Stride=1]

원본 이미지: 4x4

필터의 크기: 2x2

스트라이드의 크기: 1

최종 이미지의 크기: {(4-2)/1}+1 * {(4-2)/1}+1 = 3x3

 

[Stride=2]

원본 이미지: 4x4

필터의 크기: 2x2

스트라이드의 크기: 2

최종 이미지의 크기: {(4-2)/2}+1 * {(4-2)/2}+1 = 2x2

 

Weight Sharing 가중치 공유

 

위와 같이 필터를 움직이면서 계산을 해주면 필터링이 끝난다. 이렇게 필터링 하여 생성된 지도를 특성 지도(Feature Map)이라고 한다.

또한, 지정된 stride에 맞게 필터를 옮길 때마다 동일한 필터를 적용하는 것을 가중치 공유(Weight sharing)라고 한다. 이를 통해 학습해야 할 파라미터의 수를 대폭 줄여 효율성을 높일 수 있다.

 

 

Padding (Zero Padding)

위와 같이, 5x5 이미지에 3x3 필터를 적용하면, Feature Map의 크기도 3x3으로 줄어들게 된다. 또한 가장자리에 있는 픽셀 값들은 안쪽에 있는 픽셀 값보다 Convolution이 적게 반영된다. 이러한 단점들을 보완하여 기존의 사이즈를 유지하고자 도입한 개념이 Padding이다.

 

[Padding 사용 전]

https://deeplizard.com/learn/video/qSTv_m-KFk0


[Padding 사용 후]

https://deeplizard.com/learn/video/qSTv_m-KFk0

 

Padding은 입력 데이터(input data)의 가장자리에 정해진 픽셀만큼 특정 값을 채워넣는 것을 의미하며, 보통 0을 채워넣어 입출력 이미지의 크기를 동일하게 해주는 Zero Padding이 일반적이다.

 

 


Activation Function 활성화 함수

 

필터 커널을 이용해 Convolution 계산이 완료되면 특성 지도의 각 픽셀에 있는 데이터를 활성화 함수에 적용해 좀 더 판별력 있게 만든다. 여러 활성화 함수 중, ReLU함수를 많이 사용이 되는데, 이를 이용해 입력데이터를 적절히 활성화까지 하면 필터링 과정이 완료된다.

ReLU 함수 적용 전/후

 

사진을 통해서도 확인할 수 있듯이, 활성화 함수(ReLU)를 적용한 후에 이미지의 윤곽선이 매우 잘 추출되었다.

 


Pooling Layer

 

합성곱 과정을 거친 뒤, 이미지의 크기를 그대로 유지한 채 Fully Connected Layer로 가게 된다면 연산량이 기하급수적으로 늘 것이다. 따라서 CNN의 학습속도를 향상시키기 위해 Feature Dimension을 줄이는 단계가 필요한데, 이 과정이 Pooling Layer이다.

Pooling이란, 2차원 이상의 데이터의 공간적인 차원을 축소를 위한 연산이다. 일반적으로 맥스 풀링(Max Pooling)과 평균 풀링(Average Pooling)이 적용되어 Feature Map의 크기를 감소시킨다.

" 사이즈를 줄여나가며, 더욱 추상화 해나간다. (Max Pooling)"

 

 


Fully Connected Layer

 

 

 

Classification에서는 다음과 같이 단계별로 진행된다.

 

  • Flatten   |  ooling Layer 단계를 거쳐 나온 Feature Map을 1차원 벡터로 Flatten 한다. 이는 고차원의 데이터를 1차원으로 변환하는 과정이며, Flatten된 벡터는 Fully Connected Layer의 input이 된다.

 

  • Fully-Connected Layer   |   CNN의 최상단에 위치하며, 추출된 특징들을 바탕으로 최종적인 결정을 내린다. 이는 전통적인 신경망(MLP) 구조와 동일하게 모든 뉴런이 서로 연결되어 있다. Flatten된 입력 벡터는 각각의 노드에 가중치로 연결되며, 각 연결은 가중치를 곱하고 편향(bias)을 더하는 연산을 수행한다.

https://blog.naver.com/intelliz/22170919046

 

  • Activation Function   |  Fully Connected Layer의 Output에 비선형 활성화 함수(보통 Softmax함수)를 적용하는 단계이다. 이 활성화 함수는 네트워크의 비선형성을 도입하고 모델이 더 복잡한 패턴을 학습할 수 있다.