محسنات إضافات TensorFlow: LazyAdam

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

ملخص

سيوضح هذا الكمبيوتر الدفتري كيفية استخدام مُحسِّن adam الكسول من حزمة Addons.

LazyAdam

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