본문 바로가기
딥러닝

[딥러닝] 분류 CNN: Conv2D, MaxPooling2D, Base, Head

by eyoo 2022. 6. 14.
fashion_mnist 데이터셋으로 사진을 분류하는 CNN을 만들자.
 
fashion_mnist 데이터셋을 불러온다.
 
fashion_mnist = tf.keras.datasets.fashion_mnist
(X_train,y_train),(X_test,y_test) = fashion_mnist.load_data()

 

 

그 후 피처 스케일링한다.

 

X_train = X_train / 255.0
X_test = X_test / 255.0

 

 

학습용과 검증용 X데이터는 3차원으로 이루어져있는데 convolution 작업을 하기위해서는 reshape으로 4차원을 만들어야 한다.

 

X_train = X_train.reshape(60000,28,28,1)
X_test = X_test.reshape(10000,28,28,1)

# 추가된 하나의 차원은 색을 나타내며 RGB면 3, 흑백이면 1로 설정한다.

 

 

모델링을 시작한다.

 

from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D, MaxPooling2D

model = Sequential()

# Base
model.add(Conv2D(filters= 64, kernel_size= (3,3),activation='relu',input_shape= (28,28,1)))
model.add(MaxPooling2D(pool_size= (2,2),strides= 2 ))
model.add(Conv2D(filters=32,kernel_size=(2,2),activation='relu'))
model.add(MaxPooling2D(2,2 ))

# Head
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=10,activation= 'softmax'))

# 각 각 두개의 컨볼루션과 풀링을 사용했다.

# 컨볼루션은 엑티베이션으로 렐루를 사용한다. 

# input_shape은 항상 들어갈 데이터 하나의 형태를 입력한다.

# MaxPooling2D의 pool_size 파라미터에 튜플이 아닌 정수를 입력하면 자동으로 인식한다.

# CNN은 컨볼루션과 ANN을 조합한것이라고 볼수있다.

# CNN 모델은 베이스와 헤드로 나뉜다는것을 기억하자.

 

 

summary함수를 사용하여 모델을 살펴보자.

 

in:

model.summary()

out:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 26, 26, 64)        640       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 13, 13, 64)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 12, 12, 32)        8224      
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 6, 6, 32)         0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 1152)              0         
                                                                 
 dense (Dense)               (None, 128)               147584    
                                                                 
 dense_1 (Dense)             (None, 10)                1290      
                                                                 
=================================================================
Total params: 157,738
Trainable params: 157,738
Non-trainable params: 0
_________________________________________________________________

# 157,738개의 파라미터가 있다는것을 알수있다.

# 컨볼루션의 파라미터의 개수는 커널의 개수다.

 

 

모델을 컴파일한다.

 

model.compile('adam','sparse_categorical_crossentropy',['accuracy'])

# y값이 3개 이상의 레이블 인코딩된 데이터이니 로스함수로 sparse_categorical_crossentropy를 사용한다.

 

 

모델을 학습시킨다.

 

model.fit(X_train,y_train, epochs=5, validation_split=0.2)

 

 

검증해보자.

 

in:

model.evaluate(X_test,y_test)

out:

313/313 [==============================] - 1s 3ms/step - loss: 0.2748 - accuracy: 0.9112
[0.27479302883148193, 0.9111999869346619]
# 오차값이 0.27, 정확도가 0.91이 나온다.
 
 
 
 

댓글