[Deep Learning] 합성곱 신경망(CNN)

1 minute read


지난 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