흑백 이미지는 2차원의 행렬(Width, Height)로 표현할 수 있다.
행렬은 흑백의 톤(짙고 엷은 정도)을 실수 값으로 표현
8bit: 1~256 / 16bit: 1~65536
컬러 이미지는 3차원의 Tensor로 표현됨: Width, Height, RGB
각각의 행렬은 색의 톤을 실수 값으로 표현
8bit: 1~256 / 16bit: 1~65536
예를 들어 우리가 흔히 보는 모든 이미지나 비디오 데이터는 위 사진처럼 RGB의 픽셀값들로 나타낼 수 있다.
Red의 이미지를 확대하면 각각의 픽셀 값을 알 수 있다.
각각의 픽셀을 하나의 변수로 간주하여 모델링
N1 = 400(width) x 700(height) x 3(RGB) = 840,000개
N2의 크기도 변수의 수에 맞춰서 정함 ->
(840,000 x N2) 파라미터 ->
Input layer와 hidden layer 사이에 너무 많은 가중치 -> 학습이 어렵다!
기존에는 변수가 많아서 학습이 어려웠을 때의 방안은 아래와 같았다.
이미지 데이터는 아래와 같은 특징이 있다.
이미지의 경우 인접 변수(픽셀)간 높은 상관관계를 가짐 (Spatially-Local Correlation
)
이미지의 부분적 특성 (e.g, 눈, 귀)은 고정된 위치에 등장하지 않음 (Invariant Feature
)
그렇다면 이러한 이미지 데이터의 특성을 반영하여 모델을 구성하면 성능이 더 좋아지지 않을까?
Spatially-local correlation
을 고려하기 위하여 Sparse Connection
구성
Invariant feature
를 추출하기 위해 Shared Weight
개념 이용
위의 둘을 실현시킨 방법이 Convolution
CNN이란?
- 이미지 데이터의 특성을 잘 반영할 수 있는 인공신경망 모델
- 2D 혹은 3D구조를 유지하면서 학습
- 일반적인 CNN은
Convolution
연산,Activation
연산,Pooling
연산의 반복으로 구성됨
- 일정 횟수 이상의 Feature Learning 과정 이후에는
Flatten
과정을 통해 이미지가 1차원의 벡터로 변환됨
위 사진은 stride
를 1로 하여 3x3 Filter
를 Convolution
하는 과정이다. stride란 필터의 적용 위치 간격이다.
Convolution
결과 3x3의 Feature Map이 나온 것을 확인할 수 있다.
위 사진은 stride
를 2로 하여 3x3 Filter
를 Convolution
하는 과정이다.
이번에는 처음과 다르게 Convolution
결과가 2x2의 Feature Map이 나온 것을 확인할 수 있다.
stride
를 크게 하는 것은 이미지의 특징을 놓칠 가능성이 증가하고, 이는 성능 악화로 이어질 수 있다는 단점이 있다.
위 사진은 4x4 이미지 데이터와 3x3 filter를 Convolution
하는 과정의 다른 예시이다.
Convolution
을 통해 학습된 값들의 비선형 변환
ReLU를 주로 사용
Convolution
결과 이미지가 입력 이미지의 크기와 같으면 편리할 때가 많음
가장자리에 있는 픽셀들은 중앙에 위치한 픽셀들에 비하여 Convolution
연산이 적게 수행됨
이를 위한 해결책으로 원 이미지 테두리에 0의 값을 갖는 픽셀 추가
테두리에 추가된 0값의 픽셀 -> Pad, 테두리에 추가된 0값의 픽셀 추가 -> Zero Padding
Zero-padding
, 1 stride
를 적용한 Convolution
연산 예제이다.
위 그림을 보면 가장자리에 위치한 픽셀들의 데이터를 균등하게 반영함을 알 수 있다.
Feature Map의 공간적 크기를 줄이자
일정 영역의 정보를 축약 -> Pooling
Max Pooling
, Average Pooling
(이미지 분석에서는 주로 Max Pooling
)
Pooling window 크기: 주로 Stride값과 동일하게 설정
Pooling 층의 유닛에도 활성화 함수를 적용하는 것은 이론적으로 가능 -> 보통은 적용 X
Pooling 시 padding은 보통 사용 X
Flattening
위의 식은 암기할 필요없이 식과 예제를 보며 이해하기만 하면 된다.
cf) Filter의 개수 = Output 채널의 개수
AlexNet
과 거의 유사하게 동작하지만 차이점이 2가지 존재한다.
다른 CNN 모델들과 GoogLeNet
모델의 가장 큰 차이점은 1x1 convolution 과정을 사전에 한 번씩 거친다는 점이다.
GoogLeNet
모델에서의 inception module
은 1x1 convolution 과정을 거치는데 이는 중요한 역할을 한다.
위 그림을 보면, 1x1 convolution 과정을 진행한 후 연산량을 계산하면 약 5.3M이 나온다.
1x1 convolution 과정을 진행하지 않았을 때의 계산량은 112.9M으로 1x1 convolution 과정을 진행하면 연산량이 몇십배가 줄어듬을 확인할 수 있다.
1x1 convolution 과정을 진행하지 않고 연산을 했을 때 854M의 연산량이 도출됨을 알 수 있다.
그러나 1x1 convolution 과정을 진행하고 연산을 한다면 358M의 연산량으로 이전 과정에 비하여 월등히 연산량이 줄었음을 알 수 있다.
ResNet
은 이전에 배웠던 여러 CNN모델들과 비교할 수도 없이 layer의 개수를 매우 많이 늘렸다.
그림만 보아도 layer의 개수가 현저히 많아진 것을 확인할 수 있다.
layer의 수를 늘리면 연산량이 필연적으로 많아지고, Gradient가 소실되는 문제가 발생할 수 있다.
ResNet
은 이러한 문제를 해결하기 위하여 skip connection
이라는 것을 도입하였다.
오늘은 CNN 모델의 전체적인 과정과 흐름을 간단하게 알아보았다.
또한 필자는 고려대학교 김성범 교수님이 운영하시는 유튜브 채널을 보고 공부한 내용을 포스팅 하였으므로 아래 출처를 남긴다.
https://www.youtube.com/@user-yu5qs4ct2b