Ver no TensorFlow.org | Executar no Google Colab | Ver fonte no GitHub | Baixar caderno |
Visão geral
Este bloco de notas demonstrará como usar o otimizador adam preguiçoso do pacote de complementos.
LazyAdam
LazyAdam é uma variante do otimizador Adam que lida com atualizações esparsas com mais eficiência. O algoritmo de Adam original mantém dois acumuladores de média móvel para cada variável treinável; os acumuladores são atualizados a cada etapa. Esta classe fornece tratamento mais lento de atualizações de gradiente para variáveis esparsas. Ele apenas atualiza acumuladores de média móvel para índices de variáveis esparsas que aparecem no lote atual, em vez de atualizar os acumuladores de todos os índices. Comparado com o otimizador Adam original, ele pode fornecer grandes melhorias no rendimento do treinamento do modelo para alguns aplicativos. No entanto, ele fornece uma semântica ligeiramente diferente do algoritmo de Adam original e pode levar a resultados empíricos diferentes.
Configurar
pip install -q -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa
# Hyperparameters
batch_size=64
epochs=10
Construir o 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 os dados
# 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
Treinar e avaliar
Basta substituir os otimizadores keras típicos pelo novo otimizador 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