이 노트북에서는 지금까지 다룬 이론을 적용하여 은닉층을 추가한 신경망을 향상시켜 보겠습니다.
from tensorflow import keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout # new!
from tensorflow.keras.layers import BatchNormalization # new!
from tensorflow.keras.optimizers import SGD
(X_train, y_train), (X_valid, y_valid) = mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11490434/11490434 [==============================] - 2s 0us/step
X_train = X_train.reshape(60000, 784).astype('float32')
X_valid = X_valid.reshape(10000, 784).astype('float32')
X_train /= 255
X_valid /= 255
n_classes = 10
y_train = keras.utils.to_categorical(y_train, n_classes)
y_valid = keras.utils.to_categorical(y_valid, n_classes)
model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(784,)))
model.add(BatchNormalization())
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
model.add(Dense(10, activation='softmax'))
model.summary()
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 64) 50240 batch_normalization (BatchN (None, 64) 256 ormalization) dense_1 (Dense) (None, 64) 4160 batch_normalization_1 (Batc (None, 64) 256 hNormalization) dropout (Dropout) (None, 64) 0 dense_2 (Dense) (None, 64) 4160 batch_normalization_2 (Batc (None, 64) 256 hNormalization) dropout_1 (Dropout) (None, 64) 0 dense_3 (Dense) (None, 10) 650 ================================================================= Total params: 59,978 Trainable params: 59,594 Non-trainable params: 384 _________________________________________________________________
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=20, verbose=1, validation_data=(X_valid, y_valid))
Epoch 1/20 469/469 [==============================] - 6s 6ms/step - loss: 0.5565 - accuracy: 0.8329 - val_loss: 0.1835 - val_accuracy: 0.9446 Epoch 2/20 469/469 [==============================] - 2s 5ms/step - loss: 0.2256 - accuracy: 0.9350 - val_loss: 0.1502 - val_accuracy: 0.9527 Epoch 3/20 469/469 [==============================] - 2s 5ms/step - loss: 0.1700 - accuracy: 0.9508 - val_loss: 0.1369 - val_accuracy: 0.9568 Epoch 4/20 469/469 [==============================] - 2s 5ms/step - loss: 0.1391 - accuracy: 0.9594 - val_loss: 0.1028 - val_accuracy: 0.9684 Epoch 5/20 469/469 [==============================] - 2s 5ms/step - loss: 0.1176 - accuracy: 0.9655 - val_loss: 0.1006 - val_accuracy: 0.9693 Epoch 6/20 469/469 [==============================] - 3s 6ms/step - loss: 0.1063 - accuracy: 0.9685 - val_loss: 0.0961 - val_accuracy: 0.9714 Epoch 7/20 469/469 [==============================] - 3s 6ms/step - loss: 0.0939 - accuracy: 0.9725 - val_loss: 0.0944 - val_accuracy: 0.9725 Epoch 8/20 469/469 [==============================] - 3s 5ms/step - loss: 0.0837 - accuracy: 0.9749 - val_loss: 0.0924 - val_accuracy: 0.9729 Epoch 9/20 469/469 [==============================] - 2s 5ms/step - loss: 0.0804 - accuracy: 0.9766 - val_loss: 0.0885 - val_accuracy: 0.9753 Epoch 10/20 469/469 [==============================] - 2s 5ms/step - loss: 0.0724 - accuracy: 0.9782 - val_loss: 0.0894 - val_accuracy: 0.9743 Epoch 11/20 469/469 [==============================] - 3s 5ms/step - loss: 0.0703 - accuracy: 0.9791 - val_loss: 0.0892 - val_accuracy: 0.9726 Epoch 12/20 469/469 [==============================] - 3s 5ms/step - loss: 0.0650 - accuracy: 0.9804 - val_loss: 0.0831 - val_accuracy: 0.9765 Epoch 13/20 469/469 [==============================] - 3s 5ms/step - loss: 0.0592 - accuracy: 0.9821 - val_loss: 0.1061 - val_accuracy: 0.9680 Epoch 14/20 469/469 [==============================] - 2s 5ms/step - loss: 0.0560 - accuracy: 0.9832 - val_loss: 0.0998 - val_accuracy: 0.9741 Epoch 15/20 469/469 [==============================] - 2s 5ms/step - loss: 0.0539 - accuracy: 0.9832 - val_loss: 0.0921 - val_accuracy: 0.9738 Epoch 16/20 469/469 [==============================] - 2s 5ms/step - loss: 0.0490 - accuracy: 0.9848 - val_loss: 0.0831 - val_accuracy: 0.9764 Epoch 17/20 469/469 [==============================] - 2s 5ms/step - loss: 0.0484 - accuracy: 0.9847 - val_loss: 0.0898 - val_accuracy: 0.9752 Epoch 18/20 469/469 [==============================] - 3s 5ms/step - loss: 0.0443 - accuracy: 0.9863 - val_loss: 0.0881 - val_accuracy: 0.9774 Epoch 19/20 469/469 [==============================] - 3s 5ms/step - loss: 0.0406 - accuracy: 0.9869 - val_loss: 0.0831 - val_accuracy: 0.9765 Epoch 20/20 469/469 [==============================] - 3s 6ms/step - loss: 0.0409 - accuracy: 0.9874 - val_loss: 0.0936 - val_accuracy: 0.9755
<keras.callbacks.History at 0x7f7d301d6d30>