[Home] AI로 돌아가기

🔗 관련 문서: Wikipedia - Convolutional Neural Network · Wikipedia - Image Processing Kernel

CNN합성곱(Convolution)

합성곱은 이미지에서 의미 있는 특징(Feature)을 추출하기 위해 작은 행렬(필터·커널)을 이미지 위로 슬라이딩 하며 각 위치에서 원소별 곱합산을 수행해 새로운 행렬인 특징 맵(Feature Map)을 만드는 연산이다.

(1) 정의와 직관

합성곱은 이미지의 국소 영역(local receptive field)을 살펴보며 테두리, 모서리, 곡선과 같은 패턴을 검출한다. 얕은 층에서는 선·엣지 같은 단순 특징을, 깊은 층으로 갈수록 사물의 부위·윤곽 등 고차 특징을 학습한다.

(2) 수식과 출력 크기

입력 크기가 H×W, 커널 크기가 k_h×k_w, 보폭(stride) s, 패딩 p일 때 유효(valid) 합성곱의 출력 크기는 다음과 같다.

out_h = floor((H - k_h + 2p) / s) + 1
out_w = floor((W - k_w + 2p) / s) + 1

딥러닝 프레임워크의 기본 구현은 커널을 뒤집지 않는 상관(cross-correlation) 방식을 주로 사용한다.

(3) 수치 예시 (5×5 입력 · 3×3 커널)

입력과 커널, 그리고 결과 특징 맵을 아래 표처럼 계산한다.

입력(5×5)
1 1 1 0 0
0 1 1 1 0
0 0 1 1 1
0 0 1 1 0
0 1 1 0 0

커널(3×3) — 세로 엣지 감지
-1  0  1
-1  0  1
-1  0  1

출력 특징 맵(3×3)
 2  0 -2
 3  2 -2
 3  1 -2
    

(4) 시각화

...
커널(kernel)을 슬라이딩(sliding, 한 칸씩 옮김)하며,
원소별 곱·합으로 특징 맵(feature map)을 생성

예: 좌상단 3×3 윈도우와의 원소별 곱의 합은 2가 된다.

코딩: MATLAB 합성곱 연산 예시

>> k = [-1, 0, 1;
-1, 0, 1;
-1, 0, 1]
k =
    -1     0     1
    -1     0     1
    -1     0     1

>> f1 = [1 1 1;
0 1 1;
0 0 1]
f1 =
     1     1     1
     0     1     1
     0     0     1

>> f1.*k
ans =
    -1     0     1
     0     0     1
     0     0     1

>> sum(sum(f1.*k))
ans =
     2
    

(5) 참고/메모