Tensorflow ValueError:没有要保存的变量
machine-learning
python
tensorflow
7
0

我已经写了一个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()
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

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

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

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()
...
收藏
评论

必须在要还原(或保存)的变量之后创建tf.train.Saver 。此外,必须在与这些变量相同的图形中创建它。

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

forward_propgation_results = Process.forward_propagation(images)

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

结果函数将类似于:

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))
收藏
评论

请注意,自TF 0.11以来(很久以前尚未接受当前的答案), tf.train.Saver 在其构造函数中获得了defer_build参数,该参数允许您在构造变量对其进行定义。但是,现在,在添加finilize所有变量之后,通常需要在完成图形绘制之前,就需要调用其build成员函数。

saver = tf.train.Saver(defer_build=True)
# build you graph here
saver.build()
graph.finalize()
# now entering training loop
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号