2016-11-25 198 views
0

我正在尝试恢复张量流中保存的变量。似乎它非常非常复杂。如何恢复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]的初始值,而不是微调,那些

回答

0

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

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

0

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

  1. 重新加载或者是整个图形或导入其元图(前者是 建议,如果你是一个新手)。您还没有运行恢复 功能
  2. 启动会话,并初始化所有变量
  3. 还原(使用tf.train.Saver)检查点

上,你的问题是,当你恢复后运行tf.initialize_all_variables(),张量流将它们重置为初始值,并且你松开你的微调权重。