75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
|
|
import tensorflow as tf
|
||
|
|
from tensorflow.keras import layers, models
|
||
|
|
import numpy as np
|
||
|
|
import time
|
||
|
|
|
||
|
|
batch_size=64
|
||
|
|
nbr_entrainement=5
|
||
|
|
|
||
|
|
(x_train, y_train), (x_test, y_test)=tf.keras.datasets.mnist.load_data()
|
||
|
|
x_train=(x_train.reshape(-1, 28, 28, 1)/255).astype(np.float32)
|
||
|
|
x_test=(x_test.reshape(-1, 28, 28, 1)/255).astype(np.float32)
|
||
|
|
|
||
|
|
train_ds=tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(batch_size)
|
||
|
|
test_ds=tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(batch_size)
|
||
|
|
|
||
|
|
model = models.Sequential([
|
||
|
|
layers.Conv2D(64, 3, strides=2, activation='relu'),
|
||
|
|
layers.BatchNormalization(),
|
||
|
|
layers.Conv2D(128, 3, strides=2, activation='relu'),
|
||
|
|
layers.BatchNormalization(),
|
||
|
|
layers.Flatten(),
|
||
|
|
layers.Dense(512, activation='relu'),
|
||
|
|
layers.BatchNormalization(),
|
||
|
|
layers.Dense(10, activation='softmax')
|
||
|
|
])
|
||
|
|
|
||
|
|
optimizer=tf.keras.optimizers.Adam()
|
||
|
|
loss_object=tf.keras.losses.SparseCategoricalCrossentropy()
|
||
|
|
train_loss=tf.keras.metrics.Mean()
|
||
|
|
train_accuracy=tf.keras.metrics.SparseCategoricalAccuracy()
|
||
|
|
test_loss=tf.keras.metrics.Mean()
|
||
|
|
test_accuracy=tf.keras.metrics.SparseCategoricalAccuracy()
|
||
|
|
|
||
|
|
@tf.function
|
||
|
|
def train_step(images, labels):
|
||
|
|
with tf.GradientTape() as tape:
|
||
|
|
predictions=model(images)
|
||
|
|
loss=loss_object(labels, predictions)
|
||
|
|
gradients=tape.gradient(loss, model.trainable_variables)
|
||
|
|
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
|
||
|
|
train_loss(loss)
|
||
|
|
train_accuracy(labels, predictions)
|
||
|
|
|
||
|
|
def train(train_ds, nbr_entrainement):
|
||
|
|
for entrainement in range(nbr_entrainement):
|
||
|
|
start=time.time()
|
||
|
|
for images, labels in train_ds:
|
||
|
|
train_step(images, labels)
|
||
|
|
message='Entrainement {:04d}, loss: {:6.4f}, accuracy: {:7.4f}%, temps: {:7.4f}'
|
||
|
|
print(message.format(entrainement+1,
|
||
|
|
train_loss.result(),
|
||
|
|
train_accuracy.result()*100,
|
||
|
|
time.time()-start))
|
||
|
|
train_loss.reset_states()
|
||
|
|
train_accuracy.reset_states()
|
||
|
|
|
||
|
|
def test(test_ds):
|
||
|
|
start=time.time()
|
||
|
|
for test_images, test_labels in test_ds:
|
||
|
|
predictions=model(test_images)
|
||
|
|
t_loss=loss_object(test_labels, predictions)
|
||
|
|
test_loss(t_loss)
|
||
|
|
test_accuracy(test_labels, predictions)
|
||
|
|
message='Loss: {:6.4f}, accuracy: {:7.4f}%, temps: {:7.4f}'
|
||
|
|
print(message.format(test_loss.result(),
|
||
|
|
test_accuracy.result()*100,
|
||
|
|
time.time()-start))
|
||
|
|
|
||
|
|
print("Entrainement")
|
||
|
|
train(train_ds, nbr_entrainement)
|
||
|
|
|
||
|
|
print("Jeu de test")
|
||
|
|
test(test_ds)
|
||
|
|
|