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