如何在TF2中学习的同时改变Adam优化器的学习率?有一些答案浮动,但适用于TF1,例如。使用feed_dict。
yvfmudvl1#
如果你使用自定义训练循环(而不是keras.fit()),你可以简单地做:
keras.fit()
new_learning_rate = 0.01 my_optimizer.lr.assign(new_learning_rate)
字符串
vshtjzan2#
您可以通过callback读取和分配学习率。所以你可以使用这样的东西:
class LearningRateReducerCb(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs={}): old_lr = self.model.optimizer.lr.read_value() new_lr = old_lr * 0.99 print("\nEpoch: {}. Reducing Learning Rate from {} to {}".format(epoch, old_lr, new_lr)) self.model.optimizer.lr.assign(new_lr)
字符串例如,使用MNIST demo可以这样应用:
mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, callbacks=[LearningRateReducerCb()], epochs=5) model.evaluate(x_test, y_test)
型输出如下:
Train on 60000 samples Epoch 1/5 59744/60000 [============================>.] - ETA: 0s - loss: 0.2969 - accuracy: 0.9151 Epoch: 0. Reducing Learning Rate from 0.0010000000474974513 to 0.0009900000877678394 60000/60000 [==============================] - 6s 92us/sample - loss: 0.2965 - accuracy: 0.9152 Epoch 2/5 59488/60000 [============================>.] - ETA: 0s - loss: 0.1421 - accuracy: 0.9585 Epoch: 1. Reducing Learning Rate from 0.0009900000877678394 to 0.000980100128799677 60000/60000 [==============================] - 5s 91us/sample - loss: 0.1420 - accuracy: 0.9586 Epoch 3/5 59968/60000 [============================>.] - ETA: 0s - loss: 0.1056 - accuracy: 0.9684 Epoch: 2. Reducing Learning Rate from 0.000980100128799677 to 0.0009702991228550673 60000/60000 [==============================] - 5s 91us/sample - loss: 0.1056 - accuracy: 0.9684 Epoch 4/5 59520/60000 [============================>.] - ETA: 0s - loss: 0.0856 - accuracy: 0.9734 Epoch: 3. Reducing Learning Rate from 0.0009702991228550673 to 0.0009605961386114359 60000/60000 [==============================] - 5s 89us/sample - loss: 0.0857 - accuracy: 0.9733 Epoch 5/5 59712/60000 [============================>.] - ETA: 0s - loss: 0.0734 - accuracy: 0.9772 Epoch: 4. Reducing Learning Rate from 0.0009605961386114359 to 0.0009509901865385473 60000/60000 [==============================] - 5s 87us/sample - loss: 0.0733 - accuracy: 0.9772 10000/10000 [==============================] - 0s 43us/sample - loss: 0.0768 - accuracy: 0.9762 [0.07680597708942369, 0.9762]
型
unhi4e5o3#
如果你想使用低级控制,而不是使用fit的回调功能,可以看看tf.optimizers.schedules。下面是一些示例代码:
fit
tf.optimizers.schedules
train_steps = 25000 lr_fn = tf.optimizers.schedules.PolynomialDecay(1e-3, train_steps, 1e-5, 2) opt = tf.optimizers.Adam(lr_fn)
字符串这将使学习速率在25000步上从1 e-3衰减到1 e-5,并具有2次幂多项式衰减。注意事项:
Optimizer
apply_gradients
tf.GradientTape
mrwjdhj34#
你有三个解决方案:
以下是本教程中的一个示例:
class CustomSchedule(tf.keras.optimizers.schedules.LearningRateSchedule): def __init__(self, d_model, warmup_steps=4000): super(CustomSchedule, self).__init__() self.d_model = d_model self.d_model = tf.cast(self.d_model, tf.float32) self.warmup_steps = warmup_steps def __call__(self, step): arg1 = tf.math.rsqrt(step) arg2 = step * (self.warmup_steps ** -1.5) return tf.math.rsqrt(self.d_model) * tf.math.minimum(arg1, arg2)
字符串然后将其传递给优化器:
learning_rate = CustomSchedule(d_model) optimizer = tf.keras.optimizers.Adam(learning_rate, beta_1=0.9, beta_2=0.98, epsilon=1e-9)
型这样,CustomSchedule将成为您的图表的一部分,它将在模型训练时更新学习率。
4条答案
按热度按时间yvfmudvl1#
如果你使用自定义训练循环(而不是
keras.fit()
),你可以简单地做:字符串
vshtjzan2#
您可以通过callback读取和分配学习率。所以你可以使用这样的东西:
字符串
例如,使用MNIST demo可以这样应用:
型
输出如下:
型
unhi4e5o3#
如果你想使用低级控制,而不是使用
fit
的回调功能,可以看看tf.optimizers.schedules
。下面是一些示例代码:字符串
这将使学习速率在25000步上从1 e-3衰减到1 e-5,并具有2次幂多项式衰减。
注意事项:
Optimizer
示例有一个内部的步进计数器,每次调用apply_gradients
时,它都会加一(据我所知...)。这使得该过程在低级上下文中(通常是tf.GradientTape
)使用时能够正常工作。mrwjdhj34#
你有三个解决方案:
以下是本教程中的一个示例:
字符串
然后将其传递给优化器:
型
这样,CustomSchedule将成为您的图表的一部分,它将在模型训练时更新学习率。