Skip to main content
 首页 » 编程设计

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

2025年01月19日29lyj

我是 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。