오답노트

[Keras] CNN 관련 레이어 - Conv2D, MaxPool2D 본문

Python/DL

[Keras] CNN 관련 레이어 - Conv2D, MaxPool2D

권멋져 2022. 9. 21. 17:48
# 라이브러리 호출
import tensorflow as tf
from tensorflow import keras

from keras.layers import Input, Dense, Conv2D, MaxPool2D, BatchNormalization, Dropout, Flatten
from keras.models import Model
from keras.backend import clear_session
from keras.callbacks import EarlyStopping

import numpy as np

# 데이터 불러오기
(x_train, y_train), (x_val, y_val) = tf.keras.datasets.mnist.load_data()

# 데이터 전처리
x_val = x_val.reshape(-1,28,28,1) #gray scale image shape 명시

# 스케일링
max_num,min_num = x_train.max() , x_train.min()

x_train = (x_train - min_num) / (max_num - min_num)
x_val = (x_val - min_num) / (max_num - min_num)

#one hot encoding
from tensorflow.keras.utils import to_categorical

n_class = len(np.unique(y_train))

y_train = to_categorical(y_train,n_class)
y_val = to_categorical(y_val,n_class)

layers.Conv2D

Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu')(il)

컨볼루션을 수행하는 레이어다.

  • filters : 해당 레이어를 통해 만들 feature의 개수를 의미한다.
  • kernel_size : 이전 레이어에 적용할 필터의 크기이다.
  • strides : 필터가 움직이는 거리를 설정한다. 기본은 (1,1)이고 옵션으로 지정하여 사용할 수 있다.
  • padding : 컨볼루션의 특성상 원본 데이터의 크기가 줄어들고, 가장자리 데이터 들은 중요도가 떨어질 수 밖에 없다. 이때 패딩에 same을 입력하면, 데이터의 입력 크기와 출력 크기가 같게 된다. 기본은 valid이다.
  • activation : activation 함수를 입력할 수 있다.

layers.MaxPool2D

MaxPool2D(pool_size=(2,2))(hl)

Max Pooling을 수행하는 레이어다.

 

  • pool_size : Max Pooling을 수행할 필터의 크기를 설정한다.
  • strides : 필터가 움직이는 거리를 설정한다. 기본은 pool_size의 크기를 따라간다.

 

실습 코드

il = Input((28,28,1))
hl = Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu')(il)
bl = BatchNormalization()(hl)
hl = MaxPool2D(pool_size=(2,2))(bl)
hl = Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu')(hl)
hl = MaxPool2D(pool_size=(2,2))(hl)
bl = BatchNormalization()(hl)
fl = Flatten()(bl)
dl = Dropout(0.25)(fl)
hl = Dense(128,'relu')(dl)
ol = Dense(n_class,'softmax')(hl)

model = Model(il,ol)

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer='adam',
              metrics=['accuracy'])

model.summary()

'''
Model: "model_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_4 (InputLayer)        [(None, 28, 28, 1)]       0         
                                                                 
 conv2d_6 (Conv2D)           (None, 28, 28, 64)        640       
                                                                 
 batch_normalization_6 (Batc  (None, 28, 28, 64)       256       
 hNormalization)                                                 
                                                                 
 max_pooling2d_6 (MaxPooling  (None, 14, 14, 64)       0         
 2D)                                                             
                                                                 
 conv2d_7 (Conv2D)           (None, 14, 14, 64)        36928     
                                                                 
 max_pooling2d_7 (MaxPooling  (None, 7, 7, 64)         0         
 2D)                                                             
                                                                 
 batch_normalization_7 (Batc  (None, 7, 7, 64)         256       
 hNormalization)                                                 
                                                                 
 flatten_3 (Flatten)         (None, 3136)              0         
                                                                 
 dropout_1 (Dropout)         (None, 3136)              0         
                                                                 
 dense_2 (Dense)             (None, 128)               401536    
                                                                 
 dense_3 (Dense)             (None, 10)                1290      
                                                                 
=================================================================
Total params: 440,906
Trainable params: 440,650
Non-trainable params: 256
_________________________________________________________________
'''