합성곱 신경망, Convolutional Neural Network (CNN)

완전 연결 계층, Fully connected layer (JY) Keras 사용해보기 1. What is keras? 케라스(Keras)는 텐서플로우 라이버러리 중 하나로, 딥러닝 모델 설계와 훈련을 위한 고수준 API이다. 사용자 친화적이고 모델의

dsbook.tistory.com

 

합성곱 계층, Convolution Layer

합성곱 신경망, Convolutional Neural Network (CNN) 완전 연결 계층, Fully connected layer (JY) Keras 사용해보기 1. What is keras? 케라스(Keras)는 텐서플로우 라이버러리 중 하나로, 딥러닝 모델 설계와 훈..

dsbook.tistory.com

model = keras.Sequential([
    keras.layers.Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), padding="SAME", activation=tf.nn.relu),
    keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding="SAME"),
    keras.layers.Conv2D(64, kernel_size=(3, 3), padding="SAME", activation=tf.nn.relu),
    keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding="SAME"),
    keras.layers.Flatten(),
    keras.layers.Dense(1024, activation="relu"),
    keras.layers.Dense(10, activation="softmax"),
    keras.layers.Dropout(0.25)
])

 

 

1. 폴링 계층, Pooling Layer

폴링 계층을 사용하는 데는 다양한 이유가 있다. 앞서 합성곱 계층에서 살펴봤듯이, 이미지의 크기를 줄이면서 데이터의 손실을 막기 위해 합성곱 계층에서 스트라이드 값을 1로 지정하는 대신, 폴링 계층을 사용하기도 한다. 또 다른 이유로는 합성곱 계층의 과적합(Overfitting)을 막기 위해 폴링 계층이 사용되기도 한다. 이미지 학습을 위한 CNN은 완전 연결 계층으로만 연결한 MNLL보다 성능이 뛰어나서 입력 데이터에 다소 과도하게 맞춰지는 경우가 있다. 즉, 입력 데이터로 학습한 데이터만 정답으로 인식하고 그 데이터를 회전하거나 특정 좌표로 이동한 이미지, 혹은 글리치가 생기거나 조금 잘린 이미지 데이터에 대해서는 융통성을 발휘하지 못한다는 것이다. 이런 과적합을 막기 위해 폴링 계층을 사용하기도 한다. 해당 부분의 최댓값만을 뽑아내는 Max pooling과 그 부분의 평균값을 뽑아내는 Average pooling 방법이 있다.

 

1) Pooling 연산

통상적으로 Pooling 할 때에는 아래의 그림과 같이 pooling 크기를 (2, 2)로, 스트라이드 값 역시 (2, 2)를 사용하여 겹치는 부분이 없게 연산하는 방식이 대부분이다. pooling 크기를 (2, 2)를 사용하여 해당 윈도우에 들어가는 요소들의 값 중 최댓 값만 뽑아내는 것이 Max pooling 방식이고, 그 요소들의 값의 평균 값을 뽑아내는 것이 Average pooling 방식이다.

밑바닥부터 시작하는 딥러닝, max pooling
Max pooling      Average pooling

 

 

2. keras.layers.Maxpooling2D

케라스에는 다양한 폴링 연산을 위한 도구를 제공한다. 앞서 소개한 Max pooling 연산과 Average pooling 연산을 도와주는 도구 역시 제공해주는데, 대부분의 이미지 학습에 주로 사용되는 Max pooling 방법을 이용해서 폴링 계층을 만들어 보자. Maxpooling2D는 Conv2D함수와 마찬가지로 4차원 데이터(batches, channels ,rows, cols의 "channels_first" 혹은 batches, rows, cols, channels의 "channels_last")를 입력으로 받고 연산 후 입력 데이터와 같은 4차원 데이터로 출력한다. 

 

Input shape -> (batches_size, channels, rows, cols) or (batches_size, rows, cols, channels)

  keras.layers.MaxPooling2D
pool_size 윈도우(patch)의 크기를 지정해준다. 가로와 세로의 크기가 같은 경우, 정수 하나만 입력해도 된다.
strides 스트라이드 값을 지정해준다. 주로 2개의 정수가 들어있는 튜플 혹은 리스트 형태를 입력으로 받지만, 움직이는 거리가 같다면 정수 하나만 입력해도 된다.
padding "valid" 혹은 "same" 값을 입력으로 받는다. (default = "valid") Conv2D에서의 "valid"와 "same"과 의미가 같다. stride 값이 1일 때, padding = "same"이라면 입력 데이터의 크기와 출력 데이터의 크기가 똑같다. 다만 stride 값이 2이상 일 때, 모서리 부분에서 일부분만 데이터가 있을 경우, padding = "valid" 이면 해당 데이터는 버려지지만, padding = "same"의 경우 데이터가 없는 부분에만 zero-padding이 생겨 데이터의 손실을 막아준다.
data_format "channels_last" 혹은 "channels_first" 값을 입력으로 받는다. (default = "channels_last")

Output shape -> (batches_size, channels, rows, cols) or (batches_size, rows, cols, channels)

 

 

3. Summary

 

A Gentle Introduction to Pooling Layers for Convolutional Neural Networks

Convolutional layers in a convolutional neural network summarize the presence of features in an input image. A problem with the output feature maps is that they are sensitive to the location of the features in the input. One approach to address this sensit

machinelearningmastery.com

 

Keras documentation: MaxPooling2D layer

MaxPooling2D layer MaxPooling2D class tf.keras.layers.MaxPooling2D( pool_size=(2, 2), strides=None, padding="valid", data_format=None, **kwargs ) Max pooling operation for 2D spatial data. Downsamples the input representation by taking the maximum value ov

keras.io

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기