8. 이미지를 위한 인공 신경망¶
합성곱 convolution¶
- 입력 데이터에서 유용한 특성만 드러나게 처리하는 것
합성곱의 동작 원리¶
- 입력 데이터 전체에 가중치를 적용하는 게 아니라 일부에 가중치를 곱함
- CNN Convolutional Neural Network에서는 뉴런을 filter/kernel라고 부름
- 필터 filter: 뉴련 개수를 표현할 때
- 커널 kernel: 입력에 곱하는 가중치를 의미할 때
- 합성곱은 2차원 데이터에도 적용할 수 있다.
- 입력 데이터의 왼쪽 위에서 오른쪽 맨 아래까지 이동하면서 출력을 만들어낸다
- 이때 Convolutional 계산을 통해 어든 출력을 Feature map 특성 맵이라고 한다.
8-1. 합성곱 신경망의 구성 요소¶
케라스 합성곱 층
- 합성곱 신경망의 정의: 1개 이상의 합성곱 층을 쓴 인공 신경망
In [1]:
# 특성 맵은 활성화 함수를 적용한 후임
# 커널의 크기는 하이퍼파라미터로 다양한 값을 적용할 수 있지만, (3, 3)이나 (5, 5)가 권장됨
from tensorflow import keras
keras.layers.Conv2D(10, kernel_size=(3, 3), activation="relu")
Out[1]:
<keras.layers.convolutional.conv2d.Conv2D at 0x13b6f851b70>
- 패딩
- 패딩이 필요한 이유: 커널(가중치 배열)은 그대로 두고 출력을 키우고 싶을 때
- 패딩 Padding: 입력 배열 주위를 가상의 원소로 채우는 것(필터를 바꾸는 게 아니라 입력 데이터를 바꾸는 것임)
- 세임 패딩 Same Padding: 0으로 패딩하기
- valid padding: 패딩을 추가하지 않은 형태
- 패딩이 없으면 가장자리의 원소가 참여하는 비율 낮아진다 -> 이미지 주변부에 있는 정보를 잃지 않도록 패딩을 한다.
In [2]:
keras.layers.Conv2D(10, kernel_size=(3, 3), activation="relu", padding="same")
Out[2]:
<keras.layers.convolutional.conv2d.Conv2D at 0x13b6f7587c0>
Stride 스트라이드
한번에 움직이는 크기 -> 보폭
In [3]:
keras.layers.Conv2D(10, kernel_size=(3, 3), activation="relu", padding="same",
strides=1)
Out[3]:
<keras.layers.convolutional.conv2d.Conv2D at 0x13b6f758e50>
풀링 Pooling
- 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할
- Max pooling: 최댓값을 선택하여 풀링함
- Average pooling: 평균값으로 풀링함
In [6]:
# MaxPooling2D
keras.layers.MaxPooling2D(2)
keras.layers.MaxPooling2D(2, strides=2, padding="valid")
Out[6]:
<keras.layers.pooling.max_pooling2d.MaxPooling2D at 0x13b04e7de70>
In [5]:
# AveragePooling2D
keras.layers.AveragePooling2D(2)
Out[5]:
<keras.layers.pooling.average_pooling2d.AveragePooling2D at 0x13b6f759300>
합성곱 신경망 CNN의 전체 구조¶
- 합성곱 층, 필터, 패딩, 스트라이드, 풀링
(step 1) 합성곱 층(세임 패딩=0으로 채우는 패딩)
- 필터(=커널) 3*3짜리 3개
- 필터를 거쳐 특성 맵이 만들어진다
(step 2) 풀링층
- max pooling을 이용해서 풀링
(step 3) 밀집층
- 이렇게 추출된 특성 맵을 1차원으로 펼친 뒤에
- 밀집층을 거치고, 소프트맥스 활성화 함수로 클래스를 예측한다
컬러 이미지를 사용한 합성곱¶
- 컬러 이미지는 44 크기면 44*3으로 표현된다
- 필터도 3차원 크기로 한다 333으로
- 입력의 깊이만큼 들어가면서 곱한다