Оптимизаторы аддонов TensorFlow: LazyAdam

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

Обзор

Этот блокнот продемонстрирует, как использовать ленивый оптимизатор адама из пакета Addons.

Ленивый Адам

LazyAdam - это вариант оптимизатора Adam, который более эффективно обрабатывает разреженные обновления. Исходный алгоритм Адама поддерживает два аккумулятора скользящих средних для каждой обучаемой переменной; аккумуляторы обновляются на каждом этапе. Этот класс обеспечивает более ленивую обработку обновлений градиента для разреженных переменных. Он обновляет аккумуляторы скользящего среднего только для индексов разреженных переменных, которые появляются в текущем пакете, а не обновляет аккумуляторы для всех индексов. По сравнению с исходным оптимизатором Adam, он может значительно улучшить производительность обучения модели для некоторых приложений. Однако он обеспечивает немного другую семантику, чем исходный алгоритм Адама, и может привести к другим эмпирическим результатам.

Настраивать

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

Постройте модель

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

Подготовьте данные

# 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

Тренируй и оценивай

Просто замените типичные оптимизаторы keras на новый оптимизатор 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