我已经在Keras中初始化了Adadelta优化器(使用Tensorflow后端)并将其分配给模型:
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)
我在初始化时做错什么了吗?学习率可能会改变,但是我没有打印正确的东西吗?
答案 0 :(得分:1)
如相关Github thread中所讨论的,衰减不影响变量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))))
如here和here所述。实际上,此处显示了具体的代码段,即
decay
直接来自基础Keras source code for Adadelta。
从检查链接的源代码可以清楚地看出,此处用于降低学习率的感兴趣参数为rho
,而不是rho
;尽管documentation中也使用了“衰减”一词来描述df = pd.DataFrame({
'A': ['0','0','0','8.020833015','8.009259224','8.003472328','8.020833015','0','0','5','4.994213104','0','0','0','8.012152672','8.009259224','0'],
'Step_ID': ['Step_1','Step_1','Step_1','Step_2','Step_2','Step_2','Step_2','Step_3','Step_3','Step_4','Step_4','Step_5','Step_5','Step_5','Step_6','Step_6','Step_7']})
print (df)
,但这是与学习率无关的另一种衰减:
rho :浮点> =0。Adadelta衰减因子,对应于每个时间步长要保留的梯度分数。