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

时间:2017-12-10 09:58:59

标签: 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(请参阅上面的回溯):密钥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中,如何在没有错误的情况下成功恢复模型后更改优化器?

1 个答案:

答案 0 :(得分:1)

简而言之:

    <textarea 
      className='comment-area-responsive' 
      name='title' 
      placeholder='What do you think?' 
      value={text} onChange={e => setText(e.target.value)} 
      required>
    </textarea>

一些背景信息:

优化器可以定义所需的其他变量。他们为每个可训练变量创建这些变量。这在两种情况下都是有问题的

  1. 一个人在培训过程中更改了优化程序,因为这是此问题的范围。
  2. 一个人在训练期间解冻变量。隐含地,此变量之前被标记为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。