Optimiseurs de modules complémentaires TensorFlow : LazyAdam

Voir sur TensorFlow.org Exécuter dans Google Colab Voir la source sur GitHub Télécharger le cahier

Aperçu

Ce cahier montrera comment utiliser l'optimiseur paresseux adam du package Addons.

LazyAdam

LazyAdam est une variante de l'optimiseur Adam qui gère plus efficacement les mises à jour éparses. L'algorithme Adam original maintient deux accumulateurs de moyenne mobile pour chaque variable pouvant être entraînée ; les accumulateurs sont mis à jour à chaque étape. Cette classe fournit une gestion plus lente des mises à jour de gradient pour les variables éparses. Il ne met à jour les accumulateurs de moyenne mobile que pour les indices de variables éparses qui apparaissent dans le lot actuel, plutôt que de mettre à jour les accumulateurs pour tous les indices. Par rapport à l'optimiseur Adam d'origine, il peut apporter de grandes améliorations au débit d'entraînement du modèle pour certaines applications. Cependant, il fournit une sémantique légèrement différente de celle de l'algorithme d'Adam original et peut conduire à des résultats empiriques différents.

Installer

pip install -q -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa
# Hyperparameters
batch_size=64
epochs=10

Construire le modèle

model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, input_shape=(784,), activation='relu', name='dense_1'),
    tf.keras.layers.Dense(64, activation='relu', name='dense_2'),
    tf.keras.layers.Dense(10, activation='softmax', name='predictions'),
])

Préparer les données

# Load MNIST dataset as NumPy arrays
dataset = {}
num_validation = 10000
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

# Preprocess the data
x_train = x_train.reshape(-1, 784).astype('float32') / 255
x_test = x_test.reshape(-1, 784).astype('float32') / 255

Former et évaluer

Remplacez simplement les optimiseurs keras typiques par le nouvel optimiseur tfa

# Compile the model
model.compile(
    optimizer=tfa.optimizers.LazyAdam(0.001),  # Utilize TFA optimizer
    loss=tf.keras.losses.SparseCategoricalCrossentropy(),
    metrics=['accuracy'])

# Train the network
history = model.fit(
    x_train,
    y_train,
    batch_size=batch_size,
    epochs=epochs)
Epoch 1/10
938/938 [==============================] - 3s 2ms/step - loss: 0.5700 - accuracy: 0.8378
Epoch 2/10
938/938 [==============================] - 2s 2ms/step - loss: 0.1523 - accuracy: 0.9552
Epoch 3/10
938/938 [==============================] - 2s 2ms/step - loss: 0.1040 - accuracy: 0.9694
Epoch 4/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0809 - accuracy: 0.9753
Epoch 5/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0614 - accuracy: 0.9812
Epoch 6/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0531 - accuracy: 0.9840
Epoch 7/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0481 - accuracy: 0.9850
Epoch 8/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0377 - accuracy: 0.9881
Epoch 9/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0336 - accuracy: 0.9892
Epoch 10/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0272 - accuracy: 0.9909
# Evaluate the network
print('Evaluate on test data:')
results = model.evaluate(x_test, y_test, batch_size=128, verbose = 2)
print('Test loss = {0}, Test acc: {1}'.format(results[0], results[1]))
Evaluate on test data:
79/79 - 0s - loss: 0.0959 - accuracy: 0.9738
Test loss = 0.09588281810283661, Test acc: 0.973800003528595