【发布时间】:2021-08-25 09:48:30
【问题描述】:
我想在一个时期内提高批次之间的学习率,因此网络在一个时期内看到的第一个数据具有低学习率,而它看到的最后一个数据具有高学习率。如何在tf.keras 中执行此操作?
【问题讨论】:
标签: tensorflow neural-network tf.keras
我想在一个时期内提高批次之间的学习率,因此网络在一个时期内看到的第一个数据具有低学习率,而它看到的最后一个数据具有高学习率。如何在tf.keras 中执行此操作?
【问题讨论】:
标签: tensorflow neural-network tf.keras
要在每个 epoch 之后修改学习率,您可以使用 tf.keras.callbacks.LearningRateScheduler,如文档 here 中所述。
但在我们的例子中,我们需要在每批传递给模型后修改学习率。我们将为此使用tf.keras.optimizers.schedules.LearningRateSchedule。这将在每一步或梯度更新后修改学习率。
假设我的训练数据集中有 100 个样本,批量大小为 5。步数将是 100 / 5 = 20 步。重新定义语句,在单个 epoch 中,20 个批次将传递给模型,梯度更新也将发生 20 次(在单个 epoch 中)。
使用docs中给出的代码,
batch_size = 5
num_train_samples = 100
class MyLRSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):
def __init__(self, initial_learning_rate):
self.initial_learning_rate = initial_learning_rate
def __call__(self, step):
return self.initial_learning_rate / (step + 1)
optimizer = tf.keras.optimizers.SGD(learning_rate=MyLRSchedule(0.1))
考虑到我们的示例,step 的值将在第一个 epoch 中从 0 变为 19。对于第二个 epoch,它将从 20 变为 39。对于您的用例,我们可以修改上述内容,
batch_size = 5
num_train_samples = 100
num_steps = num_train_samples / batch_size
class MyLRSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):
def __init__(self, initial_learning_rate):
self.initial_learning_rate = initial_learning_rate
def __call__(self, step):
step_in_epoch = step - (( step // num_steps ) * num_steps )
# Update LR according to step_in_epoch
optimizer = tf.keras.optimizers.SGD(learning_rate=MyLRSchedule(0.1))
step_in_epoch 的值将在第一个 epoch 时从 0 变为 19。对于第二个 epoch,它将再次从 0 变为 19,对于所有 epoch 也是如此。相应地更新 LR。
确保
num_train_samples可以完全被批量大小整除。这将简化否的计算。步骤。
【讨论】:
fit 方法时是否有效?还是我应该使用回调函数?