我正在尝试在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 :(得分:0)
从元图中恢复准备图,而不是数据。还原数据需要在训练时将要还原的值添加到集合对象,并在还原时重新加载这些集合。 official tutorial显示了(实际上还有另一种方式,见下文)。
另一种方法是恢复图形(tf.write_graph
和tf.import_graph_def
),然后从检查点恢复所有变量。官方教程似乎更倾向于采用这种检查点方法(参见上面的链接)。元图非常适用于分布式处理,这需要更多的工作和关注。
答案 1 :(得分:0)
Eric回答了你的大部分观点。 我遇到了类似的问题,简单的解决方法是:
tf.train.Saver
)检查点您的案例的问题是,当您在恢复后运行tf.initialize_all_variables()
时,tensorflow会将它们重置为初始值,并且您会丢失经过微调的权重。