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