본문 바로가기

[Classification] Convolution Neural Network(CNN, 합성곱 신경망)

Derrick 발행일 : 2022-06-04
728x90
반응형

 

 Convolution Neural Network(CNN)은 인간의 시신경을 모방한 딥러닝 구조 중 하나이다.
이미지 분류 작업에 매우 높은 성능을 보이며, 이전의 MLP 방식의 이미지 처리와는 다르게 공간적인 구조 정보(Spatial structure)를 유지하면서 학습시키는 방식으로, 이를 위해 사용하는 것이 "CNN"
- 공간적인 구조 정보란, 가까운 거리 내 픽셀들끼리의 연관성을 의미한다.
- 이번 글에서 간단한 용어와 원리부터 연산하는 실습까지 공부해보자!

 

1. 기본 용어 정리

1-1. Convolution(합성곱)?

Convolution 연산공간 영역 필터링을 위한 핵심 연산 방법으로, 입력된 이미지 위에서 stride 값만큼 filter(=kernel)을 이동시키면서 겹쳐지는 부분의 각 원소의 값을 곱한 후 모두 더한 값을 출력하는 연산이다.

 

[ 3x3 Convolution Operation ]

 

여기서 공간 영역 필터링이란, 측정 픽셀과 그 주변 픽셀들을 이용하여 새로운 픽셀값을 얻는 방법이다.
 이 때 어느 범위까지 연산에 활용할 것인지 결정하는 역할을 하는 것이 바로 커널(kernel filter)라고 하며 아래의 그림은 3x3 사이즈의 input matrix(=image)에 대한 CNN을 적용한 것을 도식화한 것이다.

 

0
[ 2D Convolution Operation ]

1-2. Convolution Layer가 왜 필요할까?

[ 3x3 convolution flatten ]

 

 딥러닝으로 이미지를 분석한다는 것은 위의 3x3의 matrix에서 볼 수 있듯이 펼쳐서(Flatten), 각 픽셀마다 가중치를 고려하여 연산 결과를 출력하는 원리이다. 하지만, flatten을 해서 분석하게 되면 데이터의 형상(= 공간적인 구조)를 무시하게 되어 각 픽셀 간의 밀접한 상관 관계를 고려하지 못하게 된다.
 → 이러한 문제를 해결하기 위해 등장한 것이 바로 "Convolution Layer"이다.

1-3. Channel (채널)

 컴퓨터가 숫자로 인식하는 이미지는 (높이, 너비, 채널)이라는 3차원 텐서이다. 여기서 높이(height)는 이미지의 세로 픽셀 수, 너비(width)는 이미지의 가로 픽셀 수, 채널(channel)은 색 성분을 의미한다. 흑백 이미지의 경우 채널의 수는 1이고, 컬러 이미지는 빨강(Red), 초록(Green), 파랑(Blue) 각각의 명암을 이용하여 색상을 표현한다.

 

[ Structure of Color image ]

   

[ 3 channel of Color image ]

 

- 위의 사진처럼 4x4 이미지일 경우, 컬러 이미지는 (4,4,3), 흑백 이미지는 (4,4,1) 사이즈의 3차원 텐서로 표현된다.

1-4. Stride (스트라이드)

 필터(kernel)를 입력 데이터에 적용될 때 한번에 움직이는 간격을 Stride라고 한다.
커널이 한 칸씩 움직이는 1, 두 칸씩 움직이게 되면 2가 되는 원리이다.

 

1-5. Padding (패딩)

 패딩(Padding)입력 데이터의 가장자리에 지정된 폭만큼 행과 열을 채워넣는 것을 말한다.
보통 값을 0으로 채우는 방식인 'zero-padding'을 사용하며, 아래 예시를 통해 확인할 수 있다.

 

[ Convolution Operation - 3x3 kernel, 1 stride and 1 padding ]

 

 일반적으로 합성곱 연산으로 얻어진 특성 맵(Feature map)은 입력보다 크기가 작아지게 되는데,
이 경우 이미지 모서리 부분의 정보 손실이 발생할 수 있어, 이를 최대한 줄이기 위해 Padding을 적용하게 된다.
 위의 사진의 경우, 5x5 사이즈의 이미지에 1폭의 zero-padding을 적용하면 이미지는 7x7 사이즈가 되며 여기에 3x3 kernel filter를 통해 1 stride로 convolution 연산을 하면, feature map은 기존의 입력 이미지와 동일한 5x5로 생성되게 된다.

1-6. Pooling Layer

 Pooling layer(풀링 층)에서는 feature map을 다운샘플링하여 크기를 줄이는 연산이 이루어진다.
이때 데이터의 공간적 특성을 그대로 유지하면서 크기만을 줄이고, 특정위치에서 큰 역할과 영향력이 있을 특징을 추출할 수 있다는 장점이 있다.

 

0

 

 Pooling을 처리하는 방법으로는 Max, Average, Min 등이 있지만, 주로 Max Pooling을 사용한다. 또한, Pooling을 통해 크기가 줄어들어 학습할 가중치를 크게 줄일 수 있으며 이는 Overfitting 개선에도 도움이 된다.

 

2. Convolution Operation

CNN 알고리즘의 구조와 다중 채널일 경우의 CNN 연산이 어떻게 적용되는지 살펴보자.

2-1. CNN의 구조

[ A Structure of Convolution Neural Network ]

 

 CNN이미지의 특징을 추출하는 영역클래스를 분류하는 영역으로 나눌 수 있다.
특징을 추출하는 부분은 Convolution layer와 Pooling layer를 여러 겹으로 deep하게 쌓는 형태로 구성되어 있다. (Conv + Maxpool).
 → 이미지의 클래스를 분류하는 부분은 Fully Connected Layer (FC layer)로 분류를 한다.

 

2-2. Multi-channel의 CNN operation

다수의 채널(Multi-channel)를 가진 입력 데이터를 가지고 Convolution 연산을 한다면, kernel의 채널 수도 입력의 채널 수만큼 존재해야 한다. (입력 데이터의 채널 수 = 커널의 채널 수)

 

[ Multi-channel Convolution Process ]

 

[ Multi-filter Convolution Operation (Color image) ]

 

 위의 그림을 통해 channel의 수가 3개인 입력데이터와 커널의 합성곱 연산을 확인할 수 있다.
각 채널 간 합성곱 연산을 마치고, 그 결과값을 모두 더해서 하나의 채널을 가지는 Feature map을 만든다.
- 주의점 : 사용되는 kernel은 3개의 channel을 가진 1개의 kernel이라는 점. (3개의 kernel X)
- 연산 결과로 얻은 Feature map의 채널 차원은 RGB와 같은 컬러의 의미를 담고 있지는 않다.
- 연산에 다수의 커널을 사용할 경우, 사용한 커널의 수는 결과로 생성되는 Feature map의 채널 수가 된다.

2-3. CNN Implementation

Convolution layer를 통과하고 나온 output image의 크기를 예측하고, 간단한 코드 구현으로 직접 결과를 확인해보자

 

[ Formula for Output dims calculation ]

 

Q) 아래 예제를 통해 output image size를 구하시오

1)
 - input image size = 64 x 64
 - Filter size = 7 x 7
 - Stride = 2
 - Padding = 0

2)
 - input image size = 32 x 64
 - Filter size = 5 x 5
 - Stride = 1
 - Padding = 0
A) 위 공식에 대입하면, 각각 "29, (28 x 60)"이며 코드를 확인해보자
 - nn.Conv2d( in_channels, out_channels, kernel size, stride, padding, bias=True )
 - input : ( batch_size(N), channel(C), height(H), width(W) )

 

import torch
import torch.nn as nn

# 1)
conv = nn.Conv2d(1,1,7,stride=2, padding=0)
input = torch.Tensor(1,1,64,64)
out = conv(input)
out.shape

 

>> torch.Size([1, 1, 29, 29])

 

# 2)
conv = nn.Conv2d(1,1,5)                   # default : stride = 1, padding = 0
input = torch.Tensor(1,1,32,64)
out = conv(input)
out.shape

 

>> torch.Size([1, 1, 28, 60])

 

 

References >

  • 파이토치로 시작하는 딥러닝 기초(boostcourse), 모두의 딥러닝
  • 이미지를 이용한 딥러닝의 개요, 인실리코젠
  • Yjjo's Tistory(https://yjjo.tistory.com/8)

 

 

댓글