Prepare Dataset
1 2 3
| from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
|
1 2 3 4 5 6 7
| from sklearn.model_selection import train_test_split
train_scaled = train_input / 255.0 train_scaled = train_scaled.reshape(-1, 28*28)
train_scaled, val_scaled, train_target, val_target = train_test_split( train_scaled, train_target, test_size=0.2, random_state=42)
|
DNN Layer
1 2 3 4 5
| dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
|
1 2
| model = keras.Sequential([dense1, dense2]) model.summary()
|
Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_9 (Dense) (None, 100) 78500
dense_10 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
Another way to add layers
1 2 3 4 5 6
| model = keras.Sequential([ keras.layers.Dense(12, activation='sigmoid', input_shape=(16,), name='hidden'), keras.layers.Dense(10, activation='softmax', name='hidden_2'), keras.layers.Dense(1, activation='softmax', name='output') ], name='fashion MNIST') model.summary()
|
Model: "fashion MNIST"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
hidden (Dense) (None, 12) 204
hidden_2 (Dense) (None, 10) 130
output (Dense) (None, 1) 11
=================================================================
Total params: 345
Trainable params: 345
Non-trainable params: 0
_________________________________________________________________
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))) model.add(keras.layers.Dense(10, activation='softmax')) model.summary()
|
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_11 (Dense) (None, 100) 78500
dense_12 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
1 2
| model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.5627 - accuracy: 0.8077
Epoch 2/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4080 - accuracy: 0.8529
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3740 - accuracy: 0.8660
Epoch 4/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3508 - accuracy: 0.8720
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3345 - accuracy: 0.8810
<keras.callbacks.History at 0x7fcf5e9c8810>
Relu function
1 2 3 4 5
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax')) model.summary()
|
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_2 (Flatten) (None, 784) 0
dense_16 (Dense) (None, 100) 78500
dense_17 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_2 (Flatten) (None, 784) 0
dense_16 (Dense) (None, 100) 78500
dense_17 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
1 2 3 4 5 6
| (train_input, train_target), (test_input, test_target) =\ keras.datasets.fashion_mnist.load_data() train_scaled = train_input / 255.0 train_scaled, val_scaled, train_target, val_traget = train_test_split( train_scaled, train_target, test_size=0.2, random_state=42 )
|
1 2
| model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.5362 - accuracy: 0.8096
Epoch 2/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3953 - accuracy: 0.8578
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3570 - accuracy: 0.8722
Epoch 4/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.3360 - accuracy: 0.8808
Epoch 5/5
1500/1500 [==============================] - 6s 4ms/step - loss: 0.3200 - accuracy: 0.8871
<keras.callbacks.History at 0x7fcf5e813250>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 2ms/step - loss: 0.3565 - accuracy: 0.8775
[0.35651248693466187, 0.8774999976158142]
Optimizer
- a variety of gradient descent algorithms provided by Keras
- Optimizer have to consider both step direction and width
- direction : GD, SGD, Momentum, NAG
- width : GD, SGD, Adagrad, RMSProp
- direction & width : Adam (generally, the best performance)
SGD
Learning rate: default 0.01
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))
|
1 2 3
| model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.8096 - accuracy: 0.7362
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.5421 - accuracy: 0.8163
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4886 - accuracy: 0.8329
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4604 - accuracy: 0.8426
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4404 - accuracy: 0.8490
<keras.callbacks.History at 0x7fcf5e524250>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 1ms/step - loss: 0.4474 - accuracy: 0.8464
[0.44738978147506714, 0.8464166522026062]
Learning rate: 0.1
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))
|
1 2 3 4
| sgd = keras.optimizers.SGD(learning_rate=0.1) model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.5663 - accuracy: 0.7985
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4148 - accuracy: 0.8493
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3765 - accuracy: 0.8620
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3503 - accuracy: 0.8707
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3315 - accuracy: 0.8777
<keras.callbacks.History at 0x7fcf5e614e90>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 2ms/step - loss: 0.3469 - accuracy: 0.8744
[0.3468727171421051, 0.8744166493415833]
Nesterov momentum
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))
|
1 2 3 4
| sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True) model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.5365 - accuracy: 0.8099
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4051 - accuracy: 0.8562
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3659 - accuracy: 0.8690
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3448 - accuracy: 0.8737
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3255 - accuracy: 0.8802
<keras.callbacks.History at 0x7fcf5e1de1d0>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 2ms/step - loss: 0.3611 - accuracy: 0.8718
[0.36112430691719055, 0.871833324432373]
Adagrad
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))
|
1 2 3 4
| adagrad = keras.optimizers.Adagrad() model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 4s 2ms/step - loss: 1.1751 - accuracy: 0.6441
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.7733 - accuracy: 0.7556
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.6848 - accuracy: 0.7837
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.6372 - accuracy: 0.7972
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.6071 - accuracy: 0.8053
<keras.callbacks.History at 0x7fcf5e480390>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 1ms/step - loss: 0.6081 - accuracy: 0.8025
[0.6081421375274658, 0.8025000095367432]
RMSprop
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))
|
1 2 3 4
| rmsprop = keras.optimizers.RMSprop() model.compile(optimizer=rmsprop, loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.5261 - accuracy: 0.8139
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3931 - accuracy: 0.8598
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3556 - accuracy: 0.8733
Epoch 4/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3349 - accuracy: 0.8806
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3173 - accuracy: 0.8869
<keras.callbacks.History at 0x7fcf5e374710>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 2ms/step - loss: 0.3817 - accuracy: 0.8742
[0.3816753029823303, 0.8741666674613953]
Adam
1 2 3 4
| model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))
|
1 2 3
| model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy') model.fit(train_scaled, train_target, epochs=5)
|
Epoch 1/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.5273 - accuracy: 0.8153
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3943 - accuracy: 0.8584
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3522 - accuracy: 0.8727
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3264 - accuracy: 0.8815
Epoch 5/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.3074 - accuracy: 0.8882
<keras.callbacks.History at 0x7fcf5e47b050>
1
| model.evaluate(val_scaled, val_target)
|
375/375 [==============================] - 1s 2ms/step - loss: 0.3356 - accuracy: 0.8788
[0.33555400371551514, 0.8788333535194397]
Ref.) 혼자 공부하는 머신러닝+딥러닝 (박해선, 한빛미디어)