重置张量流优化器

Posted

技术标签:

【中文标题】重置张量流优化器【英文标题】:Reset tensorflow Optimizer 【发布时间】:2017-01-29 04:09:54 【问题描述】:

我正在从保存的模型中加载,我希望能够重置 TensorFlow 优化器,例如 Adam 优化器。理想情况下是这样的:

sess.run([tf.initialize_variables(Adamopt)])

sess.run([Adamopt.reset])

我已尝试寻找答案,但尚未找到任何方法。这是我发现的不能解决问题的内容: https://github.com/tensorflow/tensorflow/issues/634

In TensorFlow is there any way to just initialize uninitialised variables?

Tensorflow: Using Adam optimizer

我基本上只是想要一种方法来重置 Adam Optimizer 中的“槽”变量。

谢谢

【问题讨论】:

【参考方案1】:

我发现的最简单的方法是给优化器自己的变量范围,然后运行

optimizer_scope = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
                                 "scope/prefix/for/optimizer")
sess.run(tf.initialize_variables(optimizer_scope))

来自freeze weights的想法

【讨论】:

这似乎不适用于 TensorFlow 1.0 中的 Adam。 我在 tf 0.10 中对其进行了测试,我将使用 tf 1.0 重新运行测试。错误是什么? 应该指定 - 它没有为 Adam 列出任何可训练的变量,范围似乎是空的。 我今天再看看。我自己安装了 1.0 然后更新了答案。同时还有这个可能会有所帮助***.com/questions/35164529/… 应该是 tf.GraphKeys.GLOBAL_VARIABLES 而不是 tf. GraphKeys.TRAINABLE_VARIABLES。我将编辑答案以修复它。【参考方案2】:

这个问题也困扰了我好一阵子。其实很简单,你只需定义一个操作来重置优化器的当前状态,可以通过 variables() 方法获得,如下所示:

optimizer = tf.train.AdamOptimizer(0.1, name='Optimizer')
reset_optimizer_op = tf.variables_initializer(optimizer.variables())

当您需要重置优化器时,运行:

sess.run(reset_optimizer_op)

variables()官方解释:

编码优化器当前状态的变量列表。 在当前默认图中包括由优化器创建的槽变量和其他全局变量。

例如对于 AdamOptimizer,基本上你会得到所有可训练变量的第一个和第二个时刻(带有 slot_name 'm' 和 'v'),只要 beta1_power 和 beta2_power。

【讨论】:

不知道以下是否仍然正确。我听说在内部,AdamOptimizer 还跟踪它运行的步数。仅仅做tf.variables_initializer(optimizer.variables()) 是不够的。请参阅 LucasB 的回答 ***.com/questions/41533489/… 这里也一样。 variable_initializer 不够用【参考方案3】:

在 tensorflow 2.x 中,例如 Adam 优化器,您可以像这样重置它:

for var in optimizer.variables():
    var.assign(tf.zeros_like(var))

【讨论】:

以上是关于重置张量流优化器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow 中创建优化器

Adam 优化器真的是 RMSprop 加动量吗?如果是,为啥它没有动量参数?

tf.train.AdamOptimizer 优化器

tf.train.MomentumOptimizer 优化器

张量流中的条件图和访问张量大小的for循环

Pytorch优化器全总结AdadeltaRMSpropAdamAdamaxAdamWNAdamSparseAdam(重置版)