TensorFlow Eklenti Optimize Edicileri: LazyAdam

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

Bu not defteri, Eklentiler paketindeki tembel adam optimize edicinin nasıl kullanılacağını gösterecektir.

tembelAdam

LazyAdam, seyrek güncellemeleri daha verimli bir şekilde işleyen Adam optimize edicinin bir çeşididir. Orijinal Adam algoritması, her eğitilebilir değişken için iki hareketli ortalama akümülatörü tutar; akümülatörler her adımda güncellenir. Bu sınıf, seyrek değişkenler için degrade güncellemelerinin daha yavaş işlenmesini sağlar. Tüm endeksler için akümülatörleri güncellemek yerine, yalnızca geçerli toplu işte görünen seyrek değişken indeksler için hareketli ortalama akümülatörlerini günceller. Orijinal Adam optimizer ile karşılaştırıldığında, bazı uygulamalar için model eğitim çıktısında büyük iyileştirmeler sağlayabilir. Ancak, orijinal Adam algoritmasından biraz farklı anlambilim sağlar ve farklı deneysel sonuçlara yol açabilir.

Kurmak

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

Modeli Oluştur

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

Verileri Hazırlayın

# 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

Eğitin ve Değerlendirin

Tipik keras optimizerlerini yeni tfa optimizer ile değiştirin

# 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