מיטובי התוספות של TensorFlow: LazyAdam

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-GitHub הורד מחברת

סקירה כללית

מחברת זו תדגים כיצד להשתמש ב-Lazy adam Optimizer מחבילת 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