Pengoptimal Addons TensorFlow: LazyAdam

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Gambaran

Notebook ini akan menunjukkan cara menggunakan pengoptimal adam malas dari paket Addons.

malasAdam

LazyAdam adalah varian dari pengoptimal Adam yang menangani pembaruan jarang dengan lebih efisien. Algoritme Adam asli mempertahankan dua akumulator rata-rata bergerak untuk setiap variabel yang dapat dilatih; akumulator diperbarui di setiap langkah. Kelas ini menyediakan penanganan pembaruan gradien yang lebih lambat untuk variabel yang jarang. Ini hanya memperbarui akumulator rata-rata bergerak untuk indeks variabel jarang yang muncul dalam kumpulan saat ini, daripada memperbarui akumulator untuk semua indeks. Dibandingkan dengan pengoptimal Adam asli, ini dapat memberikan peningkatan besar dalam throughput pelatihan model untuk beberapa aplikasi. Namun, ini memberikan semantik yang sedikit berbeda dari algoritma Adam asli, dan dapat menyebabkan hasil empiris yang berbeda.

Mempersiapkan

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

Bangun Modelnya

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

Siapkan Datanya

# 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

Latih dan Evaluasi

Cukup ganti pengoptimal keras biasa dengan pengoptimal tfa baru

# 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