ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
ภาพรวม
โน้ตบุ๊กนี้จะสาธิตวิธีใช้เครื่องมือเพิ่มประสิทธิภาพ lazy adam จากแพ็คเกจ Addons
LazyAdam
LazyAdam เป็นอีกรูปแบบหนึ่งของเครื่องมือเพิ่มประสิทธิภาพ Adam ที่จัดการการอัปเดตแบบกระจัดกระจายอย่างมีประสิทธิภาพมากขึ้น อัลกอริธึม Adam ดั้งเดิมจะรักษาตัวสะสมค่าเฉลี่ยเคลื่อนที่สองตัวสำหรับตัวแปรที่ฝึกได้แต่ละตัว ตัวสะสมได้รับการปรับปรุงในทุกขั้นตอน คลาสนี้จัดเตรียมการอัพเดตเกรเดียนต์แบบเกียจคร้านสำหรับตัวแปรแบบกระจัดกระจาย โดยจะอัปเดตเฉพาะตัวสะสมค่าเฉลี่ยเคลื่อนที่สำหรับดัชนีตัวแปรแบบกระจายที่ปรากฏในแบทช์ปัจจุบัน แทนที่จะอัปเดตตัวสะสมสำหรับดัชนีทั้งหมด เมื่อเปรียบเทียบกับเครื่องมือเพิ่มประสิทธิภาพ 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