AI

[CNN] 합성곱 층

킹형준 2025. 3. 18. 17:11

CNN의 동기

옛날 옛적 유명한 뇌과학자가 시각 피질을 연구했는데, 그 안에 많은 뉴런이 작은 "국부 수용장(local receptive field)" 를 가진다는 것을 발견했다.

 

국부 수용장이란 쉽게말해 한 뉴런이 받아들일 수 있는 원본 이미지의 작은 구역이다.

 

우리 눈이 특정 영역만 보고 그 정보를 모아서 전체 장면을 인식한다는 것인데, 이처럼 CNN도 작은 패턴을 먼저 보고 이를 조합해 더 큰 패턴을 이해하도록 만들어졌다.

 

합성곱 층

합성곱 층은 CNN의 핵심 요소로, 이미지의 특징을 추출하는 역할을 한다.

 

첫 번째 합성곱 층의 뉴런은 입력으로 들어온 모든 이미지와 연결되는 것이 아니라 각 뉴런마다 국부 수용장에 속한 픽셀에만 연결된다.

 

두 번째 합성곱 층의 뉴런은 각 뉴런마다 연결될 수 있는 작은 사각 영역 안에 위치한 뉴런에만 연결될 수 있다.

 

층이 깊어질 수록 해당 뉴런이 갖는 국부 수용장의 크기, 다시 말해 원본 이미지에서 받아들이는 영역은 커진다. 첫 번째 층의 뉴런이 갖고있던 국부 수용장의 크기가 3x3 이라고 할 때, 두 번째 층의 뉴런이 3x3 크기 만큼 첫 번째 층의 뉴런과 연결될 때 원본 이미지와는 5x5 만큼 연결될 것이다. 

 

어떤 층의 i행, j열에 있는 뉴런은 이전 층의 i에서 i + f_h - 1 까지의 행과 j에서 j + f_w - 1 까지의 열에 있는 뉴런의 출력에 연결된 다. 이 때 f_h와 f_w는 해당 수용장의 높이와 너비이다.

 

필터

국부 수용장은 한 뉴런이 입력 데이터에서 볼 수 있는 영역,

필터는 한 뉴런이 "이전 층에서" 데이터를 가져오는 작은 영역을 뜻한다.

 

필터는 "커널" 과 같은 의미로, 이전 층에서 정해진 크기만큼의 데이터(주로 3x3 행렬)를 가져와 합성곱 연산을 수행한다. 

 

 

이 합성곱 연산을 반복하면 출력의 크기가 줄어들 수 있다.

 

예를 들어, 입력 이미지가 5x5 이고 

1   2   3   4   5  
6   7   8   9   10  
11  12  13  14  15  
16  17  18  19  20  
21  22  23  24  25

 

필터(커널)이 아래와 같다면

0   1   0  
1  -4   1  
0   1   0

 

1. 필터를 0,0 에 놓고 3x3 데이터를 가져옴

1   2   3  
6   7   8  
11  12  13

-> 3x3 필터와 합성곱 연산을 수행해서 결과 값을 생성

 

2. 필터를 오른쪽으로 한 칸 이동하여 3x3 데이터를 가져옴

2   3   4  
7   8   9  
12  13  14

-> 3x3 필터와 합성곱 연산을 수행하여 결과 값을 생성

 

이 때, 필터를 이동시키는 수직 또는 수평 방향 스텝 크기를 "스트라이드" 라고 한다.

 

이런식으로 오른쪽 아래 끝까지 가면 결과 행렬은 3x3 이 된다.

 

이는 (5 - 3) + 1 = 3x3 이 된 결과임.

 

합성곱 연산 결과의 행렬 크기를 이전 층과 같게 하기 위해서 입력 층에(또는 이전 층에) 주위에 0을 추가하는게 일반적이다.(이를 제로 패딩이라고 한다.)

 

Feature Map

합성곱 층에서 필터를 적용시킨 결과를 특징 맵(Feature Map) 이라고 한다.

입력 이미지에서 특정 패턴을 강조하고 불필요한 정보를 줄인다. 예를들어 필터가 흰 수직선이라면 합성곱 결과로 나온 특징 맵은 흰 수직선이 강조된 이미지가 될 것이다.

 

앞서 합성곱 층을 설명할 때 2차원 행렬로 표현한 바 있다.(실제 CNN에서는 이미지를 더 잘 표현하고 층을 더 쉽게 연결하기 위해 2D 데이터를 사용한다.) 하지만 Feature Map은 하나의 합성곱 층 마다 여러개의 필터를 갖고 각 필터마다의 특징 맵이 나오므로 3차원 데이터로 표현되어야 한다.

 

하나의 합성곱 층이 여러 개의 필터를 동시에 적용시켜 입력에 있는 여러 개의 특성을 감지할 수 있게 된다.

 

입력 이미지는 컬러 채널마다의 여러 서브 층으로 구성되기도 하는데, RGB의 세 가지로 구성되는 것이 일반적이다. 흑백 이미지는 하나의 채널만 가지며, 위성 이미지 같은 경우에는 매우 많은 채널을 가질 수 있다.

 

예시

코드를 통해 예시를 들어보자.

 

from sklearn.datasets import load_sample_images
import tensorflow as tf

images = load_sample_images()["images"] # image load
images = tf.keras.layers.CenterCrop(height=70, width=120)(images) # 높이, 너비 수정
images = tf.keras.layers.Rescaling(scale=1.0 / 255)(images) # 0~1 값으로

 

이렇게 불러온 images 데이터의 shape를 찍어보면

[2, 70, 120, 3] 이 나온다.

 

이는 해당 모델이 2개의 데이터를, 각 이미지의 높이는 70, 너비는 120, 채널은 3개를 갖는다는 뜻이다(RGB).

 

7x7 필터 32개짜리 2D 합성곱 층을 만들고 위 데이터에 적용시켜보자.

conv_layer = tf.keras.layers.Conv2D(filters=32, kernel_size=7)
fmaps = conv_layer(images)
fmaps.shape

 

[2, 64, 114, 32] 가 출력되는데,

 

첫 번째, 채널 갯수가 32개이다 : 32개의 특징 맵이 추출되었기 때문이다. RGB 3개의 채널은 이 특징 맵에 반영되어 있을 것이다.

두 번째, 이미지 크기 픽셀이 6만큼 줄었다 : 필터의 크기가 7이지만 제로 패딩이 들어가지 않았기 때문에 (7-1)픽셀 만큼 정보를 잃었다.