CNN이란?
합성곱 신경망은 시각적 영상을 분석하는 데 사용되는 다층의 피드-포워드적인 인공신경망의 한 종류로, 이미지 학습에 효율적인 알고리즘 입니다. 이미지 내의 대상의 특성을 관찰합니다
cnn은 크게 convolution layer(합성곱층)과 pooling layer(풀링층)으로 구성되어 있습니다.
Convolution layer (합성곱 층)
들어가기 전, 컨볼루션층을 사용하는 이유?
우리가 자주쓰는 Dense layer은 완전연결층입니다. 완전연결층은 1차원 배열의 형태의 데이터를 통해 학습하는데, 이때 단순히 데이터를 펼쳐서 사용하기 때문에 각 이미지 픽셀의 관계를 고려하지 않아 공간정보를 손실하며, 2차원 배열을 1차원 배열의 형태로 변환했을 때, 데이터의 본래 특성를 잃어버린다는 단점이 있습니다. 이는, 완전연결층에서는 이미지 내의 객체 특징들을 따로 관찰하는 것이 아니라 이미지 데이터의 전역적 특징을 관찰함을 말합니다.
하지만, 컨볼루션 층에서는 이미지 픽셀 사이의 관계를 고려해 지역적 특징을 학습하여 공간정보를 유지합니다. 이를 위해 컨볼루션 층에서는 국소적 연결을 하게 됩니다.
① 국소적 연결 (local connected)
국소적 연결? 각 뉴런이 이전 층과 연결될 때, 모든 부분과 연결 되는 것이 아닌 국소적인 일부 영역에 연결되는 것입니다
- 이미지 픽셀 사이의 관계를 고려하기 때문에 근접한 영역의 피처들에 집중해서 더 잘 관찰할 수 있습니다 (= "공간 정보를 유지한다")
- 메모리와 컴퓨팅 코스트를 줄이는 효과를 줍니다
② 파라미터 공유 (parameter sharing)
파라미터 공유? 같은 피처에 대해 같은 weight(파라미터)를 공유하는 것입니다.
- 학습할 파라미터 수를 줄여줍니다
- 이미지 내에 객체가 어떤 위치에 있든 그 객체의 특징을 일관되게 관찰합니다. (translate invariant,병진대칭하게 작동)
[ channel, 채널 ]
학습중에, '나'와 '4'처럼 비슷한 피처에 대해 같은 피처로 관찰되는 경우가 발생할 수 있겠죠. 그래서 공유된 파라미터에 너무 의존적이지 않기 위해 '채널' 개념이 생겼습니다.
- 이미지는 (높이, 너비, 채널)이라는 3차원 텐서입니다.
- 높이는 이미지의 세로 방향 픽셀 수, 너비는 이미지의 가로 방향 픽셀 수, 채널은 색 성분을 의미합니다.
- 흑백 이미지는 채널 수가 1이며, 각 픽셀은 0부터 255 사이의 값을 가집니다.
③ 컨볼루션 연산 (convolution operation)
컨볼루션 층은 주어진 입력 데이터에서 컨볼루션 필터를 활용하여 원소별 곱과 윈도우 슬라이딩(window sliding)을 행하는 컨볼루션 연산을 통해 특징 맵을 만들게 됩니다.
- 윈도우 슬라이딩(window sliding) : 컨볼루션 필터가 정의된 stride의 크기 만큼 창문을 닦듯이 미끄러지면서 입력데이터를 훑는 것
- 필터가 일정 방향으로 stride의 크기 만큼 움직이면서 원소별 곱을 수행
[ filtter ]
'커널'이라고도 하는 필터는 이미지 특징을 찾아내기 위한 공용 파라미터 입니다. 컨볼루션 층에서는 여러 개의 컨볼루션 필터를 활용하여 이미지에 내포된 다양한 정보들을 학습하고 인식할 수 있습니다.
- 컨볼루션 필터의 파라미터는 학습을 통해 적절히 조정됩니다.
- 예를 들어, 객체의 가장자리를 검출한다고 했을 때, 가장자리를 검출하는 필터를 직접 정의해서 사용하지 않아도 컨볼루션 필터는 학습을 통해 파라미터들이 적절하게 조정되어 가장자리를 검출할 수 있습니다.
- filter size는 보통 3x3을 사용합니다.
- 더 큰 크기의 필터(5x5, 7x7)은 사용되는 파라미터 수에 비해 비효율적입니다.
- 특수하게 1x1 filter size를 쓰는 경우가 있습니다
- input shape를 유지하면서 채널 수를 조정하기 위해
- 비선형 변환효과를 주기 위해
- 계산 파라미터를 줄이기 위해
[ stride ]
필터(커널)의 이동범위입니다
- 위의 그림 예시에서는 1x1 stride를 사용하였는데, 1x1보다 큰 stride를 사용할 경우 특징맵을 다운 샘플링하는 효과가 있습니다
- 하지만, pooling층에서 다운샘플링을 수행하기 떄문에 잘 사용하지 않습니다
- Max Pooling을 사용하기 위해서는 1x1stride를 권장합니다
- 최대풀링층이 강한 특징 값을 뽑아냄과 동시에 특징맵의 크기를 줄여 다운 샘플링을 하기 때문에 컨볼루션 층에서는 가급적 정보를 보존하는 것이 좋음
최대풀링층이 강한 특징 값을 뽑아냄과 동시에 특징맵의 크기를 줄여 다운 샘플링을 하기 때문에 컨볼루션 층에서는 가급적 정보를 보존하는 것이 좋음
[ padding ]
컨볼루션 연산의 결과로 얻은 특성 맵은 입력보다 크기가 작아진다는 특징이 있습니다. 특징맵의 크기가 감소하지 않고 입력데이터의 형태와 동일한 형태를 출력값으로 얻고 싶은 경우에 패딩을 사용합니다.
- 이미지의 가장자리 정보를 손실하지 않고 전달하는 효과
- 행과 열에 특정 숫자 추가
- 출력 특징 맵 크기 계산법 : ((N-F)+2P/stride)+1
- N : 입력데이터 크기/ F: 필터크기 / P : 패딩크기
# Conv2D 사용
import tensorflow.keras.layers import Conv2D
#Conv2D(filters, kernel_size, strides, padding, activation)
Conv2D(filters=16, kernel_size=3, strides=(1,1), padding='same', activation='relu')
- filters : 특징 맵의 차원을 결정하며, n개의 필터를 사용한다는 의미
- 특징맵의 형태 : (batch_size, rows, cols, filters)
- kernel_size : 튜플 형태로 필터 크기를 설정하는데, 숫자 k를 전달할 경우 자동으로 (k,k) 필터크기로 설정됩니다.
- stride : 스트라이드 크기를 지정하는데, 기본값은 (1,1)이고 마찬가지로 숫자 하나로 전달할 수 있습니다.
- padding : 패딩에 대한 결정 여부를 지정합니다
- 'same' : 패딩을 사용하여 출력 형태와 입력형태가 동일하돌고 조절
- 'valid' : 패딩을 사용하지 않음(default)
- activation : 활성화함수를 문자열 또는 클래스 형태로 제공합니다
Pooling layer (풀링 층)
풀링 층에서는 특성 맵을 다운샘플링하여 특성 맵의 크기를 줄이는 풀링 연산이 이루어집니다(차원축소). 풀링 연산으로 Max pooling (최대풀링)과 Average pooling (평균 풀링)이 있습니다, 풀링 연산에서도 filter와 filter(커널)의 개념을 가집니다.
① Max pooling (최대 풀링)
해당 커널에서 가장 큰 값을 특징값으로 사용합니다
- 일반적으로, 2×2 stride와 2x2 커널을 사용하여 특성맵의 크기를 절반으로 줄입니다(다운샘플링)
- 모델이 물체의 주요한 특징을 학습할 수 있도록 도와주며 컨볼루션 신경망이 이동불변성 특징을 가지도록 합니다.
- 이동불변성(translation or shift invariant) : 어느 위치에 있어도 그 물체를 인식할 수 있다는 것을 의미하는데, 커널 내에서 숫자를 바꿔도 그 안에서 큰 값은 변하지 않습니다.
- 모델 파라미터수를 줄여줍니다
- 계산 속도 향상
- 과대 적합 위험 감소
② Average pooling (평균 풀링)
해당 커널 내의 값들을 평균내서 특징값으로 사용합니다.
- 하지만, 잘 사용하지는 않는데, 그 이유는 어떤 물체의 존재 여부를 알기 위해서 가장 명확한 특징 값을 사용하여(max pooling) 학습하는 것이 좋기 때문입니다.
# MaxPooling2D 사용법
from tensorflow.keras.layers import MaxPool2D
# MaxPool2D(pool_size, strides, padding)
MaxPool2D(pool_size=(2,2), strides=2, padding='same')
- pool_size : 풀링층에서 사용할 커널의 크기를 설정합니다, 하나의 숫자형태로 제공할 수 있습니다.
- strides : 스트라이드의 크기 지정합니다,
- 기본값은 None이며, 이 값이 주어지지 않는 경우 pool_size와 동일한 크기로 지정됩니다
- padding : 패딩에 대한 결정 여부를 지정합니다
- 'same' : 패딩을 사용하여 출력 형태와 입력형태가 동일하돌고 조절
- 'valid' : 패딩을 사용하지 않음(default)
'AI > Deep Learning' 카테고리의 다른 글
Data Augmentation (데이터 증식) (0) | 2022.11.07 |
---|---|
Regularization (규제화) (0) | 2022.11.07 |
Batch Normalization (배치정규화) (0) | 2022.10.22 |
loss function (손실함수) (0) | 2022.10.20 |
optimizer (옵티마이저) (0) | 2022.10.20 |