MNIST ๋ฐ์ดํฐ์
- ๋ฏธ๊ตญ ๊ตญ๋ฆฝํ์ค๊ธฐ์ ์(NIST)์ด ๊ณ ๋ฑํ์๊ณผ ์ธ๊ตฌ์กฐ์ฌ๊ตญ ์ง์ ๋ฑ์ด ์ด ์๊ธ์จ๋ฅผ ์ด์ฉํด ๋ง๋ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ
- 70,000๊ฐ์ ๊ธ์ ์ด๋ฏธ์ง์ ๊ฐ๊ฐ 0๋ถํฐ 9๊น์ง ์ด๋ฆํ๋ฅผ ๋ถ์ธ ๋ฐ์ดํฐ์
์๊ธ์จ ์ด๋ฏธ์ง๋ฅผ ๋ช %๋ ์ ํํ ๋ง์ถ ์ ์๋๊ฐ?
MNIST ๋ฐ์ดํฐ๋ ์ผ๋ผ์ค๋ฅผ ์ด์ฉํด ๋ถ๋ฌ์ฌ ์ ์๋ค.
mnist.load_data() ํจ์ : ์ฌ์ฉํ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
X : ๋ถ๋ฌ์จ ์ด๋ฏธ์ง ๋ฐ์ดํฐ
Y_class : ์ด ์ด๋ฏธ์ง์ 0~9๊น์ง ๋ถ์ธ ์ด๋ฆํ
• ํ์ต์ ์ฌ์ฉ๋ ๋ถ๋ถ: X_train, Y_class_train
• ํ ์คํธ์ ์ฌ์ฉ๋ ๋ถ๋ถ: X_test, Y_class_test
from keras.datasets import mnist
(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data()
์ผ๋ผ์ค์ MNIST ๋ฐ์ดํฐ๋ ์ด 70,000๊ฐ์ ์ด๋ฏธ์ง ์ค 60,000๊ฐ๋ฅผ ํ์ต์ฉ์ผ๋ก, 10,000๊ฐ๋ฅผ ํ
์คํธ์ฉ์ผ๋ก ๋ฏธ๋ฆฌ ๊ตฌ๋ถํด ๋๊ณ ์์ต๋๋ค. print(“ํ ์คํธ์ ์ด๋ฏธ์ง ์: %d ๊ฐ” % (X_test.shape[0])) ํ์ต์ ์ด๋ฏธ์ง ์: 60000 ๊ฐ ํ ์คํธ์ ์ด๋ฏธ์ง ์: 10000 ๊ฐ |
๋ถ๋ฌ์จ ์ด๋ฏธ์ง ์ค ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
๋จผ์ matplotlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
imshow() ํจ์ : ์ด๋ฏธ์ง ์ถ๋ ฅ
๋ชจ๋ ์ด๋ฏธ์ง๊ฐ X_train์ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก X_train[0]์ ํตํด ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ฅผ, cmap = 'Greys' ์ต์ : ํ๋ฐฑ ์ถ๋ ฅ
import matplotlib.pyplot as plt
plt.imshow(X_train[0], cmap='Greys')
plt.show()
์ด ์ด๋ฏธ์ง๋ฅผ ์ปดํจํฐ๋ ์ด๋ป๊ฒ ์ธ์ํ ๊น?
์ด ์ด๋ฏธ์ง๋ ๊ฐ๋ก 28 × ์ธ๋ก 28 = ์ด 784๊ฐ์ ํฝ์ ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๊ฐ ํฝ์ ์ ๋ฐ๊ธฐ ์ ๋์ ๋ฐ๋ผ 0๋ถํฐ 255๊น์ง์ ๋ฑ๊ธ์ ๋งค๊ธด๋ค.
ํฐ์ ๋ฐฐ๊ฒฝ์ด 0, ๊ธ์จ๊ฐ ๋ค์ด๊ฐ ๊ณณ์ 1~255๊น์ง ์ซ์ ์ค ํ๋๋ก ์ฑ์์ ธ
๊ธด ํ๋ ฌ๋ก ์ด๋ฃจ์ด์ง ํ๋์ ์งํฉ์ผ๋ก ๋ณํ
for x in X_train[0]:
for i in x:
sys.stdout.write('%d\t' % i)
sys.stdout.write('\n')
28 × 28 = 784๊ฐ์ ์์ฑ์ ์ด์ฉํด 0~9๊น์ง 10๊ฐ ํด๋์ค ์ค ํ๋๋ฅผ ๋งํ๋ ๋ฌธ์ ๊ฐ ๋๋ค
reshape() ํจ์ : ์ฃผ์ด์ง ๊ฐ๋ก 28, ์ธ๋ก 28์ 2์ฐจ์ ๋ฐฐ์ด์ 784๊ฐ์ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐ๊พธ๊ธฐ
reshape(์ด ์ํ ์, 1์ฐจ์ ์์ฑ์ ์)
์ด ์ํ ์๋ ์์ ์ฌ์ฉํ X_train.shape[0] ์ฌ์ฉ, 1์ฐจ์ ์์ฑ์ ์=784๊ฐ
X_train = X_train.reshape(X_train.shape[0], 784)
๋ฐ์ดํฐ ์ ๊ทํ(normalization)
๋ฐ์ดํฐ์ ํญ์ด ํด ๋ ์ ์ ํ ๊ฐ์ผ๋ก ๋ถ์ฐ์ ์ ๋๋ฅผ ๋ฐ๊พธ๋ ๊ณผ์
์ผ๋ผ์ค๋ ๋ฐ์ดํฐ๋ฅผ 0์์ 1 ์ฌ์ด์ ๊ฐ์ผ๋ก ๋ณํํ ๋ค์ ๊ตฌ๋ํ ๋ ์ต์ ์ ์ฑ๋ฅ
ํ์ฌ ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ๊ฐ์ 0๋ถํฐ 255๊น์ง์ ์ ์๋ก, ์ ๊ทํ๋ฅผ ์ํด 255๋ก ๋๋์ด ์ฃผ๋ ค๋ฉด ๋จผ์ ์ด ๊ฐ์ ์ค์ํ์ผ๋ก ๋ฐ๊ฟ์ผ ํ๋ค
astype() ํจ์ : ์ค์ํ์ผ๋ก ๋ฐ๊พธ๊ธฐ,
255๋ก ๋๋๊ธฐ
X_train = X_train.astype(‘float64’)
X_train = X_train / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype(‘float64’) / 255
<์ซ์ ์ด๋ฏธ์ง์ ๋งค๊ฒจ์ง ์ด๋ฆ ํ์ธ>
์ฐ๋ฆฌ๋ ์์ ๋ถ๋ฌ์จ ์ซ์ ์ด๋ฏธ์ง๊ฐ 5๋ผ๋ ๊ฒ์ ๋์ผ๋ก ๋ณด์ ์ง์ํ ์ ์๋ค. ์ค
์ ๋ก ์ด ์ซ์์ ๋ ์ด๋ธ์ด ์ด๋ค์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ Y_class_train[0]์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅํ๋ฉด
์ด ์ซ์์ ๋ ์ด๋ธ ๊ฐ์ธ 5๊ฐ ์ถ๋ ฅ
class : 5
print(“class : %d “ % (Y_class_train[0]))
๋ฅ๋ฌ๋์ ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์-ํซ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ์ฉํด์ผ ํ๋ค
์ฆ, 0~9๊น์ง์ ์ ์ํ ๊ฐ์ ๊ฐ๋ ํ์ฌ ํํ์์ 0 ๋๋ 1๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฒกํฐ๋ก ๊ฐ์ ์์
np_utils.to_categorical() ํจ์ : ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์ด์ด๋ณธ ์ด๋ฏธ์ง์ class [5]๋ฅผ [0,0,0,0,0,1,0,0,0,0]๋ก ๋ฐ๊พธ๊ธฐ
to_categorical(ํด๋์ค, ํด๋์ค์ ๊ฐ์)
Y_train = np_utils.to_categorical(Y_class_train,10)
Y_test = np_utils.to_categorical(Y_class_test,10)
print(Y_train[0]) ๋ก ํ์ธํ ๊ฒฐ๊ณผ : [ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
from keras.datasets import mnist
from keras.utils import np_utils
import numpy
import sys
import tensorflow as tf
# seed ๊ฐ ์ค์
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
# MNIST ๋ฐ์ดํฐ์
๋ถ๋ฌ์ค๊ธฐ
(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data()
print("ํ์ต์
์ด๋ฏธ์ง ์ : %d ๊ฐ" % (X_train.shape[0]))
print("ํ
์คํธ์
์ด๋ฏธ์ง ์ : %d ๊ฐ" % (X_test.shape[0]))
# ๊ทธ๋ํ๋ก ํ์ธ
import matplotlib.pyplot as plt
plt.imshow(X_train[0], cmap='Greys')
plt.show()
# ์ฝ๋๋ก ํ์ธ
for x in X_train[0]:
for i in x:
sys.stdout.write('%d\t' % i)
sys.stdout.write('\n')
# ์ฐจ์ ๋ณํ ๊ณผ์
X_train = X_train.reshape(X_train.shape[0], 784)
X_train = X_train.astype('float64')
X_train = X_train / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float64') / 255
# ํด๋์ค ๊ฐ ํ์ธ
print("class : %d " % (Y_class_train[0]))
# ๋ฐ์ด๋๋ฆฌํ ๊ณผ์
Y_train = np_utils.to_categorical(Y_class_train, 10)
Y_test = np_utils.to_categorical(Y_class_test, 10)
print(Y_train[0])
๋ฅ๋ฌ๋ ์คํ
ํ๋ ์ ์ค์ -์ด 784๊ฐ์ ์์ฑ, 10๊ฐ์ ํด๋์ค
๋ฅ๋ฌ๋ ํ๋ ์ :
model = Sequential()
model.add(Dense(512, input_dim=784, activation=‘relu’))
model.add(Dense(10, activation=‘softmax’))
์ ๋ ฅ ๊ฐ(input_dim)= 784๊ฐ, ์๋์ธต= 512๊ฐ ์ถ๋ ฅ= 10๊ฐ์ธ ๋ชจ๋ธ
ํ์ฑํ ํจ์ -- ์๋์ธต relu, ์ถ๋ ฅ์ธต softmax
๊ทธ๋ฆฌ๊ณ ๋ฅ๋ฌ๋ ์คํ ํ๊ฒฝ์ ์ํด ์ค์ฐจ ํจ์ categorical_crossentropy, ์ต์ ํ ํจ์ adam
model.compile(loss=‘categorical_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])
๋ชจ๋ธ์ ์คํ์ ์์ ๋ชจ๋ธ์ ์ฑ๊ณผ๋ฅผ ์ ์ฅํ๊ณ
10ํ ์ด์ ๋ชจ๋ธ์ ์ฑ๊ณผ ํฅ์์ด ์์ผ๋ฉด ์๋์ผ๋ก ํ์ต ์ค๋จ(๋ชจ๋ธ์ ์ต์ ํ ๋จ๊ณ)
import os
from keras.callbacks import ModelCheckpoint,EarlyStopping
MODEL_DIR = ’./model/’
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath=”./model/{epoch:02d}-{val_loss:.4f}.hdf5”
checkpointer = ModelCheckpoint(filepath=modelpath, monitor=‘val_loss’, verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor=‘val_loss’, patience=10)
์ํ 200๊ฐ๋ฅผ ๋ชจ๋ 30๋ฒ ์คํํ๋๋ก,
ํ ์คํธ์ ์ผ๋ก ์ต์ข ๋ชจ๋ธ์ ์ฑ๊ณผ๋ฅผ ์ธก์ ํ์ฌ ๊ทธ ๊ฐ์ ์ถ๋ ฅ
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback,checkpointer])
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
ํ์ต์ ์ ์ค์ฐจ๋ฅผ ๊ทธ๋ํ๋ก ํํ
ํ์ต์ ์ ์ค์ฐจ= 1- ํ์ต์ ์ ์ ํ๋
ํ์ต์ ์ ์ค์ฐจ์ ํ ์คํธ์ ์ ์ค์ฐจ๋ฅผ ๊ทธ๋ํ ํ๋๋ก ๋ํ๋ด๊ธฐ
import matplotlib.pyplot as plt
y_vloss = history.history['val_loss']
# ํ์ต์
์ ์ค์ฐจ
y_loss = history.history['loss']
# ๊ทธ๋ํ๋ก ํํ
x_len = numpy.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# ๊ทธ๋ํ์ ๊ทธ๋ฆฌ๋๋ฅผ ์ฃผ๊ณ ๋ ์ด๋ธ์ ํ์
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint,EarlyStopping
import matplotlib.pyplot as plt
import numpy
import os
import tensorflow as tf
# seed ๊ฐ ์ค์
seed = 0
numpy.random.seed(seed)
tf.set_random_seed(3)
# MNIST ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)
# ๋ชจ๋ธ ํ๋ ์ ์ค์
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
# ๋ชจ๋ธ ์คํ ํ๊ฒฝ ์ค์
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# ๋ชจ๋ธ ์ต์ ํ ์ค์
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# ๋ชจ๋ธ์ ์คํ
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback,checkpointer])
# ํ
์คํธ ์ ํ๋ ์ถ๋ ฅ
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
# ํ
์คํธ์
์ ์ค์ฐจ
y_vloss = history.history['val_loss']
# ํ์ต์
์ ์ค์ฐจ
y_loss = history.history['loss']
# ๊ทธ๋ํ๋ก ํํ
x_len = numpy.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# ๊ทธ๋ํ์ ๊ทธ๋ฆฌ๋๋ฅผ ์ฃผ๊ณ ๋ ์ด๋ธ์ ํ์
plt.legend(loc='upper right')
# plt.axis([0, 20, 0, 0.35])
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
Epoch 00009: val_loss improved from 0.05961 to 0.05732, saving model to ./model/09-0.0573.hdf5 Epoch 00010: val_loss did not improve from 0.05732
Epoch 00011: val_loss did not improve from 0.05732
Epoch 00012: val_loss did not improve from 0.05732
Epoch 00013: val_loss did not improve from 0.05732
Epoch 00014: val_loss did not improve from 0.05732
Epoch 00015: val_loss did not improve from 0.05732
Epoch 00016: val_loss did not improve from 0.05732
Epoch 00017: val_loss did not improve from 0.05732
Epoch 00018: val_loss did not improve from 0.05732
Epoch 00019: val_loss did not improve from 0.05732
10000/10000 [==============================] - 0s 33us/step
Test Accuracy: 0.9830
20๋ฒ์งธ ์คํ์์ ๋ฉ์ถค
๊ธฐ๋ณธ ๋ฅ๋ฌ๋ ํ๋ ์ +์ด๋ฏธ์ง ์ธ์ ๋ถ์ผ์์ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋ณด์ด๋ ์ปจ๋ณผ๋ฃจ์ ์ ๊ฒฝ๋ง(Convolutional Neural Network, CNN)
์ปจ๋ณผ๋ฃจ์ ์ ๊ฒฝ๋ง = ์ ๋ ฅ๋ ์ด๋ฏธ์ง์์ ๋ค์ ํ๋ฒ ํน์ง์ ์ถ์ถํ๊ธฐ ์ํด ๋ง์คํฌ(ํํฐ, ์๋ ๋๋ ์ปค๋์ด๋ผ๊ณ ๋ ํจ)๋ฅผ ๋์ ํ๋ ๊ธฐ๋ฒ
์๋ ๊ฐ์ ๊ฐ์ค์น x1,x0์ ๊ณฑํ๋ ๋ง์คํฌ๋ฅผ ํ ์นธ์ฉ ์ฎ๊ฒจ ์ ์ฉํจ
์๋กญ๊ฒ ๋ง๋ค์ด์ง ์ธต = ํฉ์ฑ๊ณฑ(์ปจ๋ณผ๋ฃจ์ )
์ปจ๋ณผ๋ฃจ์ ์ ๋ง๋ค๋ฉด ์ ๋ ฅ ๋ฐ์ดํฐ๋ก๋ถํฐ ๋์ฑ ์ ๊ตํ ํน์ง์ ์ถ์ถํ ์ ์๋ค.
MNIST ์๊ธ์จ ์ธ์๋ฅ ํฅ์์ํค๊ธฐ:
Conv2D() : ์ผ๋ผ์ค์์ ์ปจ๋ณผ๋ฃจ์ ์ธต์ ์ถ๊ฐํ๋ ํจ์
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation=‘relu’))
1 | ์ฒซ ๋ฒ์งธ ์ธ์: ๋ง์คํฌ๋ฅผ ๋ช ๊ฐ ์ ์ฉํ ์ง ์ ํฉ๋๋ค. ์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ๋ง์คํฌ๋ฅผ ์ ์ฉํ๋ฉด ์๋ก ๋ค๋ฅธ ์ปจ๋ณผ๋ฃจ์ ์ด ์ฌ๋ฌ ๊ฐ ๋์ต๋๋ค. ์ฌ๊ธฐ์๋ 32๊ฐ์ ๋ง์คํฌ๋ฅผ ์ ์ฉํ์ต๋๋ค.
2 | kernel_size: ๋ง์คํฌ(์ปค๋)์ ํฌ๊ธฐ๋ฅผ ์ ํฉ๋๋ค. kernel_size=(ํ, ์ด) ํ์์ผ๋ก ์ ํ๋ฉฐ, ์ฌ๊ธฐ์๋ 3×3 ํฌ๊ธฐ์ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ๊ฒ๋ ์ ํ์์ต๋๋ค.
3 | input_shape: Dense ์ธต๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋งจ ์ฒ์ ์ธต์๋ ์ ๋ ฅ๋๋ ๊ฐ์ ์๋ ค์ฃผ์ด์ผ ํฉ๋๋ค. input_shape=(ํ, ์ด, ์์ ๋๋ ํ๋ฐฑ) ํ์์ผ๋ก ์ ํฉ๋๋ค. ๋ง์ฝ ์ ๋ ฅ ์ด๋ฏธ์ง๊ฐ ์์์ด๋ฉด 3, ํ๋ฐฑ์ด๋ฉด 1์ ์ง์ ํฉ๋๋ค.
4 | activation: ํ์ฑํ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ง์คํฌ 64๊ฐ๋ฅผ ์ ์ฉํ ์๋ก์ด ์ปจ๋ณผ๋ฃจ์ ์ธต์ ์ถ๊ฐํ ์ ์๋ค.
model.add(Conv2D(64, (3, 3), activation=‘relu’))
ํ๋ง(pooling) ๋๋ ์๋ธ ์ํ๋ง(sub sampling) : ์ปจ๋ณผ๋ฃจ์ ์ธต์ ํตํด ์ด๋ฏธ์ง ํน์ง์ ๋์ถํ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ ํ ํฌ๊ณ ๋ณต์กํ๋ฉด ๋ค์ ํ๋ฒ ์ถ์ํ๋ ๊ณผ์
ํ๋ง ๊ธฐ๋ฒ: ๋งฅ์ค ํ๋ง(max pooling) = ์ ํด์ง ๊ตฌ์ญ ์์์ ์ต๋๊ฐ ๋ฝ์ ,
ํ๊ท ํ๋ง(average pooling) = ํ๊ท ๊ฐ ๋ฝ์
๋งฅ์ค ํ๋ง(max pooling)
MaxPooling2D() ํจ์ : ๋งฅ์ค ํ๋ง ๊ตฌํ
pool_size = ํ๋ง ์ฐฝ์ ํฌ๊ธฐ, 2๋ก ์ ํ๋ฉด ์ ์ฒด ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ฆ
model.add(MaxPooling2D(pool_size=2))
๋๋กญ์์, ํ๋ํผ
๋ ธ๋๊ฐ ๋ง์์ง๊ฑฐ๋ ์ธต์ด ๋ง์์ง๋ค๊ณ ํด์ ํ์ต์ด ๋ฌด์กฐ๊ฑด ์ข์์ง๋ ๊ฒ์ ์๋๋ค (๊ณผ์ ํฉ)
ํ์ต์ ์คํ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ณผ์ ํฉ์ ์ผ๋ง๋ ํจ๊ณผ์ ์ผ๋ก ํผํด๊ฐ๋์ง์ ๋ฌ๋ ค ์๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋ค.
๊ณผ์ ํฉ ๋ฐฉ์ง์ ๊ฐ๋จํ์ง๋ง ํจ๊ณผ๊ฐ ํฐ ๊ธฐ๋ฒ์ ๋๋กญ์์(drop out)
๋๋กญ์์ = ์๋์ธต์ ๋ฐฐ์น๋ ๋ ธ๋ ์ค ์ผ๋ถ๋ฅผ ์์๋ก ๊บผ์ฃผ๋ ๊ฒ
model.add(Dropout(0.25))
์๋ฅผ ๋ค์ด, ์ผ๋ผ์ค์์ 25%์ ๋ ธ๋๋ฅผ ๋๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋ ์์ฑ
model.add(Flatten())
์์์ Dense() ํจ์๋ฅผ ์ด์ฉํด ๋ง๋ค์๋ ๊ธฐ๋ณธ ์ธต์ ์ฐ๊ฒฐํ๊ธฐ :
์ด๋ ์ปจ๋ณผ๋ฃจ์ ์ธต์ด๋ ๋งฅ์ค ํ๋ง์ ์ฃผ์ด์ง ์ด๋ฏธ์ง๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ธ ์ฑ๋ก ๋ค๋ฃจ๋ฏ๋ก
์ด๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ผ ํ์ฑํ ํจ์๊ฐ ์๋ ์ธต์์ ์ฌ์ฉ ๊ฐ๋ฅ
๋ฐ๋ผ์ Flatten() ํจ์๋ก 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ๋ฐ๊พธ๊ธฐ
์ ์ฒด์ฝ๋ : ๋ฅ๋ฌ๋ ๊ธฐ๋ณธ ํ๋ ์์ ๊ทธ๋๋ก ์ด์ฉํ๋ model ์ค์ ๋ถ๋ถ๋ง ์ง๊ธ๊น์ง ๋์จ ๋ด์ฉ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.callbacks import ModelCheckpoint,EarlyStopping
import matplotlib.pyplot as plt
import numpy
import os
import tensorflow as tf
# seed ๊ฐ ์ค์
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
# ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') / 255
Y_train = np_utils.to_categorical(Y_train)
Y_test = np_utils.to_categorical(Y_test)
# ์ปจ๋ณผ๋ฃจ์
์ ๊ฒฝ๋ง ์ค์
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# ๋ชจ๋ธ ์ต์ ํ ์ค์
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# ๋ชจ๋ธ์ ์คํ
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback,checkpointer])
# ํ
์คํธ ์ ํ๋ ์ถ๋ ฅ
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
# ํ
์คํธ์
์ ์ค์ฐจ
y_vloss = history.history['val_loss']
# ํ์ต์
์ ์ค์ฐจ
y_loss = history.history['loss']
# ๊ทธ๋ํ๋ก ํํ
x_len = numpy.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# ๊ทธ๋ํ์ ๊ทธ๋ฆฌ๋๋ฅผ ์ฃผ๊ณ ๋ ์ด๋ธ์ ํ์
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
Epoch 00012: val_loss improved from 0.02822 to 0.02565, saving model to ./model/12-0.0257.hdf5
Epoch 00013: val_loss did not improve from 0.02565
Epoch 00014: val_loss did not improve from 0.02565
Epoch 00015: val_loss did not improve from 0.02565
Epoch 00016: val_loss did not improve from 0.02565
Epoch 00017: val_loss did not improve from 0.02565
Epoch 00018: val_loss did not improve from 0.02565
Epoch 00019: val_loss did not improve from 0.02565
Epoch 00020: val_loss did not improve from 0.02565
Epoch 00021: val_loss did not improve from 0.02565
Epoch 00022: val_loss did not improve from 0.02565 10000/10000 [==============================] - 2s 204us/step
Test Accuracy: 0.9921
'๋ฅ๋ฌ๋ > Today I learned :' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋] Numpy ๋ผ์ด๋ธ๋ฌ๋ฆฌ (0) | 2021.03.31 |
---|---|
๋ฅ๋ฌ๋์ ์ด์ฉํ ์์ฐ์ด ์ฒ๋ฆฌ NLP (0) | 2021.03.28 |
[๋ฅ๋ฌ๋] ์ ํ ํ๊ท ์ ์ฉํ๊ธฐ (0) | 2021.03.26 |
[๋ฅ๋ฌ๋] ์์ธ์ ์ข ๋ฅ ์์ธกํ๊ธฐ (0) | 2021.03.25 |
[๋ฅ๋ฌ๋] ์ด์ํ ๊ด๋ฌผ ๋ฐ์ดํฐ : ๊ณผ์ ํฉ ํผํ๊ธฐ (0) | 2021.03.24 |