CNN์ ์ปจ๋ณผ๋ฃจ์ ๊ณ์ธต(convolutional layer)๊ณผ ํ๋ง ๊ณ์ธต(pooling layer)์ผ๋ก ๊ตฌ์ฑ๋ ์ ๊ฒฝ๋ง์ด๋ค.
1. ์ปจ๋ณผ๋ฃจ์ ๊ณ์ธต์ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋ํด ํํฐ(๋๋ ์ปค๋)๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๊ณ์ธต์ด๋ค. ์ด ํํฐ๋ ์ ๋ ฅ ์ด๋ฏธ์ง์ ํน์ ํจํด์ ๊ฐ์งํ๋ ์ญํ ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ฅ์๋ฆฌ, ์ง๊ฐ, ์์ ๋ฑ์ ๊ฐ์งํ ์ ์๋ค.
2. ํ๋ง ๊ณ์ธต์ ์ถ๋ ฅ์ ๊ณต๊ฐ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์ญํ ์ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ต๋ ํ๋ง(max pooling)์ด๋ ํ๊ท ํ๋ง(average pooling)์ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ์ ๊ฐ ์์ญ์์ ๊ฐ์ฅ ํฐ ๊ฐ ๋๋ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒดํ๋ค. ์ด๋ ๊ณต๊ฐ ํด์๋๋ฅผ ๊ฐ์์ํค๊ณ , ๊ณ์ฐ๋์ ์ค์ด๋ฉฐ, ๋ถํ์ํ ์ ๋ณด๋ฅผ ์ ๊ฑฐํ์ฌ ํน์ง์ ๋ณด๋ค ๊ฐ์กฐํ๋ค.
CNN์ ์ด๋ฌํ ์ปจ๋ณผ๋ฃจ์ ๊ณ์ธต๊ณผ ํ๋ง ๊ณ์ธต์ ์ฌ๋ฌ ์ธต์ผ๋ก ์์์ ๊ตฌ์ฑ๋๋ค. ์ดํ์๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ์ฐ๊ฒฐ๋๊ณ์ธต์ผ๋ก ์ฐ๊ฒฐํ์ฌ ์ต์ข ๋ถ๋ฅ๋ ์์ธก์ ์ํํ๋ค.
์ด๋ฌํ ์ํคํ ์ฒ๋ ์ด๋ฏธ์ง๋ ๋น๋์ค์ ๊ฐ์ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ํน์ง์ ์ถ์ถํ๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์ด๋ฉฐ ์์ฑ ์ธ์, ์์ฐ์ด ์ฒ๋ฆฌ, ๊ฒ์ ์ธ๊ณต์ง๋ฅ ๋ฑ ๋ค์ํ ๋ถ์ผ์์๋ ์ฌ์ฉ๋๊ณ ์๋ค.
1. ์ปจ๋ณผ๋ฃจ์ ๊ณ์ธต
'relu'๋ 0 ์ดํ์ ๊ฐ๋ค์ ๋ชจ๋ 0์ผ๋ก ๋ง๋ค์ด์ค๋ค
์๋๋ ์ต์ข ์ผ๋ก ๋ง๋ค์ด์ง ํํฐ(์ปค๋) ์ด๋ค.
2. ํ๋ง ๊ณ์ธต
์๋๋ ์ต๋ํ๋ง(max pooling)์ผ๋ก, ํํฐ๋ฅผ ๋ฐ์ดํฐ์ ์ ์ฉํ ํ, ๊ฐ๊ฒฉ์์ ๊ฐ์ฅ ๋์๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ผ๋ก ๋ฐ์ดํฐํํ๋ ๊ฒ์ด๋ค. ์ค๋ฌด์์๋ ๋๋ถ๋ถ max pooling์ ์ฌ์ฉํ๋ค.
ํ๊ท ํ๋ง(average pooling)์ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฒฉ์์ ํ๊ท ๊ฐ์ ๊ตฌํด, ๊ทธ ๊ฐ์ผ๋ก ๋ฐ์ดํฐํํ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ์ ์ ์ฉํด๋ณด๊ธฐ
import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist
#๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
(X_train, y_train),(X_test, y_test)= fashion_mnist.load_data()
๋ฐ์ดํฐ๋ fashon_mnist ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ์ฌ ์ฌ์ฉํ๋ค.
<ํผ์ฒ์ค์ผ์ผ๋ง>
X_train = X_train / 255.0
X_test = X_test / 255.0
<reshape>
- ์นผ๋ผ์ด๋ฏธ์ง์ด๋ ๊ทธ๋ ์ด์ค์ผ์ผ ์ด๋ฏธ์ง๋ ์ ๋ถ ์ฒ๋ฆฌํ ์ ์๋ ์ธ๊ณต์ง๋ฅ ๊ฐ๋ฐ ์ํด 4์ฐจ์์ผ๋ก reshape ํ๋ค.
X_train.shape
(60000, 28, 28)
X_test.shape
(10000, 28, 28)
X_train = X_train.reshape(60000, 28, 28, 1) #1 : grayscale, 3 : colorscale(rgb์ด๋ฏ๋ก 3)
X_test = X_test.reshape(10000, 28, 28, 1)
<๋ชจ๋ธ๋งํ๊ธฐ>
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense #convolution2D
from typing import Sequence
def build_model():
model = Sequential()
model.add( Conv2D( filters=64, kernel_size=(3,3), activation='relu' , input_shape=(28,28,1) ) ) #kernel(=filter)์ 3ํ 3์ด๋ก
model.add( MaxPooling2D(pool_size=(2,2), strides=2) )
model.add( Conv2D( filters=64, kernel_size=(2,2), activation='relu' ) )
model.add( MaxPooling2D(pool_size=(2,2), strides=2) )
model.add( Flatten() ) #์
๋ ฅ๋ ์ด์ด
model.add( Dense(128, 'relu') ) #์๋๋ ์ด์ด
model.add( Dense(10, 'softmax') ) #์ถ๋ ฅ๋ ์ด์ด
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) #์ปดํ์ผ
return model
model = build_model()
from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_accuracy', patience=10)
epoch_history = model.fit(X_train, y_train, epochs=1000, validation_split=0.2, callbacks=[early_stopping])
<ํ๊ฐํ๊ธฐ>
model.evaluate(X_test, y_test)
[==============================] - 1s 3ms/step - loss: 0.4803 - accuracy: 0.9096
[0.48025116324424744, 0.909600019454956]
<confusion_matrix>
from sklearn.metrics import confusion_matrix
import numpy as np
confusion_matrix(y_test, y_pred)
array([[843, 1, 13, 13, 7, 1, 117, 0, 5, 0],
[ 1, 980, 0, 10, 4, 0, 3, 0, 2, 0],
[ 17, 0, 802, 8, 81, 0, 92, 0, 0, 0],
[ 19, 3, 7, 909, 17, 0, 42, 0, 2, 1],
[ 3, 1, 20, 23, 878, 0, 75, 0, 0, 0],
[ 0, 0, 0, 0, 0, 977, 0, 12, 1, 10],
[ 83, 1, 38, 22, 55, 0, 796, 0, 5, 0],
[ 0, 0, 0, 0, 0, 5, 0, 970, 0, 25],
[ 1, 0, 1, 6, 3, 4, 8, 4, 973, 0],
[ 0, 0, 0, 0, 0, 4, 2, 26, 0, 968]])