TensorFlow 애드온 옵티마이저: LazyAdam

TensorFlow.org에서 보기 Google Colab에서 실행하기 GitHub에서 소스 보기 노트북 다운로드하기

개요

이 노트북은 애드온 패키지에서 게으른 adam 옵티마이저를 사용하는 방법을 보여줍니다.

LazyAdam

LazyAdam은 희소 업데이트를 보다 효율적으로 처리하는 Adam 옵티마이저의 변형입니다. 원래 Adam 알고리즘은 각 훈련 가능한 변수에 대해 두 개의 이동 평균 누산기(moving-average accumulator)를 유지합니다. 누산기는 모든 단계에서 업데이트됩니다. 이 클래스는 희소 변수에 대한 그래디언트 업데이트의 지연 처리를 제공합니다. 모든 인덱스에 대한 누산기를 업데이트하지 않고 현재 배치에 나타나는 희소 변수 인덱스에 대한 이동 평균 누산기만 업데이트합니다. 원래 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 [==============================] - 2s 2ms/step - loss: 0.3173 - accuracy: 0.9084
Epoch 2/10
938/938 [==============================] - 2s 2ms/step - loss: 0.1410 - accuracy: 0.9577
Epoch 3/10
938/938 [==============================] - 2s 2ms/step - loss: 0.1009 - accuracy: 0.9696
Epoch 4/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0814 - accuracy: 0.9750
Epoch 5/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0663 - accuracy: 0.9790
Epoch 6/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0539 - accuracy: 0.9828
Epoch 7/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0467 - accuracy: 0.9851
Epoch 8/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0402 - accuracy: 0.9873
Epoch 9/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0348 - accuracy: 0.9883
Epoch 10/10
938/938 [==============================] - 2s 2ms/step - loss: 0.0297 - accuracy: 0.9903
# 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.0851 - accuracy: 0.9754
Test loss = 0.08514752238988876, Test acc: 0.9753999710083008