【问题标题】:Tensorflow: How to change optimizer after restoring a model?Tensorflow:恢复模型后如何更改优化器?
【发布时间】:2018-05-24 01:50:42
【问题描述】:

我对 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 not found in checkpoint

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

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

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

在 TensorFlow 中,如何在成功恢复模型且没有错误的情况下更改优化器?

【问题讨论】:

    标签: python optimization tensorflow


    【解决方案1】:

    简而言之:

    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()。然而,这并不是最好的解决方案,因为它使用私有 API。

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 2018-01-14
      • 2017-08-21
      • 2018-09-06
      • 2016-05-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多