TensorFlow アドオンオプティマイザ:LazyAdam

TensorFlow.orgで表示 Google Colab で実行 GitHub でソースを表示{ ノートブックをダウンロード/a0}

概要

このガイドでは、アドオンパッケージの LazyAdam オプティマイザを使用する方法を紹介します。

LazyAdam

LazyAdam は、スパースな更新をより効率的に処理する Adam オプティマイザのバリアントです。従来の Adam アルゴリズムは、トレーニング可能な変数ごとに 2 つの移動平均アキュムレータを維持します。 アキュムレータはすべてのステップで更新されます。このクラスは、スパースな変数の勾配更新をレイジーに処理します。 その時点のバッチに表示されるスパースな変数インデックスの移動平均アキュムレータのみが更新され、すべてのインデックスのアキュムレータは更新されません。アプリケーションによっては、従来の 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.5839 - accuracy: 0.8326
Epoch 2/10
938/938 [==============================] - 2s 2ms/step - loss: 0.1508 - accuracy: 0.9564
Epoch 3/10
938/938 [==============================] - 2s 2ms/step - loss: 0.1053 - accuracy: 0.9686
Epoch 4/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0833 - accuracy: 0.9748
Epoch 5/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0655 - accuracy: 0.9798
Epoch 6/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0525 - accuracy: 0.9835
Epoch 7/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0455 - accuracy: 0.9853
Epoch 8/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0360 - accuracy: 0.9891
Epoch 9/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0339 - accuracy: 0.9892
Epoch 10/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0270 - accuracy: 0.9917
# 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.0875 - accuracy: 0.9773
Test loss = 0.08750879764556885, Test acc: 0.9772999882698059