TensorFlow Addons Optimizer: LazyAdam

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

این نوت بوک نحوه استفاده از بهینه ساز lazy adam را از بسته 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