CNNμ μ¬μ©νμ¬ Kerasλ‘ MNIST μκΈμ¨ μΈμ μμ λ₯Ό νμ΄ λ΄ λλ€. CNN (convolutional neural network)μ λ₯λ¬λμ ν μ’ λ₯λ‘ μ£Όλ‘ μ΄λ―Έμ§λ₯Ό μΈμνλλ° μ¬μ©λ©λλ€.
CNNμ μ΄λ―Έμ§μμ κ°μ²΄, μΌκ΅΄, μ₯λ©΄μ μΈμνκΈ° μν΄ ν¨ν΄μ μ°Ύλ λ° νΉν μ μ©ν©λλ€. CNNμ λ°μ΄ν°μμ μ§μ νμ΅νλ©°, ν¨ν΄μ μ¬μ©νμ¬ μ΄λ―Έμ§λ₯Ό λΆλ₯νκ³ νΉμ§μ μλμΌλ‘ μΆμΆν νμκ° μμ΅λλ€.
μμ¨ μ£Όν μλμ°¨, μΌκ΅΄ μΈμ μ ν리μΌμ΄μ κ³Ό κ°μ΄ κ°μ²΄ μΈμκ³Ό μ»΄ν¨ν° λΉμ μ΄ νμν λΆμΌμμ CNNμ λ§μ΄ μ¬μ©ν©λλ€. μμ© λΆμΌμ λ°λΌ CNNμ μ²μλΆν° λ§λ€ μλ μκ³ , λ°μ΄ν°μ μΌλ‘ μ¬μ νμ΅λ λͺ¨λΈμ μ¬μ©ν μλ μμ΅λλ€.
CNNμ μ΄λ―Έμ§ μΈμκ³Ό ν¨ν΄ κ°μ§λ₯Ό μν μ΅μ μ μν€ν μ²λ₯Ό μ 곡ν©λλ€. CNNμ λ°μ μ κ±°λν΄ μ¨ GPUμ λ³λ ¬ μ»΄ν¨ν κ³Ό ν¨κ» νμ©λμ΄ μμ¨ μ£Όνκ³Ό μΌκ΅΄ μΈμ κΈ°μ μ΄ μλ‘κ² λ±μ₯νλ λ°νμ λ§λ ¨νμ΅λλ€. μΌλ‘λ‘ λ₯λ¬λ μ ν리μΌμ΄μ μ CNNμ ν΅ν΄ μμ² κ°μ λ³λ¦¬ν λ³΄κ³ μλ₯Ό λΆμνμ¬ μμΈν¬λ₯Ό μκ°μ μΌλ‘ κ²μΆν©λλ€. μμ¨ μ£Όν μλμ°¨κ° κ°μ²΄λ₯Ό κ°μ§νκ³ λλ‘ νμ§νκ³Ό 보νμμ μ°¨μ΄λ₯Ό ꡬλΆν μ μλ κ²λ λ°λ‘ CNN λλΆμ λλ€.
CNNμ λ€λ₯Έ μ κ²½λ§κ³Ό λ§μ°¬κ°μ§λ‘ μ λ ₯ κ³μΈ΅, μΆλ ₯ κ³μΈ΅ λ° λ κ³μΈ΅ μ¬μ΄μ μ¬λ¬ μλ κ³μΈ΅μΌλ‘ ꡬμ±λ©λλ€.
κ° κ³μΈ΅μ ν΄λΉ λ°μ΄ν°λ§μ΄ κ°λ νΉμ§μ νμ΅νκΈ° μν΄ λ°μ΄ν°λ₯Ό λ³κ²½νλ κ³μ°μ μνν©λλ€. κ°μ₯ μμ£Ό μ¬μ©λλ κ³μΈ΅μΌλ‘λ 컨λ²λ£¨μ , νμ±ν/ReLU, νλ§μ΄ μμ΅λλ€.
컨λ²λ£¨μ μ κ° μ΄λ―Έμ§μμ νΉμ νΉμ§μ νμ±ννλ 컨λ²λ£¨μ νν° μ§ν©μ μ λ ₯ μ΄λ―Έμ§λ₯Ό ν΅κ³Όμν΅λλ€.
**ReLU(Rectified Linear Unit)**λ μμ κ°μ 0μ λ§€ννκ³ μμ κ°μ μ μ§νμ¬ λ λΉ λ₯΄κ³ ν¨κ³Όμ μΈ νμ΅μ κ°λ₯νκ² ν©λλ€. μ΄λ νμ±νλ νΉμ§λ§ λ€μ κ³μΈ΅μΌλ‘ μ λ¬λκΈ° λλ¬Έμ μ΄ κ³Όμ μ νμ±νλΌ λΆλ₯΄κΈ°λ ν©λλ€.
νλ§μ λΉμ ν λ€μ΄μνλ§μ μννκ³ λ€νΈμν¬μμ νμ΅ν΄μΌ νλ λ§€κ° λ³μ μλ₯Ό μ€μ¬μ μΆλ ₯μ κ°μνν©λλ€.
μ΄λ¬ν μμ μ΄ μμ κ° λλ μλ°± κ°μ κ³μΈ΅μμ λ°λ³΅λμ΄ κ° κ³μΈ΅μ΄ μ¬λ¬ νΉμ§μ κ²μΆνλ λ°©λ²μ νμ΅νκ² λ©λλ€.
μ¬λ¬ κ°μ 컨λ²λ£¨μ κ³μΈ΅μΌλ‘ ꡬμ±λ λ€νΈμν¬μ μ. νν°λ κ° νμ΅ μ΄λ―Έμ§μ μλ‘ λ€λ₯Έ ν΄μλλ‘ μ μ©λκ³ , νν°μ μΆλ ₯μ λ€μ κ³μΈ΅μ μ λ ₯μΌλ‘ νμ©λ©λλ€.
Keras λ₯Ό μ¬μ©νλ μ½λ μμλ μμ CNNꡬ쑰μ μΌμΉ ν©λλ€. μ§κ΄μ μ΄μ΄μ μ΄ν΄κ° λΉ λ¦ λλ€.
import sys
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
import numpy as np
img_rows = 28
img_cols = 28
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
input_shape = (img_rows, img_cols, 1)
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
batch_size = 128
num_classes = 10
epochs = 12 #μ¬λ¬λ² νμ΅νλ©΄ μ’κ² μ§λ§ μκ°κ΄κ³μ 3λ²λ§ νμ΅νκ³ κ²°κ³Όλ₯Ό νμΈν©λλ€.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), padding='same', activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, (2, 2), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
hist = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])60,000κ° μ 체λ₯Ό 12λ² νμ΅νλλ° λ§μ μκ°μ΄ μμλ©λλ€.
κ²°κ³Όλ 99.14% μ νλκ° λμ΅λλ€.
Test loss: 0.02729845507494465
Test accuracy: 0.9914
νμ΅μ κ²°κ³Όλ₯Ό κ·Έλ¦ΌμΌλ‘ νμΈν΄ λ³΄κ³ μΆλ€λ©΄ μμ μ½λ μλμ λ€μκ³Ό κ°μ μ½λλ₯Ό μΆκ°ν©λλ€. 16κ°μ νμ΅ κ²°κ³Όλ₯Ό λΉκ΅ν©λλ€.
import random
import matplotlib.pyplot as plt
predicted_result = model.predict(x_test)
predicted_labels = np.argmax(predicted_result, axis=1)
test_labels = np.argmax(y_test, axis=1)
count = 0
plt.figure(figsize=(12,8))
for n in range(16):
count += 1
plt.subplot(4, 4, count)
plt.imshow(x_test[n].reshape(28, 28), cmap='Greys', interpolation='nearest')
tmp = "Label:" + str(test_labels[n]) + ", Prediction:" + str(predicted_labels[n])
plt.title(tmp)
plt.tight_layout()
plt.show()

