TensorFlow Addons Optimizer: LazyAdam

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Tổng quat

Sổ tay này sẽ trình bày cách sử dụng trình tối ưu hóa lazy adam từ gói Addons.

LazyAdam

LazyAdam là một biến thể của trình tối ưu hóa Adam xử lý các bản cập nhật thưa thớt hiệu quả hơn. Thuật toán Adam ban đầu duy trì hai bộ tích lũy trung bình động cho mỗi biến có thể đào tạo; các bộ tích lũy được cập nhật ở mỗi bước. Lớp này cung cấp khả năng xử lý chậm hơn các cập nhật gradient cho các biến thưa thớt. Nó chỉ cập nhật bộ tích lũy trung bình động cho các chỉ số biến thưa thớt xuất hiện trong lô hiện tại, thay vì cập nhật bộ tích lũy cho tất cả các chỉ số. So với trình tối ưu hóa Adam ban đầu, nó có thể cung cấp những cải tiến lớn về thông lượng đào tạo mô hình cho một số ứng dụng. Tuy nhiên, nó cung cấp ngữ nghĩa hơi khác so với thuật toán Adam ban đầu và có thể dẫn đến các kết quả thực nghiệm khác nhau.

Cài đặt

pip install -q -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa
# Hyperparameters
batch_size=64
epochs=10

Xây dựng mô hình

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'),
])

Chuẩn bị dữ liệu

# 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

Đào tạo và đánh giá

Chỉ cần thay thế các trình tối ưu hóa keras điển hình bằng trình tối ưu hóa tfa mới

# 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