我对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(请参阅上面的回溯):密钥dynamic_seq2seq / decoder / attention / attention_layer / kernel /检查点中未找到动量
如果将“self.saver = tf.train.Saver(tf.global_variables())”放在优化器之前,则在加载模型并开始训练之后,会像这样引发FailedPreconditionError。
FailedPreconditionError(请参阅上面的回溯):尝试使用未初始化的值dynamic_seq2seq / decoder / memory_layer / kernel / Momentum
在这些代码之后调用“saver.restore(session,model_file)”。
在TensorFlow中,如何在没有错误的情况下成功恢复模型后更改优化器?
答案 0 :(得分:1)
简而言之:
<textarea
className='comment-area-responsive'
name='title'
placeholder='What do you think?'
value={text} onChange={e => setText(e.target.value)}
required>
</textarea>
一些背景信息:
优化器可以定义所需的其他变量。他们为每个可训练变量创建这些变量。这在两种情况下都是有问题的
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
。但是,这不是有史以来最好的解决方案,因为它使用了专用API。