我在Keras (使用Tensorflow后端)中初始化了一个Adadelta优化器,并将其分配给一个模型:
my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, rho=0.95)
my_model.compile(optimizer=my_adadelta, loss="binary_crossentropy")在训练期间,我使用回调来打印每个时代之后的学习速度:
class LRPrintCallback(Callback):
def on_epoch_end(self, epoch, logs=None):
lr = self.model.optimizer.lr
print(K.eval(lr))然而,在每个时代之后,这都会打印出相同的(初始)学习速率。如果我像这样初始化优化器,也会发生同样的情况:
my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, decay=0.95)我在初始化过程中做错什么了吗?学习速度可能会改变,但我没有打印正确的东西?
发布于 2020-05-07 12:27:43
正如相关的Github螺纹中所讨论的,衰变不会影响变量lr本身,它只用于存储学习速率的初始值。为了打印衰变值,您需要自己显式地计算它,并将它存储在一个单独的变量lr_with_decay中;您可以使用以下回调来这样做:
class MyCallback(Callback):
def on_epoch_end(self, epoch, logs=None):
lr = self.model.optimizer.lr
decay = self.model.optimizer.decay
iterations = self.model.optimizer.iterations
lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay)))
print(K.eval(lr_with_decay))lr = self.lr
if self.initial_decay > 0:
lr *= (1. / (1. + self.decay * K.cast(self.iterations, K.dtype(self.decay))))直接来自底层的Keras 阿德罗塔的源代码。
从对链接源代码的检查中可以清楚地看出,这里对于降低学习速率感兴趣的参数是decay,而不是rho;尽管术语“衰变”也用于在文档中描述rho,但它是一种与学习速率无关的不同的衰减:
rho:浮动>= 0。阿德罗塔衰减因子,对应的梯度分数在每一时间步长保持不变。
https://stackoverflow.com/questions/61657393
复制相似问题