如何在tensorflow中恢复已保存的变量?

时间:2016-11-25 11:31:19

标签: tensorflow

我正在尝试在tensorflow中恢复已保存的变量。好像很复杂。

我在http://www.cs.toronto.edu/~guerzhoy/tf_alexnet/

中使用了alexnet实现

在python文件中,alexnet.py,我定义了变量

conv5W = tf.Variable(net_data["conv5"][0],name='conv5w')

然后,我微调模型,我看到它的一些值被改变了。我输入以下内容保存了微调模型:

saver = tf.train.Saver()
saver.save(sess,"modelname.ckpt")
之后,我打开一个新的ipython控制台并运行:

from alexnet import *
sess=tf.InteractiveSession()
new_saver = tf.train.import_meta_graph("modelname.ckpt.meta")
new_saver.restore(sess, "modelname.ckpt")

之后,当我尝试使用:

检索变量的值时
conv5W.eval(session=sess)

它产生:

FailedPreconditionError: Attempting to use uninitialized value conv5w
     [[Node: conv5w/_98 = _Send[T=DT_FLOAT, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_conv5w", _device="/job:localhost/replica:0/task:0/gpu:0"](conv5w)]]
     [[Node: conv5w/_99 = _Recv[_start_time=0, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_conv5w", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

另一方面,如果我使用:

初始化变量
init = tf.initialize_all_variables()
sess.run([init]) ,

这次它会产生net_data["conv5"][0]的初始值,而不是精细的值

2 个答案:

答案 0 :(得分:0)

从元图中恢复准备图,而不是数据。还原数据需要在训练时将要还原的值添加到集合对象,并在还原时重新加载这些集合。 official tutorial显示了(实际上还有另一种方式,见下文)。

另一种方法是恢复图形(tf.write_graphtf.import_graph_def),然后从检查点恢复所有变量。官方教程似乎更倾向于采用这种检查点方法(参见上面的链接)。元图非常适用于分布式处理,这需要更多的工作和关注。

答案 1 :(得分:0)

Eric回答了你的大部分观点。 我遇到了类似的问题,简单的解决方法是:

  1. 重新加载整个图表或导入其元图表(以前是 推荐,如果你是一个新手)。您仍然无法运行还原 功能
  2. 开始会话并初始化所有变量
  3. 恢复(使用tf.train.Saver)检查点
  4. 您的案例的问题是,当您在恢复后运行tf.initialize_all_variables()时,tensorflow会将它们重置为初始值,并且您会丢失经过微调的权重。