Optimizadores de complementos de TensorFlow: LazyAdam

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

Visión general

Este cuaderno demostrará cómo utilizar el optimizador lazy adam del paquete de complementos.

LazyAdam

LazyAdam es una variante del optimizador de Adam que maneja las actualizaciones dispersas de manera más eficiente. El algoritmo de Adam original mantiene dos acumuladores de promedio móvil para cada variable entrenable; los acumuladores se actualizan en cada paso. Esta clase proporciona un manejo más lento de las actualizaciones de gradiente para variables dispersas. Solo actualiza los acumuladores de promedios móviles para los índices de variables dispersas que aparecen en el lote actual, en lugar de actualizar los acumuladores para todos los índices. En comparación con el optimizador Adam original, puede proporcionar grandes mejoras en el rendimiento del entrenamiento de modelos para algunas aplicaciones. Sin embargo, proporciona una semántica ligeramente diferente a la del algoritmo de Adam original y puede conducir a resultados empíricos diferentes.

Configuración

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

Construye el modelo

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'),
])

Prepare los datos

# 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

Capacitar y evaluar

Simplemente reemplace los optimizadores de keras típicos con el nuevo optimizador de 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