python - Tensorflow:恢复模型后如何更改优化器?

标签 python optimization tensorflow

我是 TensorFlow 的新手,不知道如何解决这个关于更改优化器的简单问题。

例如,我想在恢复模型后将“AdamOptimizer”更改为“MomentumOptimizer”。

# optimizer = tf.train.AdamOptimizer(self.learning_rate)
optimizer = tf.train.MomentumOptimizer(learning_rate=self.learning_rate, momentum=0.8)

如果在优化器之后放置“self.saver = tf.train.Saver(tf.global_variables())”,则会像这样引发 NotFoundError。

NotFoundError(回溯见上文):在检查点中找不到 key dynamic_seq2seq/decoder/attention/attention_layer/kernel/Momentum

如果“self.saver = tf.train.Saver(tf.global_variables())”放在优化器之前,在加载模型并开始训练后,会像这样引发 FailedPreconditionError。

FailedPreconditionError(回溯见上文):尝试使用未初始化的值 dynamic_seq2seq/decoder/memory_layer/kernel/Momentum

在这些代码之后调用“saver.restore(session, model_file)”。

在TensorFlow中,如何在成功恢复模型无错误后更改优化器?

最佳答案

简而言之:

import tensorflow as tf

new_optimizer = tf.train.XXXOptimizer()

var_list = tf.trainable_variables()
# or if some variables are frozen
var_list = tf.tf.global_variables()

# Tell the new optimizer
new_optimizer._create_slots(var_list=var_list)

一些背景信息:

优化器可以定义他们需要的额外变量。他们为每个 可训练变量创建这些变量。这在两种情况下会成为问题

  1. 在训练期间改变优化器,因为这是这个问题的范围。
  2. 在训练期间解冻一个变量。言下之意,这个变量之前被标记为 trainable=False。这意味着之前使用的优化器(可以是相同的或不同的)没有创建这些辅助变量。那时它们不包括在检查点中。加载失败,因为假定它们存在。上面的例子可以变得更简单:
trainable = False  # or True
layer = tf.layers.Layer(trainable=trainable)
outputs = layer(inputs)
new_optimizer._create_slots(var_list=layer.variables)

以上适用于所有优化器,因为按照惯例,每个 tf.train.XXXOptimizer 都必须实现 _create_slots() 如果要创建额外的变量。然而,它并不是最好的解决方案,因为它使用私有(private) API。

关于python - Tensorflow:恢复模型后如何更改优化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47737693/

相关文章:

r - 在 R 中寻找约束满足算法

Java集合: checking object property

python - 如何批量写入 TFRecords?

python - 类型错误 : __array__() takes 1 positional argument but 2 were given

python - 是否可以更改本地人的口述?

python - 在 Python 中处理非常大的数字

python - 类型错误 : __init__() missing 1 required positional argument: 'units'

python - 为什么我的 tensorflow 模型输出在 x 个时期后变成 NaN?

python - 如何在请求中获取页面标题

python - 从 python 发送到 logstash 的 TCP 数据失败