首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么阿德罗塔优化器没有降低学习率?

为什么阿德罗塔优化器没有降低学习率?
EN

Stack Overflow用户
提问于 2020-05-07 12:07:07
回答 1查看 426关注 0票数 0

我在Keras (使用Tensorflow后端)中初始化了一个Adadelta优化器,并将其分配给一个模型:

代码语言:javascript
复制
my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, rho=0.95)
my_model.compile(optimizer=my_adadelta, loss="binary_crossentropy")

在训练期间,我使用回调来打印每个时代之后的学习速度:

代码语言:javascript
复制
class LRPrintCallback(Callback):
    def on_epoch_end(self, epoch, logs=None):
        lr = self.model.optimizer.lr
        print(K.eval(lr))

然而,在每个时代之后,这都会打印出相同的(初始)学习速率。如果我像这样初始化优化器,也会发生同样的情况:

代码语言:javascript
复制
my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, decay=0.95)

我在初始化过程中做错什么了吗?学习速度可能会改变,但我没有打印正确的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 12:27:43

正如相关的Github螺纹中所讨论的,衰变不会影响变量lr本身,它只用于存储学习速率的初始值。为了打印衰变值,您需要自己显式地计算它,并将它存储在一个单独的变量lr_with_decay中;您可以使用以下回调来这样做:

代码语言:javascript
复制
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))

正如这里这里所解释的。实际上,这里建议的特定代码片段,即

代码语言:javascript
复制
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。阿德罗塔衰减因子,对应的梯度分数在每一时间步长保持不变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61657393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档