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