Playground / LeNet¶
Here we use LeNet as an example to show how to train a model in TensorFlow.
In [1]:
Copied!
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from keras import layers, models
from keras.datasets import mnist
from keras.utils import to_categorical
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from keras import layers, models
from keras.datasets import mnist
from keras.utils import to_categorical
In [2]:
Copied!
print(tf.config.experimental.list_physical_devices('GPU'))
print(tf.config.experimental.list_physical_devices('GPU'))
[]
In [3]:
Copied!
(train_imgs, train_labels), (test_imgs, test_labels) = mnist.load_data()
print(train_imgs.shape) # (60000, 28, 28)
(train_imgs, train_labels), (test_imgs, test_labels) = mnist.load_data()
print(train_imgs.shape) # (60000, 28, 28)
(60000, 28, 28)
In [4]:
Copied!
models = models.Sequential(
[
layers.Conv2D(
filters=6,
kernel_size=5,
activation="sigmoid",
padding="same",
),
layers.AvgPool2D(pool_size=2, strides=2),
layers.Conv2D(
filters=16,
kernel_size=5,
activation="sigmoid",
padding="valid",
),
layers.AvgPool2D(pool_size=2, strides=2),
layers.Flatten(),
layers.Dense(120, activation="sigmoid"),
layers.Dense(84, activation="sigmoid"),
layers.Dense(10, activation="softmax"),
]
)
models = models.Sequential(
[
layers.Conv2D(
filters=6,
kernel_size=5,
activation="sigmoid",
padding="same",
),
layers.AvgPool2D(pool_size=2, strides=2),
layers.Conv2D(
filters=16,
kernel_size=5,
activation="sigmoid",
padding="valid",
),
layers.AvgPool2D(pool_size=2, strides=2),
layers.Flatten(),
layers.Dense(120, activation="sigmoid"),
layers.Dense(84, activation="sigmoid"),
layers.Dense(10, activation="softmax"),
]
)
In [5]:
Copied!
X = tf.random.uniform((1, 28, 28, 1))
for layer in models.layers:
X = layer(X)
print(layer.__class__.__name__, "output shape:\t", X.shape)
X = tf.random.uniform((1, 28, 28, 1))
for layer in models.layers:
X = layer(X)
print(layer.__class__.__name__, "output shape:\t", X.shape)
Conv2D output shape: (1, 28, 28, 6) AveragePooling2D output shape: (1, 14, 14, 6) Conv2D output shape: (1, 10, 10, 16) AveragePooling2D output shape: (1, 5, 5, 16) Flatten output shape: (1, 400) Dense output shape: (1, 120) Dense output shape: (1, 84) Dense output shape: (1, 10)
In [6]:
Copied!
# training:
train_imgs = train_imgs.reshape((60000, 28, 28, 1))
train_imgs = train_imgs.astype("float32") / 255
test_imgs = test_imgs.reshape((10000, 28, 28, 1))
test_imgs = test_imgs.astype("float32") / 255
train_labels_ = to_categorical(train_labels)
test_labels_ = to_categorical(test_labels)
models.compile(
optimizer="adam",
loss="categorical_crossentropy",
metrics=["accuracy"],
)
history = models.fit(
train_imgs,
train_labels_,
epochs=20,
batch_size=128,
validation_data=(test_imgs, test_labels_),
)
# training:
train_imgs = train_imgs.reshape((60000, 28, 28, 1))
train_imgs = train_imgs.astype("float32") / 255
test_imgs = test_imgs.reshape((10000, 28, 28, 1))
test_imgs = test_imgs.astype("float32") / 255
train_labels_ = to_categorical(train_labels)
test_labels_ = to_categorical(test_labels)
models.compile(
optimizer="adam",
loss="categorical_crossentropy",
metrics=["accuracy"],
)
history = models.fit(
train_imgs,
train_labels_,
epochs=20,
batch_size=128,
validation_data=(test_imgs, test_labels_),
)
Epoch 1/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 15ms/step - accuracy: 0.2700 - loss: 2.0008 - val_accuracy: 0.8641 - val_loss: 0.5076 Epoch 2/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 14ms/step - accuracy: 0.8787 - loss: 0.4315 - val_accuracy: 0.9188 - val_loss: 0.2758 Epoch 3/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 6s 14ms/step - accuracy: 0.9210 - loss: 0.2627 - val_accuracy: 0.9407 - val_loss: 0.1938 Epoch 4/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 14ms/step - accuracy: 0.9413 - loss: 0.1927 - val_accuracy: 0.9482 - val_loss: 0.1610 Epoch 5/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 14ms/step - accuracy: 0.9536 - loss: 0.1529 - val_accuracy: 0.9630 - val_loss: 0.1234 Epoch 6/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 14ms/step - accuracy: 0.9609 - loss: 0.1269 - val_accuracy: 0.9646 - val_loss: 0.1162 Epoch 7/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 14ms/step - accuracy: 0.9660 - loss: 0.1097 - val_accuracy: 0.9738 - val_loss: 0.0890 Epoch 8/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - accuracy: 0.9703 - loss: 0.0950 - val_accuracy: 0.9763 - val_loss: 0.0778 Epoch 9/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.9742 - loss: 0.0829 - val_accuracy: 0.9780 - val_loss: 0.0726 Epoch 10/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 17ms/step - accuracy: 0.9765 - loss: 0.0762 - val_accuracy: 0.9782 - val_loss: 0.0693 Epoch 11/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.9806 - loss: 0.0655 - val_accuracy: 0.9823 - val_loss: 0.0571 Epoch 12/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 17ms/step - accuracy: 0.9814 - loss: 0.0601 - val_accuracy: 0.9817 - val_loss: 0.0599 Epoch 13/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - accuracy: 0.9835 - loss: 0.0544 - val_accuracy: 0.9840 - val_loss: 0.0507 Epoch 14/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 16ms/step - accuracy: 0.9840 - loss: 0.0515 - val_accuracy: 0.9819 - val_loss: 0.0555 Epoch 15/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 17ms/step - accuracy: 0.9848 - loss: 0.0477 - val_accuracy: 0.9829 - val_loss: 0.0529 Epoch 16/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 17ms/step - accuracy: 0.9861 - loss: 0.0445 - val_accuracy: 0.9843 - val_loss: 0.0479 Epoch 17/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - accuracy: 0.9865 - loss: 0.0424 - val_accuracy: 0.9842 - val_loss: 0.0477 Epoch 18/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - accuracy: 0.9877 - loss: 0.0398 - val_accuracy: 0.9860 - val_loss: 0.0419 Epoch 19/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - accuracy: 0.9885 - loss: 0.0384 - val_accuracy: 0.9847 - val_loss: 0.0442 Epoch 20/20 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - accuracy: 0.9896 - loss: 0.0354 - val_accuracy: 0.9852 - val_loss: 0.0441
In [8]:
Copied!
# plot:
plt.subplot(121)
plt.plot(history.history["accuracy"], label="accuracy")
plt.plot(history.history["val_accuracy"], label="val_accuracy")
plt.title("accuracy")
_ = plt.legend()
plt.subplot(122)
plt.plot(history.history["loss"], label="train_loss")
plt.plot(history.history["val_loss"], label="val_loss")
plt.title("loss")
_ = plt.legend()
# plot:
plt.subplot(121)
plt.plot(history.history["accuracy"], label="accuracy")
plt.plot(history.history["val_accuracy"], label="val_accuracy")
plt.title("accuracy")
_ = plt.legend()
plt.subplot(122)
plt.plot(history.history["loss"], label="train_loss")
plt.plot(history.history["val_loss"], label="val_loss")
plt.title("loss")
_ = plt.legend()
In [ ]:
Copied!