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