我是 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)
一些背景信息:
优化器可以定义他们需要的额外变量。他们为每个 可训练变量创建这些变量。这在两种情况下会成为问题
- 在训练期间改变优化器,因为这是这个问题的范围。
- 在训练期间解冻一个变量。言下之意,这个变量之前被标记为
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/