[Deep Learning] 합성곱 신경망(CNN)
지난 DNN 실습에서, 사진을 분류하기 위해 Rank 3 Tensor를 Rank 1 Tensor로 바꾸어 입력했다.
이렇게 행렬을 벡터로 이어 붙이면, 원래 행렬이 가지고 있던 위치 정보(좌표)가 소멸되는 문제가 발생한다.
이미지 정보의 특징과 위치정보를 모두 뽑아낼 수 있는 방법이 필요하다.
그러한 방법이 CNN이다.
합성곱 신경망(Convolutional Neural Network, CNN)
합성곱 연산을 이용하여 이미지의 특징을 추출하는 신경망
이미지 처리에 일반적으로 사용되는 신경망(자연어 또는 시계열 데이터 처리 시에도 사용될 수 있음)
https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53
특징
- CNN은 여러개의 Filter(Parameter Matrix)로 이미지의 특징(Feature Map)을 추출한다(Feature Extraction).
- 합성곱 연산을 이용하여 가중치의 수를 줄이고 연산량을 감소시킨다.
- 합성곱 연산을 거듭할수록 하나의 픽셀이 함축하고 있는 부분은 늘어난다(이미지에서 더 넓은 범위의 특징을 포함한다).
- 주변 픽셀들과의 관계가 무너지지 않는다(Local connectivity).
- CNN 말단에 Sigmoid 또는 Softmax 함수를 적용하여 이미지를 분류한다.
- LeNet, AlexNet, VGGNet, InceptionNet, ResNet 등으로 발전하고 있다.
1. CNN의 Hyperparameter
사용 예
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(filters=32, kernel_size(3,3), strides=(1,1), padding='same'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(filters=64, kernel_size(3,3), strides=(1,1), padding='same'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(filters=128, kernel_size(3,3), strides=(1,1), padding='same'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation = 'relu'))
model.add(layers.Dense(27, activation = 'softmax'))
1) Filter
Filter를 Input Data에 적용하여 특징 맵(Feature Map)을 생성한다.
http://taewan.kim/post/cnn/
- Filter는 가중치 행렬로, Input Data 전체에 합성곱 연산(Convolutional)을 적용하고,
- 이미지의 특징을 담아 놓은 Feature Map을 생성한다.
- 합성곱 연산을 적용할 때 Filter는 동일하다.
- 파라미터
- kernel_size : 필터 크기
- filters : 필터 개수
2) Stride
Filter를 적용하기 위해 이동하는 위치의 간격(보폭)
- Stride 값이 커지면 Feature Map의 크기가 감소한다.
- 파라미터
- strides : 보폭의 크기(default = (1,1))
3) Pooling(=Sub sampling)
가로 및 세로 방향으로 크기를 줄이는 연산
http://taewan.kim/post/cnn/
- Max Pooling과 Average Pooling이 있는데 Max Pooling이 성능이 좋다.
- Poling Window와 Stride 값을 지정할 수 있다.
- Stride의 default 값은 poling window의 크기이다.
4) Padding
출력 크기를 조정하기 위한 파라미터
합성곱 연산을 수행하기 전에 Input Data 주변을 0으로 채우는 것
http://taewan.kim/post/cnn/
- Layer가 깊어지면 Filter와 Pooling에 의해 DNN으로 들어가는 Image의 크기가 너무 작아지기 때문에 Padding을 적용해야 한다.
- padding을 적용하면 더 많은 Layer를 쌓을 수 있다.
- 아래 종류와 같이 Convolution Layer를 만들 때 파라미터로 추가하면 된다.
- 파라미터
- padding=’same’ : output image가 input image크기와 동일하도록 패딩을 적용
- padding=’valid’ : 패딩을 적용하지 않음
5) Channel
Convolution Layer에 적용되는 필터 수(N)만큼 출력데이터는 N개 채널을 갖는다.
Leave a comment