我已经写了一个张量流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()
答案 0 :(得分:19)
在要恢复(或保存)的变量之后必须创建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))
答案 1 :(得分:2)
请注意,自TF 0.11以来-很久以前,在当前接受的答案之后-tf.train.Saver
获得了defer_build
argument in its constructor,可让您在 之后定义变量。但是,现在,在添加所有变量后,通常在build
图形之前,就需要调用其finilize
成员函数。
saver = tf.train.Saver(defer_build=True)
# build you graph here
saver.build()
graph.finalize()
# now entering training loop
答案 2 :(得分:1)
简单来说,在创建保护对象之前,至少应定义一个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()
...