playdata
Deep Learning(0909_day5)
_JAEJAE_
2021. 9. 9. 17:19
Fashion MNIST Dataset 신경망 훈련¶
import¶
In [1]:
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.utils import to_categorical
In [34]:
np.random.seed(42)
tf.random.set_seed(42)
In [35]:
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
In [36]:
train_images.shape, test_images.shape
Out[36]:
((60000, 28, 28), (10000, 28, 28))
In [37]:
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
figure, axes = plt.subplots(figsize=(22, 6), nrows=1, ncols=8)
for i in range(8):
axes[i].imshow(train_images[i], cmap="gray")
axes[i].set_title(class_names[train_labels[i]])
In [38]:
train_images = np.array(train_images/255.0, dtype=np.float32)
train_labels = np.array(train_labels, dtype=np.float32)
test_images = np.array(test_images/255.0, dtype=np.float32)
test_labels = np.array(test_labels, dtype=np.float32)
train_oh_labels = to_categorical(train_labels)
test_oh_labels = to_categorical(test_labels)
모델 생성¶
- Sequential API
- 입력층이 따로 필요없음
- 직관적이고 편리하지만 복잡한 모델 구현하는데 한계가 있음
In [ ]:
from tensorflow.keras.models import Sequential
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(50, activation='sigmoid'),
Dense(10, activation='softmax')
])
model.summary()
- 함수형 API(Functional API)
- 입력층이 따로 정의
- 이전층이 다음층의 입력으로 사용됨
- 각 층을 일종의 함수로 정의
- 확장성이 좋음(다중 입출력 등 복잡한 모델 구현 가능)
In [10]:
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Flatten, Dense
In [39]:
input_tensor = Input(shape=(28, 28))
x = Flatten()(input_tensor) # 객체 만들고 함수 호출하는 방식
x = Dense(50, activation='sigmoid')(x)
output = Dense(10, activation='softmax')(x)
model = Model(inputs=input_tensor, outputs=output)
모델 컴파일(optimizer, loss등 설정)¶
In [12]:
from tensorflow.keras.optimizers import SGD
In [40]:
model.compile(optimizer=SGD(0.1), loss='categorical_crossentropy', metrics=['accuracy'])
모델 학습¶
- Callback - ModelCheckpoint
In [62]:
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau
In [49]:
checkpoint_cb = ModelCheckpoint("my_keras_model.h5", save_best_only=True, verbose=1)
# checkpoint_cb = ModelCheckpoint("weights.{epoch:02d}-{val_loss:.2f}.h5", save_best_only=True, verbose=1)
In [50]:
history = model.fit(train_images, train_oh_labels, validation_split=0.2, batch_size=128, epochs=20, verbose=1, callbacks=[checkpoint_cb])
Epoch 1/20 371/375 [============================>.] - ETA: 0s - loss: 0.2970 - accuracy: 0.8946 Epoch 00001: val_loss improved from inf to 0.34598, saving model to my_keras_model.h5 375/375 [==============================] - 1s 3ms/step - loss: 0.2974 - accuracy: 0.8943 - val_loss: 0.3460 - val_accuracy: 0.8780 Epoch 2/20 374/375 [============================>.] - ETA: 0s - loss: 0.2961 - accuracy: 0.8956 Epoch 00002: val_loss improved from 0.34598 to 0.34355, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2963 - accuracy: 0.8956 - val_loss: 0.3436 - val_accuracy: 0.8767 Epoch 3/20 373/375 [============================>.] - ETA: 0s - loss: 0.2949 - accuracy: 0.8951 Epoch 00003: val_loss improved from 0.34355 to 0.34073, saving model to my_keras_model.h5 375/375 [==============================] - 1s 3ms/step - loss: 0.2947 - accuracy: 0.8952 - val_loss: 0.3407 - val_accuracy: 0.8782 Epoch 4/20 366/375 [============================>.] - ETA: 0s - loss: 0.2931 - accuracy: 0.8969 Epoch 00004: val_loss improved from 0.34073 to 0.33938, saving model to my_keras_model.h5 375/375 [==============================] - 1s 3ms/step - loss: 0.2942 - accuracy: 0.8965 - val_loss: 0.3394 - val_accuracy: 0.8787 Epoch 5/20 353/375 [===========================>..] - ETA: 0s - loss: 0.2926 - accuracy: 0.8954 Epoch 00005: val_loss did not improve from 0.33938 375/375 [==============================] - 1s 2ms/step - loss: 0.2926 - accuracy: 0.8957 - val_loss: 0.3470 - val_accuracy: 0.8767 Epoch 6/20 363/375 [============================>.] - ETA: 0s - loss: 0.2917 - accuracy: 0.8960 Epoch 00006: val_loss improved from 0.33938 to 0.33850, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2917 - accuracy: 0.8960 - val_loss: 0.3385 - val_accuracy: 0.8779 Epoch 7/20 359/375 [===========================>..] - ETA: 0s - loss: 0.2893 - accuracy: 0.8981 Epoch 00007: val_loss did not improve from 0.33850 375/375 [==============================] - 1s 2ms/step - loss: 0.2907 - accuracy: 0.8975 - val_loss: 0.3390 - val_accuracy: 0.8808 Epoch 8/20 371/375 [============================>.] - ETA: 0s - loss: 0.2908 - accuracy: 0.8968 Epoch 00008: val_loss did not improve from 0.33850 375/375 [==============================] - 1s 2ms/step - loss: 0.2905 - accuracy: 0.8968 - val_loss: 0.3402 - val_accuracy: 0.8789 Epoch 9/20 373/375 [============================>.] - ETA: 0s - loss: 0.2874 - accuracy: 0.8988 Epoch 00009: val_loss did not improve from 0.33850 375/375 [==============================] - 1s 2ms/step - loss: 0.2877 - accuracy: 0.8988 - val_loss: 0.3399 - val_accuracy: 0.8780 Epoch 10/20 373/375 [============================>.] - ETA: 0s - loss: 0.2872 - accuracy: 0.8976 Epoch 00010: val_loss did not improve from 0.33850 375/375 [==============================] - 1s 2ms/step - loss: 0.2873 - accuracy: 0.8976 - val_loss: 0.3390 - val_accuracy: 0.8806 Epoch 11/20 360/375 [===========================>..] - ETA: 0s - loss: 0.2863 - accuracy: 0.8988 Epoch 00011: val_loss improved from 0.33850 to 0.33691, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2860 - accuracy: 0.8986 - val_loss: 0.3369 - val_accuracy: 0.8792 Epoch 12/20 369/375 [============================>.] - ETA: 0s - loss: 0.2847 - accuracy: 0.8990 Epoch 00012: val_loss did not improve from 0.33691 375/375 [==============================] - 1s 2ms/step - loss: 0.2851 - accuracy: 0.8991 - val_loss: 0.3378 - val_accuracy: 0.8795 Epoch 13/20 356/375 [===========================>..] - ETA: 0s - loss: 0.2839 - accuracy: 0.8988 ETA: 0s - loss: 0.2845 - Epoch 00013: val_loss did not improve from 0.33691 375/375 [==============================] - 1s 2ms/step - loss: 0.2840 - accuracy: 0.8991 - val_loss: 0.3408 - val_accuracy: 0.8788 Epoch 14/20 361/375 [===========================>..] - ETA: 0s - loss: 0.2823 - accuracy: 0.8988 ETA: 0s - loss: 0.2809 - accuracy: 0. Epoch 00014: val_loss improved from 0.33691 to 0.33617, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2829 - accuracy: 0.8985 - val_loss: 0.3362 - val_accuracy: 0.8808 Epoch 15/20 361/375 [===========================>..] - ETA: 0s - loss: 0.2808 - accuracy: 0.9004 Epoch 00015: val_loss did not improve from 0.33617 375/375 [==============================] - 1s 2ms/step - loss: 0.2820 - accuracy: 0.8997 - val_loss: 0.3374 - val_accuracy: 0.8796 Epoch 16/20 361/375 [===========================>..] - ETA: 0s - loss: 0.2807 - accuracy: 0.8998 Epoch 00016: val_loss improved from 0.33617 to 0.33496, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2808 - accuracy: 0.9000 - val_loss: 0.3350 - val_accuracy: 0.8816 Epoch 17/20 361/375 [===========================>..] - ETA: 0s - loss: 0.2798 - accuracy: 0.9011 Epoch 00017: val_loss did not improve from 0.33496 375/375 [==============================] - 1s 2ms/step - loss: 0.2798 - accuracy: 0.9008 - val_loss: 0.3365 - val_accuracy: 0.8802 Epoch 18/20 357/375 [===========================>..] - ETA: 0s - loss: 0.2792 - accuracy: 0.9003 Epoch 00018: val_loss improved from 0.33496 to 0.33446, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2788 - accuracy: 0.9005 - val_loss: 0.3345 - val_accuracy: 0.8798 Epoch 19/20 365/375 [============================>.] - ETA: 0s - loss: 0.2774 - accuracy: 0.9012 Epoch 00019: val_loss improved from 0.33446 to 0.33341, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2773 - accuracy: 0.9010 - val_loss: 0.3334 - val_accuracy: 0.8802 Epoch 20/20 368/375 [============================>.] - ETA: 0s - loss: 0.2766 - accuracy: 0.9016 Epoch 00020: val_loss did not improve from 0.33341 375/375 [==============================] - 1s 2ms/step - loss: 0.2766 - accuracy: 0.9016 - val_loss: 0.3380 - val_accuracy: 0.8793
In [51]:
model.evaluate(test_images, test_oh_labels, batch_size=128)
79/79 [==============================] - 0s 2ms/step - loss: 0.3620 - accuracy: 0.8699
Out[51]:
[0.36198118329048157, 0.8698999881744385]
In [21]:
from tensorflow.keras.models import load_model
In [52]:
model2 = load_model("my_keras_model.h5")
In [53]:
model2.evaluate(test_images, test_oh_labels, batch_size=128)
79/79 [==============================] - 0s 2ms/step - loss: 0.3582 - accuracy: 0.8727
Out[53]:
[0.3582404553890228, 0.8726999759674072]
- Callback - EarlyStopping
In [70]:
early_stopping_cb = EarlyStopping(patience=20, restore_best_weights=True)
In [60]:
history = model.fit(train_images, train_oh_labels, validation_split=0.2, batch_size=128, epochs=50, verbose=1, callbacks=[early_stopping_cb])
Epoch 1/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2336 - accuracy: 0.9164 - val_loss: 0.3300 - val_accuracy: 0.8822 Epoch 2/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2329 - accuracy: 0.9175 - val_loss: 0.3281 - val_accuracy: 0.8816 Epoch 3/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2321 - accuracy: 0.9168 - val_loss: 0.3242 - val_accuracy: 0.8837 Epoch 4/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2320 - accuracy: 0.9181 - val_loss: 0.3251 - val_accuracy: 0.8845 Epoch 5/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2311 - accuracy: 0.9181 - val_loss: 0.3333 - val_accuracy: 0.8846 Epoch 6/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2308 - accuracy: 0.9182 - val_loss: 0.3242 - val_accuracy: 0.8853 Epoch 7/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2305 - accuracy: 0.9177 - val_loss: 0.3249 - val_accuracy: 0.8852 Epoch 8/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2305 - accuracy: 0.9180 - val_loss: 0.3296 - val_accuracy: 0.8838 Epoch 9/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2280 - accuracy: 0.9203 - val_loss: 0.3279 - val_accuracy: 0.8845 Epoch 10/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2280 - accuracy: 0.9196 - val_loss: 0.3247 - val_accuracy: 0.8843 Epoch 11/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2274 - accuracy: 0.9189 - val_loss: 0.3262 - val_accuracy: 0.8852 Epoch 12/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2271 - accuracy: 0.9198 - val_loss: 0.3261 - val_accuracy: 0.8836 Epoch 13/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2264 - accuracy: 0.9200 - val_loss: 0.3317 - val_accuracy: 0.8846
In [61]:
model.evaluate(test_images, test_oh_labels, batch_size=128)
79/79 [==============================] - 0s 2ms/step - loss: 0.3488 - accuracy: 0.8746
Out[61]:
[0.348783403635025, 0.8745999932289124]
- Callback - ReduceLROnPlateau
In [63]:
reducelr_cb = ReduceLROnPlateau(verbose=1)
In [64]:
history = model.fit(train_images, train_oh_labels, validation_split=0.2, batch_size=128, epochs=50, verbose=1, callbacks=[reducelr_cb])
Epoch 1/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2316 - accuracy: 0.9172 - val_loss: 0.3300 - val_accuracy: 0.8817 Epoch 2/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2309 - accuracy: 0.9180 - val_loss: 0.3281 - val_accuracy: 0.8819 Epoch 3/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2302 - accuracy: 0.9174 - val_loss: 0.3241 - val_accuracy: 0.8832 Epoch 4/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2302 - accuracy: 0.9187 - val_loss: 0.3251 - val_accuracy: 0.8845 Epoch 5/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2292 - accuracy: 0.9189 - val_loss: 0.3333 - val_accuracy: 0.8849 Epoch 6/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2290 - accuracy: 0.9192 - val_loss: 0.3242 - val_accuracy: 0.8856 Epoch 7/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2287 - accuracy: 0.9184 - val_loss: 0.3249 - val_accuracy: 0.8849 Epoch 8/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2286 - accuracy: 0.9187 - val_loss: 0.3296 - val_accuracy: 0.8839 Epoch 9/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2262 - accuracy: 0.9208 - val_loss: 0.3279 - val_accuracy: 0.8846 Epoch 10/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2261 - accuracy: 0.9203 - val_loss: 0.3246 - val_accuracy: 0.8848 Epoch 11/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2256 - accuracy: 0.9195 - val_loss: 0.3263 - val_accuracy: 0.8852 Epoch 12/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2253 - accuracy: 0.9204 - val_loss: 0.3261 - val_accuracy: 0.8837 Epoch 13/50 364/375 [============================>.] - ETA: 0s - loss: 0.2251 - accuracy: 0.9204 Epoch 00013: ReduceLROnPlateau reducing learning rate to 0.010000000149011612. 375/375 [==============================] - 1s 2ms/step - loss: 0.2246 - accuracy: 0.9204 - val_loss: 0.3318 - val_accuracy: 0.8850 Epoch 14/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2182 - accuracy: 0.9230 - val_loss: 0.3224 - val_accuracy: 0.8851 Epoch 15/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2174 - accuracy: 0.9237 - val_loss: 0.3226 - val_accuracy: 0.8852 Epoch 16/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2172 - accuracy: 0.9238 - val_loss: 0.3222 - val_accuracy: 0.8862 Epoch 17/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2172 - accuracy: 0.9242 - val_loss: 0.3224 - val_accuracy: 0.8856 Epoch 18/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2171 - accuracy: 0.9235 - val_loss: 0.3222 - val_accuracy: 0.8856 Epoch 19/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2170 - accuracy: 0.9235 - val_loss: 0.3221 - val_accuracy: 0.8856 Epoch 20/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2170 - accuracy: 0.9241 - val_loss: 0.3223 - val_accuracy: 0.8861 Epoch 21/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2169 - accuracy: 0.9243 - val_loss: 0.3221 - val_accuracy: 0.8860 Epoch 22/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2168 - accuracy: 0.9241 - val_loss: 0.3226 - val_accuracy: 0.8854 Epoch 23/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2168 - accuracy: 0.9243 - val_loss: 0.3223 - val_accuracy: 0.8857 Epoch 24/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2166 - accuracy: 0.9243 - val_loss: 0.3233 - val_accuracy: 0.8836 Epoch 25/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2165 - accuracy: 0.9243 - val_loss: 0.3226 - val_accuracy: 0.8861 Epoch 26/50 353/375 [===========================>..] - ETA: 0s - loss: 0.2169 - accuracy: 0.9238 Epoch 00026: ReduceLROnPlateau reducing learning rate to 0.0009999999776482583. 375/375 [==============================] - 1s 2ms/step - loss: 0.2165 - accuracy: 0.9241 - val_loss: 0.3229 - val_accuracy: 0.8851 Epoch 27/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2160 - accuracy: 0.9243 - val_loss: 0.3225 - val_accuracy: 0.8850 Epoch 28/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2159 - accuracy: 0.9243 - val_loss: 0.3224 - val_accuracy: 0.8854 Epoch 29/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9243 - val_loss: 0.3224 - val_accuracy: 0.8855 Epoch 30/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9244 - val_loss: 0.3224 - val_accuracy: 0.8852 Epoch 31/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8853 Epoch 32/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9242 - val_loss: 0.3223 - val_accuracy: 0.8854 Epoch 33/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9245 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 34/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8854 Epoch 35/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9245 - val_loss: 0.3224 - val_accuracy: 0.8853 Epoch 36/50 364/375 [============================>.] - ETA: 0s - loss: 0.2154 - accuracy: 0.9249 Epoch 00036: ReduceLROnPlateau reducing learning rate to 9.999999310821295e-05. 375/375 [==============================] - 1s 2ms/step - loss: 0.2158 - accuracy: 0.9245 - val_loss: 0.3223 - val_accuracy: 0.8854 Epoch 37/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9243 - val_loss: 0.3223 - val_accuracy: 0.8855 Epoch 38/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8855 Epoch 39/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8855 Epoch 40/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8854 Epoch 41/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8854 Epoch 42/50 375/375 [==============================] - 1s 3ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 43/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9243 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 44/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 45/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 46/50 366/375 [============================>.] - ETA: 0s - loss: 0.2162 - accuracy: 0.9242 Epoch 00046: ReduceLROnPlateau reducing learning rate to 9.999999019782991e-06. 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 47/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 48/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 49/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 50/50 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856
In [65]:
model.evaluate(test_images, test_oh_labels, batch_size=128)
79/79 [==============================] - 0s 2ms/step - loss: 0.3474 - accuracy: 0.8765
Out[65]:
[0.34735679626464844, 0.8765000104904175]
- Callback 조합
In [72]:
history = model.fit(train_images, train_oh_labels, validation_split=0.2, batch_size=128, epochs=50, verbose=1, callbacks=[checkpoint_cb, reducelr_cb, early_stopping_cb])
Epoch 1/50 368/375 [============================>.] - ETA: 0s - loss: 0.2149 - accuracy: 0.9248 Epoch 00001: val_loss improved from 0.33341 to 0.32232, saving model to my_keras_model.h5 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 2/50 375/375 [==============================] - ETA: 0s - loss: 0.2157 - accuracy: 0.9244 Epoch 00002: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 3/50 351/375 [===========================>..] - ETA: 0s - loss: 0.2155 - accuracy: 0.9241 Epoch 00003: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 4/50 367/375 [============================>.] - ETA: 0s - loss: 0.2146 - accuracy: 0.9247 Epoch 00004: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 5/50 366/375 [============================>.] - ETA: 0s - loss: 0.2152 - accuracy: 0.9245 Epoch 00005: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 6/50 365/375 [============================>.] - ETA: 0s - loss: 0.2159 - accuracy: 0.9243 Epoch 00006: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 7/50 361/375 [===========================>..] - ETA: 0s - loss: 0.2148 - accuracy: 0.9246 Epoch 00007: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 8/50 358/375 [===========================>..] - ETA: 0s - loss: 0.2163 - accuracy: 0.9241 Epoch 00008: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 9/50 350/375 [===========================>..] - ETA: 0s - loss: 0.2143 - accuracy: 0.9248 Epoch 00009: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 10/50 356/375 [===========================>..] - ETA: 0s - loss: 0.2151 - accuracy: 0.9243 Epoch 00010: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 11/50 353/375 [===========================>..] - ETA: 0s - loss: 0.2162 - accuracy: 0.9242 Epoch 00011: val_loss did not improve from 0.32232 Epoch 00011: ReduceLROnPlateau reducing learning rate to 9.999999092680235e-13. 375/375 [==============================] - 1s 3ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 12/50 363/375 [============================>.] - ETA: 0s - loss: 0.2159 - accuracy: 0.9242 Epoch 00012: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 3ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 13/50 365/375 [============================>.] - ETA: 0s - loss: 0.2162 - accuracy: 0.9244 Epoch 00013: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 3ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 14/50 369/375 [============================>.] - ETA: 0s - loss: 0.2154 - accuracy: 0.9246 Epoch 00014: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 15/50 356/375 [===========================>..] - ETA: 0s - loss: 0.2144 - accuracy: 0.9247 Epoch 00015: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 16/50 358/375 [===========================>..] - ETA: 0s - loss: 0.2154 - accuracy: 0.9241 Epoch 00016: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 17/50 353/375 [===========================>..] - ETA: 0s - loss: 0.2148 - accuracy: 0.9247 Epoch 00017: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 18/50 374/375 [============================>.] - ETA: 0s - loss: 0.2158 - accuracy: 0.9243 Epoch 00018: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 19/50 355/375 [===========================>..] - ETA: 0s - loss: 0.2159 - accuracy: 0.9245 Epoch 00019: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 20/50 355/375 [===========================>..] - ETA: 0s - loss: 0.2153 - accuracy: 0.9247 Epoch 00020: val_loss did not improve from 0.32232 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856 Epoch 21/50 370/375 [============================>.] - ETA: 0s - loss: 0.2156 - accuracy: 0.9245 Epoch 00021: val_loss did not improve from 0.32232 Epoch 00021: ReduceLROnPlateau reducing learning rate to 9.9999988758398e-14. 375/375 [==============================] - 1s 2ms/step - loss: 0.2157 - accuracy: 0.9244 - val_loss: 0.3223 - val_accuracy: 0.8856
In [73]:
model.evaluate(test_images, test_oh_labels, batch_size=128)
79/79 [==============================] - 0s 2ms/step - loss: 0.3474 - accuracy: 0.8766
Out[73]:
[0.34735655784606934, 0.8766000270843506]
하이퍼 파라미터 튜닝¶
In [79]:
def build_model(n_neurons=50):
input_tensor = Input(shape=(28, 28))
x = Flatten()(input_tensor)
x = Dense(n_neurons, activation='sigmoid')(x)
output = Dense(10, activation='softmax')(x)
model = Model(inputs=input_tensor, outputs=output)
model.compile(optimizer=SGD(0.1), loss='categorical_crossentropy', metrics=['accuracy'])
return model
In [80]:
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
In [81]:
keras_clf = KerasClassifier(build_model)
In [82]:
param_grid = {
"n_neurons" : [50, 100]
}
grid_search = GridSearchCV(keras_clf, param_grid, cv=3)
grid_search.fit(train_images, train_oh_labels, validation_split=0.2, batch_size=128, epochs=10, verbose=1)
Epoch 1/10 250/250 [==============================] - 1s 3ms/step - loss: 1.2658 - accuracy: 0.6570 - val_loss: 0.8557 - val_accuracy: 0.7427 Epoch 2/10 250/250 [==============================] - 1s 2ms/step - loss: 0.7579 - accuracy: 0.7613 - val_loss: 0.6814 - val_accuracy: 0.7739 Epoch 3/10 250/250 [==============================] - 1s 2ms/step - loss: 0.6416 - accuracy: 0.7883 - val_loss: 0.6076 - val_accuracy: 0.7944 Epoch 4/10 250/250 [==============================] - 1s 2ms/step - loss: 0.5814 - accuracy: 0.8042 - val_loss: 0.5696 - val_accuracy: 0.8043 Epoch 5/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5427 - accuracy: 0.8172 - val_loss: 0.5350 - val_accuracy: 0.8119 Epoch 6/10 250/250 [==============================] - 1s 2ms/step - loss: 0.5160 - accuracy: 0.8239 - val_loss: 0.5150 - val_accuracy: 0.8220 Epoch 7/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4961 - accuracy: 0.8294 - val_loss: 0.4970 - val_accuracy: 0.8232 Epoch 8/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4803 - accuracy: 0.8342 - val_loss: 0.4869 - val_accuracy: 0.8259 Epoch 9/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4682 - accuracy: 0.8388 - val_loss: 0.4734 - val_accuracy: 0.8292 Epoch 10/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4574 - accuracy: 0.8431 - val_loss: 0.4753 - val_accuracy: 0.8289 625/625 [==============================] - 1s 2ms/step - loss: 0.4717 - accuracy: 0.8346 Epoch 1/10 250/250 [==============================] - 1s 4ms/step - loss: 1.2368 - accuracy: 0.6626 - val_loss: 0.8489 - val_accuracy: 0.7475 Epoch 2/10 250/250 [==============================] - 1s 3ms/step - loss: 0.7504 - accuracy: 0.7575 - val_loss: 0.6782 - val_accuracy: 0.7644 Epoch 3/10 250/250 [==============================] - 1s 2ms/step - loss: 0.6374 - accuracy: 0.7842 - val_loss: 0.6054 - val_accuracy: 0.7895 Epoch 4/10 250/250 [==============================] - 1s 2ms/step - loss: 0.5792 - accuracy: 0.8012 - val_loss: 0.5626 - val_accuracy: 0.8059 Epoch 5/10 250/250 [==============================] - 1s 2ms/step - loss: 0.5422 - accuracy: 0.8143 - val_loss: 0.5364 - val_accuracy: 0.8129 Epoch 6/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5163 - accuracy: 0.8225 - val_loss: 0.5193 - val_accuracy: 0.8155 Epoch 7/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4978 - accuracy: 0.8262 - val_loss: 0.5012 - val_accuracy: 0.8234 Epoch 8/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4828 - accuracy: 0.8314 - val_loss: 0.4899 - val_accuracy: 0.8250 Epoch 9/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4712 - accuracy: 0.8355 - val_loss: 0.4813 - val_accuracy: 0.8304 Epoch 10/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4611 - accuracy: 0.8384 - val_loss: 0.4719 - val_accuracy: 0.8270 625/625 [==============================] - 1s 2ms/step - loss: 0.4660 - accuracy: 0.8397 Epoch 1/10 250/250 [==============================] - 1s 4ms/step - loss: 1.2627 - accuracy: 0.6682 - val_loss: 0.8519 - val_accuracy: 0.7517 Epoch 2/10 250/250 [==============================] - 1s 3ms/step - loss: 0.7526 - accuracy: 0.7576 - val_loss: 0.6799 - val_accuracy: 0.7724 Epoch 3/10 250/250 [==============================] - 1s 3ms/step - loss: 0.6386 - accuracy: 0.7852 - val_loss: 0.6046 - val_accuracy: 0.7986 Epoch 4/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5794 - accuracy: 0.8033 - val_loss: 0.5612 - val_accuracy: 0.8138 Epoch 5/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5419 - accuracy: 0.8145 - val_loss: 0.5307 - val_accuracy: 0.8202 Epoch 6/10 250/250 [==============================] - 1s 2ms/step - loss: 0.5159 - accuracy: 0.8221 - val_loss: 0.5156 - val_accuracy: 0.8242 Epoch 7/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4958 - accuracy: 0.8278 - val_loss: 0.4937 - val_accuracy: 0.8335 Epoch 8/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4801 - accuracy: 0.8333 - val_loss: 0.4843 - val_accuracy: 0.8346 Epoch 9/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4684 - accuracy: 0.8361 - val_loss: 0.4714 - val_accuracy: 0.8426 Epoch 10/10 250/250 [==============================] - 1s 2ms/step - loss: 0.4575 - accuracy: 0.8401 - val_loss: 0.4651 - val_accuracy: 0.8416 625/625 [==============================] - 1s 2ms/step - loss: 0.4634 - accuracy: 0.8356 Epoch 1/10 250/250 [==============================] - 1s 4ms/step - loss: 1.1680 - accuracy: 0.6783 - val_loss: 0.7918 - val_accuracy: 0.7455 Epoch 2/10 250/250 [==============================] - 1s 3ms/step - loss: 0.7107 - accuracy: 0.7659 - val_loss: 0.6492 - val_accuracy: 0.7785 Epoch 3/10 250/250 [==============================] - 1s 3ms/step - loss: 0.6153 - accuracy: 0.7908 - val_loss: 0.5892 - val_accuracy: 0.7949 Epoch 4/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5649 - accuracy: 0.8065 - val_loss: 0.5593 - val_accuracy: 0.8024 Epoch 5/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5318 - accuracy: 0.8155 - val_loss: 0.5272 - val_accuracy: 0.8115 Epoch 6/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5088 - accuracy: 0.8233 - val_loss: 0.5103 - val_accuracy: 0.8198 Epoch 7/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4914 - accuracy: 0.8303 - val_loss: 0.4932 - val_accuracy: 0.8235 Epoch 8/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4774 - accuracy: 0.8351 - val_loss: 0.4852 - val_accuracy: 0.8255 Epoch 9/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4667 - accuracy: 0.8382 - val_loss: 0.4723 - val_accuracy: 0.8303 Epoch 10/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4569 - accuracy: 0.8424 - val_loss: 0.4768 - val_accuracy: 0.8291 625/625 [==============================] - 1s 2ms/step - loss: 0.4718 - accuracy: 0.8321 Epoch 1/10 250/250 [==============================] - 1s 3ms/step - loss: 1.1842 - accuracy: 0.6705 - val_loss: 0.7970 - val_accuracy: 0.7524 Epoch 2/10 250/250 [==============================] - 1s 3ms/step - loss: 0.7122 - accuracy: 0.7624 - val_loss: 0.6540 - val_accuracy: 0.7651 Epoch 3/10 250/250 [==============================] - 1s 4ms/step - loss: 0.6157 - accuracy: 0.7878 - val_loss: 0.5891 - val_accuracy: 0.7920 Epoch 4/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5644 - accuracy: 0.8049 - val_loss: 0.5506 - val_accuracy: 0.8089 Epoch 5/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5316 - accuracy: 0.8152 - val_loss: 0.5308 - val_accuracy: 0.8114 Epoch 6/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5084 - accuracy: 0.8217 - val_loss: 0.5164 - val_accuracy: 0.8126 Epoch 7/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4918 - accuracy: 0.8263 - val_loss: 0.4972 - val_accuracy: 0.8240 Epoch 8/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4783 - accuracy: 0.8319 - val_loss: 0.4865 - val_accuracy: 0.8255 Epoch 9/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4679 - accuracy: 0.8334 - val_loss: 0.4795 - val_accuracy: 0.8288 Epoch 10/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4588 - accuracy: 0.8381 - val_loss: 0.4703 - val_accuracy: 0.8279 625/625 [==============================] - 1s 2ms/step - loss: 0.4640 - accuracy: 0.8407 Epoch 1/10 250/250 [==============================] - 1s 4ms/step - loss: 1.1852 - accuracy: 0.6685 - val_loss: 0.8032 - val_accuracy: 0.7570 Epoch 2/10 250/250 [==============================] - 1s 3ms/step - loss: 0.7160 - accuracy: 0.7635 - val_loss: 0.6539 - val_accuracy: 0.7735 Epoch 3/10 250/250 [==============================] - 1s 3ms/step - loss: 0.6162 - accuracy: 0.7892 - val_loss: 0.5877 - val_accuracy: 0.8026 Epoch 4/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5638 - accuracy: 0.8062 - val_loss: 0.5477 - val_accuracy: 0.8140 Epoch 5/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5307 - accuracy: 0.8163 - val_loss: 0.5232 - val_accuracy: 0.8217 Epoch 6/10 250/250 [==============================] - 1s 3ms/step - loss: 0.5078 - accuracy: 0.8238 - val_loss: 0.5097 - val_accuracy: 0.8256 Epoch 7/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4898 - accuracy: 0.8287 - val_loss: 0.4900 - val_accuracy: 0.8361 Epoch 8/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4760 - accuracy: 0.8339 - val_loss: 0.4826 - val_accuracy: 0.8359 Epoch 9/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4658 - accuracy: 0.8357 - val_loss: 0.4718 - val_accuracy: 0.8420 Epoch 10/10 250/250 [==============================] - 1s 3ms/step - loss: 0.4558 - accuracy: 0.8391 - val_loss: 0.4644 - val_accuracy: 0.8386 625/625 [==============================] - 1s 2ms/step - loss: 0.4606 - accuracy: 0.8367 Epoch 1/10 375/375 [==============================] - 1s 3ms/step - loss: 1.1185 - accuracy: 0.6924 - val_loss: 0.7431 - val_accuracy: 0.7614 Epoch 2/10 375/375 [==============================] - 1s 3ms/step - loss: 0.6678 - accuracy: 0.7781 - val_loss: 0.6055 - val_accuracy: 0.7944 Epoch 3/10 375/375 [==============================] - 1s 2ms/step - loss: 0.5734 - accuracy: 0.8055 - val_loss: 0.5439 - val_accuracy: 0.8136 Epoch 4/10 375/375 [==============================] - 1s 2ms/step - loss: 0.5257 - accuracy: 0.8198 - val_loss: 0.5090 - val_accuracy: 0.8209 Epoch 5/10 375/375 [==============================] - 1s 3ms/step - loss: 0.4959 - accuracy: 0.8277 - val_loss: 0.4904 - val_accuracy: 0.8272 Epoch 6/10 375/375 [==============================] - 1s 3ms/step - loss: 0.4756 - accuracy: 0.8337 - val_loss: 0.4680 - val_accuracy: 0.8341 Epoch 7/10 375/375 [==============================] - 1s 2ms/step - loss: 0.4595 - accuracy: 0.8386 - val_loss: 0.4571 - val_accuracy: 0.8360 Epoch 8/10 375/375 [==============================] - 1s 2ms/step - loss: 0.4472 - accuracy: 0.8435 - val_loss: 0.4475 - val_accuracy: 0.8418 Epoch 9/10 375/375 [==============================] - 1s 2ms/step - loss: 0.4366 - accuracy: 0.8471 - val_loss: 0.4382 - val_accuracy: 0.8425 Epoch 10/10 375/375 [==============================] - 1s 2ms/step - loss: 0.4282 - accuracy: 0.8500 - val_loss: 0.4335 - val_accuracy: 0.8457
Out[82]:
GridSearchCV(cv=3, estimator=<tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x0000018F14B40760>, param_grid={'n_neurons': [50, 100]})
In [84]:
grid_search.best_score_
Out[84]:
0.8366499940554301
In [85]:
grid_search.best_params_
Out[85]:
{'n_neurons': 50}
In [ ]: