【问题标题】:Tensorflow ValueError: No variables to save fromTensorflow ValueError:没有要保存的变量
【发布时间】:2016-12-02 06:13:46
【问题描述】:

我写了一个 tensorflow CNN,它已经被训练过了。我希望恢复它以在几个样本上运行它,但不幸的是它吐了出来:

ValueError:没有要保存的变量

我的评估代码可以在这里找到:

import tensorflow as tf

import main
import Process
import Input

eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-30"
checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint"

init_op = tf.initialize_all_variables()
saver = tf.train.Saver()

def evaluate():
  with tf.Graph().as_default() as g:
    sess.run(init_op)

    ckpt = tf.train.get_checkpoint_state(checkpoint_dir)

    saver.restore(sess, eval_dir)

    images, labels = Process.eval_inputs(eval_data = eval_data)

    forward_propgation_results = Process.forward_propagation(images)

    top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1)

    print(top_k_op)

def main(argv=None):
    evaluate()

if __name__ == '__main__':
  tf.app.run()

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    tf.train.Saver 必须在您要恢复(或保存)的变量之后创建。此外,它必须与这些变量在同一图表中创建。

    假设 Process.forward_propagation(…) 也在您的模型中创建变量,在此行之后添加保护程序创建应该可以工作:

    forward_propgation_results = Process.forward_propagation(images)
    

    此外,您必须将创建的新 tf.Graph 传递给 tf.Session 构造函数,因此您还需要将 sess 的创建移动到该 with 块内。

    生成的函数将类似于:

    def evaluate():
      with tf.Graph().as_default() as g:
        images, labels = Process.eval_inputs(eval_data = eval_data)
        forward_propgation_results = Process.forward_propagation(images)
        init_op = tf.initialize_all_variables()
        saver = tf.train.Saver()
        top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1)
    
      with tf.Session(graph=g) as sess:
        sess.run(init_op)
        saver.restore(sess, eval_dir)
        print(sess.run(top_k_op))
    

    【讨论】:

    • 非常感谢,虽然我确实删除了 eval data = eval data 并且它应该仍然可以工作。现在当我运行程序时,python 没有输出任何内容。
    • 我不确定eval_data 来自哪里,因为您的示例中没有绑定该名称。 Process.eval_inputs() 是否使用输入管道?也许你需要添加tf.train.start_queue_runners(sess=sess) after running saver.restore()`。
    • 谢谢。代码已修复,但添加该行后弹出新错误。 E tensorflow/core/client/tensor_c_api.cc:485] 目标[0] 超出范围
    • "tf.train.Saver 必须在要恢复(或保存)的变量之后创建。" 这是什么原因?
    • 什么是eval_data 以及为什么我们必须在还原之前创建变量?
    【解决方案2】:

    请注意,自从 TF 0.11 以来——很久以前,在当前接受的答案之后——tf.train.Saver 获得了一个 defer_build argument in its constructor,它允许您在构造变量之后定义变量。但是,您现在需要在添加所有变量后调用其 build 成员函数,通常是在 finilizeing 您的图表之前。

    saver = tf.train.Saver(defer_build=True)
    # build you graph here
    saver.build()
    graph.finalize()
    # now entering training loop
    

    【讨论】:

      【解决方案3】:

      简单地说,在创建保护程序对象之前至少应该定义一个 tf.variable。

      您可以通过在保护程序对象定义之前添加以下代码行来运行上述代码。

      您需要添加的代码位于两个###之间。

      import tensorflow as tf
      
      import main
      import Process
      import Input
      
      eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-30"
      checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint"
      
      init_op = tf.initialize_all_variables()
      
      ### Here Comes the fake variable that makes defining a saver object possible.
      _ = tf.Variable(initial_value='fake_variable')
      
      ###
      saver = tf.train.Saver()
      ...
      

      【讨论】:

        猜你喜欢
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-19
        • 2016-07-16
        • 2018-03-19
        • 2016-08-29
        • 2020-10-31
        相关资源
        最近更新 更多