TensorFlow 中 AdamOptimizer 的学习率不会改变

2023-12-27

我想看看训练期间学习率如何变化(打印出来或创建摘要并在张量板上可视化)。

这是我迄今为止所掌握的代码片段:

optimizer = tf.train.AdamOptimizer(1e-3)
grads_and_vars = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

sess.run(tf.initialize_all_variables())

for i in range(0, 10000):
   sess.run(train_op)
   print sess.run(optimizer._lr_t)

如果我运行代码,我会不断获得初始学习率(1e-3),即我看不到任何变化。

获取每一步学习率的正确方法是什么?

我想补充一点这个问题 https://stackoverflow.com/questions/36990476/getting-the-current-learning-rate-from-a-tf-train-adamoptimizer真的和我的很相似。但是,我无法在评论部分发布我的发现,因为我没有足够的代表。


我问自己同样的问题,并想知道为什么它不会改变。通过查看原纸 https://arxiv.org/pdf/1412.6980v8.pdf(第 2 页),人们看到self._lr步长(设计为alpha论文中)是算法所需要的,但从未更新。我们还看到有一个alpha_t为每个更新t步骤,并且应该对应于self._lr_t属性。但事实上,正如你所观察到的,评估 的价值self._lr_t训练过程中任何时刻的张量始终返回初始值,即_lr.

所以,据我了解,你的问题是如何获得alpha_t对于 TensorFlow 的 AdamOptimizer,如本文第 2 节和相应的TF v1.2 API 页面 https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/train/AdamOptimizer:

alpha_t = alpha * sqrt(1-beta_2_t) / (1-beta_1_t)

背景

正如您所观察到的,_lr_t张量在训练过程中不会改变,这可能会导致优化器不适应的错误结论(这可以通过切换到vanilla GradientDescentOptimizer与相同的alpha)。事实上,其他值确实会发生变化:快速浏览一下优化器的__dict__显示以下键:['_epsilon_t', '_lr', '_beta1_t', '_lr_t', '_beta1', '_beta1_power', '_beta2', '_updated_lr', '_name', '_use_locking', '_beta2_t', '_beta2_power', '_epsilon', '_slots'].

通过训练检查他们,我注意到only _beta1_power, _beta2_power_slots得到更新.

进一步检查优化器的代码 https://github.com/tensorflow/tensorflow/blob/927f811b0303e51126531c135f8b093383de2d6d/tensorflow/python/training/adam.py#L211,在第 211 行,我们看到以下更新:

update_beta1 = self._beta1_power.assign(
        self._beta1_power * self._beta1_t,
        use_locking=self._use_locking)

这基本上意味着_beta1_power,即初始化为_beta1 https://github.com/tensorflow/tensorflow/blob/927f811b0303e51126531c135f8b093383de2d6d/tensorflow/python/training/adam.py#L120,将乘以_beta_1_t每次迭代之后,也初始化为beta_1_t https://github.com/tensorflow/tensorflow/blob/927f811b0303e51126531c135f8b093383de2d6d/tensorflow/python/training/adam.py#L133.

但令人困惑的部分来了:_beta1_t and _beta2_t永远不会更新,因此它们有效地保持初始值(_beta1and _beta2)在整个训练过程中,以类似的方式与论文的符号相矛盾_lr and lr_t do. 我想这是有原因的,但我个人不知道为什么,无论如何,这是实现的受保护/私有属性(因为它们以下划线开头)并且不属于公共接口(它们甚至可能会改变) TF 版本之间)。

所以在这个小背景之后我们可以看到_beta_1_power and _beta_2_power是原始 beta 值对当前训练步骤的幂,即相当于用beta_t在报纸上。回到定义alpha_t在本文的第 2 节中,我们看到,有了这些信息,实施起来应该非常简单:

SOLUTION

optimizer = tf.train.AdamOptimizer()
# rest of the graph...

# ... somewhere in your session
# note that a0 comes from a scalar, whereas bb1 and bb2 come from tensors and thus have to be evaluated
a0, bb1, bb2 = optimizer._lr, optimizer._beta1_power.eval(), optimizer._beta2_power.eval()
at = a0* (1-bb2)**0.5 /(1-bb1)
print(at)

变量at持有alpha_t对于当前的训练步骤。

免责声明

我找不到一种仅使用优化器界面来获取此值的更干净的方法,但请告诉我它是否存在!我想没有,这实际上让人质疑绘图的有用性alpha_t, since 它不依赖于数据.

此外,为了完善这些信息,本文的第 2 节还给出了权重更新的公式,该公式更能说明问题,但也更情节密集。对于一个非常漂亮且美观的实现,您可能需要看看这个很好的答案 https://stackoverflow.com/a/44688307/4511978从您链接的帖子中。

希望能帮助到你!干杯,
Andres

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow 中 AdamOptimizer 的学习率不会改变 的相关文章

随机推荐

  • django.core.exceptions.ImproperlyConfigured:加载 MySQLdb 模块时出错:

    我正在关注 django 教程 很多人都问过这个问题 但我认为我的情况有点独特 因为安装 python mysql 后 当我尝试执行 python manage pysyncdb 时 我仍然收到此错误 我在 virtualenv 中 因为我
  • 从数组中选取随机字符串

    我如何从数组中随机选择一个字符串 但不选择相同的字符串两次 string names image1 png image2 png image3 png image4 png image5 png 这可能吗 我正在考虑使用 return st
  • 从指向某个成员的指针获取指向对象的指针

    假设有一个结构 struct Thing int a bool b 我得到一个指向成员的指针b该结构的 例如某个函数的参数 void some function bool ptr Thing thing 如何获得指向包含对象的指针 最重要的
  • grunt 任务完成后运行命令?

    我想要运行命令 https stackoverflow com questions 10456865 running a command in a grunt task but after任务在咕噜声中完成 uglify compile o
  • 如果实现 __getattribute__ 有没有办法访问形式参数

    好像 getattribute 只有 2 个参数 self name 然而 在实际的代码中 我拦截的方法实际上带有参数 无论如何可以访问这些参数吗 Thanks Charlie 获取属性 只是返回所请求的属性 如果是方法 则返回 call
  • 从其他进程读取和写入

    我希望能够从另一个进程的内存中读取和写入 我调用了这些函数Readprocessmemory and WriteProcessmemory from Kernel32 dll我用了GetProcessByName 函数来查找进程 这样就成功
  • 如何从 Rails 控制台使用 Devise 登录用户?

    加载Rails控制台后 我应该如何登录用户 Devise 提供了一个可以在测试中使用的测试助手 我尝试在控制台中使用 gt gt include Devise TestHelpers gt gt helper sign in User fi
  • 如何将异常从一个进程传递到另一个进程?

    如果停止函数中的运行状态为 停止 我想在上传函数中引发异常 这似乎不起作用 我正在使用 Pipe 来传递异常 怎么了 def upload instances u1 for instance in instance try u1 recv
  • iOS/Android 检测和重定向

    js新手 慢慢来 D 需要根据用户使用的操作系统进行重定向 如果ios重定向到x 如果android重定向到y 否则 留在原来的地址 我的问题 这些片段够了吗
  • 从 Shell 输出生成文档

    有没有一种方法 工具可以直接从我的 Shell 输出甚至保存的日志生成 HTML 文档 类似于 doxygen 的作用 如果没有可用的东西 你们对如何使用现有工具做到这一点有什么创意吗 我想 在打字时 我可以放置某种标记或特殊字符 然后让一
  • C# 从一个列表中减去另一个列表或检查一个列表是否完全包含在另一个列表中

    如何从一个列表中减去另一个列表 List
  • Python 3.5+ 中类型提示的动态检查[重复]

    这个问题在这里已经有答案了 The typing https docs python org 3 library typing html模块在 Python 3 5 中实现类型提示 然而 这并不是强制执行的 它目前似乎只是为了静态类型检查器
  • 在 Google People API 中未给出的特定时间后更新联系人条目的选项

    我们使用 Google Contacts API 获取在特定时间后更新的联系人条目 以便在我们端保留联系人的更新副本 在 Google Contacts API 中 有一个选项可以使用以下命令在特定时间后更新联系人条目 更新分钟 https
  • 使用 Python 识别 Mac OS X 中的包目录

    Mac OS X Finder 使用 包 的概念使某些文件夹的内容对用户不透明 我在用着os walk 枚举目录树 并且我想跳过对应用程序包等包的枚举 The mdls命令行实用程序可用于检查是否com apple package在里面kM
  • XSL:只有文件名,没有路径

    我是 XSL 编程新手 我想这是一个简单的问题 如何获取没有路径的文件名 目前我的代码如下所示 我得到了整个路径 结果 xml
  • Spring集成测试不回滚

    我正在使用 Spring Hibernate H2 我在集成测试中执行数据库操作 通过调用服务类 我希望 Spring 在每个测试方法之后回滚更改 但我无法让它工作 起初我使用MySQL 带有MyISAM 不支持事务 但是换成H2后问题仍然
  • 使用 $lookup mongodb 填充到深层

    我正在使用 lookup 加入两个集合并从以下查询中获取数据 let condition status ne config PROJECT STATUS completed assignId mongoose Types ObjectId
  • 具有最大高度和最大宽度的响应式图像

    我有这个 html 和 CSS div class kalim img src div CSS kalim display inline block kalim img max width 800px width auto max heig
  • Hibernate 和 Jackson 惰性序列化

    我正在开发一个使用 Hibernate 和 Jackson 来序列化我的对象的项目 我想我明白它应该如何工作 但我无法让它发挥作用 如果我理解得很好 一旦关系获取模式设置为LAZY 如果你想要这个关系 你就必须初始化它 这是我的课程 Ent
  • TensorFlow 中 AdamOptimizer 的学习率不会改变

    我想看看训练期间学习率如何变化 打印出来或创建摘要并在张量板上可视化 这是我迄今为止所掌握的代码片段 optimizer tf train AdamOptimizer 1e 3 grads and vars optimizer comput