CNN 레이어의 여러 단계 중, Convolution/Pooling에 대해 알아본다.


CNN 은 이미지 분류에 유용하게 사용되는 기술이다. CNN은 1989년 LeCun이 발표한 논문 “Backpropagation applied to handwritten zip code recognition” 에서 처음 소개되었다. 그 당시에는 필기체 인식에 있어 의미있는 결과가 나왔지만 이를 범용화하는데엔 미흡한 부분이 있었다. LeCun은 추후에 LeNet이라는 네트워크를 1998년에 제안하게 되는데 이것이 최초의 CNN 이라고 할 수 있다.


1. 합성곱 신경망(CNN)이란?

합성곱 신경망(Convolutional Neural Network, CNN) 은 이미지 인식, 이미지 분류를 수행하는 주요 신경망 기술이다.



Convolutional layers로 구성된 신경망 (출처 : Medium, Prabhu)


  • 위 그림은 입력 이미지를 처리하고 값을 기준으로 개체를 분류하는 CNN의 전체 흐름이다.
  • 입력 이미지는 필터(Filters), 풀링(Pooling), 완전연결 계층(Fully connected layer, FC)이 있는 일련의 Convolution Layer를 통과하고 Softmax 함수를 적용하여 0과 1 사이의 확률 값으로 개체를 분류한다.


2. 합성곱 신경망(CNN)의 필요성

합성곱 신경망이미지 처리에 탁월한 성능을 보이는 신경망이다. 특히 이미지 처리를 위해 사용되는 다층 퍼셉트론(MLP)의 한계를 보완할 수 있다.

예를 들어, 손글씨를 분류해야하는 상황에서 아래 알파벳이 입력값으로 들어온다고 가정해본다. 아래 6개의 d 손글씨의 input shape는 (10, 10, 1)이라고 가정한다.



손글씨, 알파벳 'd' 이미지 (GoodNotes로 제작)


사람이 보기엔 위 그림이 모두 알파벳 ‘d’로 쉽게 판단이 가능하지만, 기계가 보기에는 각 픽셀마다 가진 값이 대부분 상이하므로 사실상 다른 값을 가진 입력이다. 특히 이미지가 위와 같이 방향이 다르거나 한쪽으로 치우쳐져 있는 등 변형이 존재한다면 다층 퍼셉트론(MLP)로 예측하는데 어려움이 있다.
cf. 다층 퍼셉트론은 입력층으로 1차원 벡터를 사용해야 함

위 손글씨 이미지 중 네 번째 글씨를 1차원으로 변환해보았다. 아래 과정과 같이 2차원 이미지를 1차원으로 변환하게 되면 변환 전에 가지고 있던 공간적인 구조(Spatial Structure) 정보가 유실된다.

  • 공간적인 구조 : 가까운 픽셀 간의 관계
  • : ‘d’는 동그란 부분과 막대기 부분이 붙어 있는데, 막대기의 왼쪽 아래부분에 연결되어있다.
    • 이러한 구조가 1차원 배열로 변환되면 그러한 공간적 구조의 특징을 잃게 됨



손글씨, 알파벳 'd' 이미지의 1차원 변환 과정 (GoodNotes, PowerPoint로 제작)


위와 같은 ‘공간적 구조’ 문제 때문에 이미지의 공간적인 구조 정보를 보전하면서 학습할 수 있는 방법이 필요해졌고, 이를 위해 합성곱 신경망이 사용된다.


3. 합성곱 신경망(CNN) 관련 용어

Conv2D의 기본 구조 : Conv2D(filters kernel_size, padding, strides, input_shape, activation)

(1) 컨볼루션 계층(Convolution Layer)

컨볼루션은 입력 이미지에서 특징을 추출하는 첫 번째 레이어이다. 컨볼루션은 입력 데이터의 작은 사각형을 사용하여 이미지 기능을 학습하여 픽셀 간의 관계를 유지한다. 이미지 매트릭스와 필터 또는 커널과 같은 두 개의 입력을 받는 수학적 연산이다.

✔️ 목표

  • 주변 픽셀 간의 관계를 유지하면서 이미지에서 특징 집합을 추출한다.



그림 1, 출처 : https://poloclub.github.io/cnn-explainer/#article-input



그림 2, 출처 : https://poloclub.github.io/cnn-explainer/#article-input


위 그림 2에서 중간에 있는 숫자들 아래(노란색) 부분은 랜덤하게 정해지는 가중치 값이다.

그림 2에서 이루어지는 컨볼루션 연산은 아래와 같은 방식으로 이루어진다.



이미지 출처 : towardsdatascience by Rukshan Pramoditha - CNN


  • 컨볼루션 작업은 이미지와 필터 사이에서 발생한다.
  • 연산을 결과로 피처맵(Feature map)이 출력된다.
  • 필터 크기(kernal_size)에 따라 출력되는 피처맵의 크기가 달라진다.

(2) 채널(Channel)

CNN 이미지 분류는 입력 이미지를 가져와 처리하고 특정 카테고리로 분류되는데, 컴퓨터는 입력 이미지를 픽셀 배열로 보고 이미지 해상도에 따라 달라진다. RGB 이미지에는 세 가지 색상 채널(Red, Green, Blue)이 있으며 (height, width, 3)으로 표현된다.
cf. 이미지 해상도 hxwxd(h=높이, w=너비, d=치수)



Grayscale image, RGB color image 표현법 (powerpoint로 제작)


  • 이미지는 (높이, 너비, 채널)로 표현되는 3차원 텐서임
    • 높이 : 이미지의 세로 방향 픽셀 수
    • 너비 : 이미지의 가로 방향 픽셀 수
    • 채널 : 색 성분
      • 흑백 이미지 (채널 수 : 1)
      • 컬러 이미지 (채널 수 : 3)

예시로 이해하기

  • 데이터 정보 : Tensorflow 튜토리얼 (MNIST)
# 필요한 라이브러리 로드
import pandas as pd
import tensorflow as tf

# 텐서플로우 내장 데이터셋 : MNIST 로드
mnist = tf.keras.datasets.mnist

# 색상 표현 구간을 0 ~ 1사이로 변환(정규화)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# 특정 데이터 시각화 (임의의 값 출력)
display(pd.DataFrame(x_train[4]).style.background_gradient(cmap='gray'))

28*28 픽셀의 숫자 '9' 손글씨 데이터


숫자 ‘9’ 손글씨 데이터는 흑백 이미지이므로 (28, 28, 1)의 크기를 가지는 3차원 텐서이다. 정규화 전엔 하나의 픽셀 당 0 ~ 255 사이의 값(큰 값)으로 구성된다. 색을 나타내는 범위가 크면 연산 과정에서 속도(연산) 문제가 발생할 수 있기 때문에 0 ~ 1 사이의 값으로 변환했다.

(3) 필터(Filter)/커널(Kernel)

필터는 이미지의 특징을 찾아내기 위한 파라미터로 학습의 대상이며, 합성곱의 가중치에 해당한다.

  • 필터(Filter) : 실제로 커널이 가중치 합산 하는 영역의 크기
  • 커널(Kernel) : Sliding window 하는 영역에서의 크기



출처 : ResearchGate Fig 1 - uploaded by Miguel Nicolau


작은 필터를 여러 개 중첩하면 원하는 특징이 더 돋보이게되면서 연산량이 줄어드는 효과가 있다. 요즘 대부분의 CNN 에서 3 * 3 size를 중첩해서 사용한다.

cf. 학습된 CNN 필터들은 경계선을 찾거나 블러리한 면을 찾는 등 다양한 주파수 필터의 기능을 한다.

(4) 패딩(Padding)

Padding은 Convolution을 수행하기 전, 입력 데이터 주변을 특정 픽셀 값으로 채워 늘리는 것이기 때문에 입력 이미지의 크기를 줄이지 않을 수 있다.

✔️ 목표

  • 이미지가 줄어드는 현상 방지
  • 가장자리(모서리) 부분에 위치한 정보들이 사라지는 문제를 해결하기 위해 사용됨
    • 가장자리 부분의 특징을 조금 더 학습할 수 있도록 함

(5) 스트라이드(Stride)

스트라이드는 필터를 적용하는 간격을 의미한다. 필터는 입력 데이터를 지정한 간격으로 순회하면서 합성곱을 계산한다! stride가 1이라면 필터를 한 번에 한 픽셀씩 이동하고 stride가 2라면 필터는 2칸씩 이동하면서 합성곱을 계산한다.

✔️ 주의

  • stride를 높일 수록 공간적으로 더 작은 출력 볼륨이 생성되어 데이터 손실 우려가 있음
    • 즉, 이 값이 커지게 되면 결과 데이터의 사이즈가 작아짐
    • 데이터 손실 문제 발생



출처 : https://excelsior-cjh.tistory.com/79


위 그림은 1폭 짜리 zero-paddingstride 값으로 1로 적용한 뒤 합성곱 연산을 수행하는 예제이다.

(6) 풀링 계층(Pooling Layer)

풀링 계층은 CNN에서 사용되는 두 번째 레이어 유형이다. CNN에는 풀링 레이어가 여러개 있을 수 있다. 컨볼루션과 풀링레이어는 쌍으로 함께 사용된다.

Pooling을 하면 이미지 크기를 줄여 계산을 효율적으로 할 수 있고 데이터를 압축하는 효과가 있어 오버피팅을 방지할 수 있다. (이미지를 추상화하여 너무 자세히 학습되지 않도록 하여 오버피팅 방지)

✔️ 목표

  • 이미지의 크기를 계속 유지한 채 FC 레이어로 가게 되면 연산량이 기하급수적으로 늘게 된다.
    • 적당히 크기를 줄이고, 특정 feature를 강조할 수 있도록 함
  • 이전 컨벌루션 계층에서 반환된 출력의 차원(픽셀 수)을 줄인다.
  • 네트워크의 매개변수 수를 줄인다.
  • 이전 컨벌루션 계층에서 추출한 피처에 있는 노이즈를 제거한다.
  • CNN의 정확도를 높인다.

✔️ 종류

  • MaxPooling : 가장 큰 값을 반환
  • AveragePooling : 평균 값을 반환
  • MinPooling : 최솟값을 반환



이미지 출처 : https://gruuuuu.github.io/machine-learning/cnn-doc/


CNN에서는 뉴런이 가장 큰 신호에 반응하는 것과 유사하다는 점에서 Max Pooling을 주로 사용한다. Max Pooling을 사용하면 노이즈가 감소하고 속도가 빨라지며 영상의 분별력이 좋아진다고 한다.


✔️ Reference


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기