مشاهده در 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