我对TensorFlow真的很陌生,所以请耐心等待,即使这个问题完全是胡说八道......
我有一个代码
1)定义网络像
x = tf.placeholder(tf.float32, shape=[None, 784], name='input')
y_ = tf.placeholder(tf.float32, shape=[None, 10], name='reference')
...
fc_b2_hist = tf.summary.histogram('b_fc2', b_fc2)
2)然后恢复模型
with tf.Session() as sess:
#NOTE
#sess.run(tf.initialize_all_variables())
model_path = tf.train.latest_checkpoint(model_path)
saver = tf.train.import_meta_graph(model_path+'.meta')
saver.restore(sess, model_path)
all_vars = tf.trainable_variables()
for v in all_vars:
print(sess.run(v))
这段代码恢复了模型,在单独的文件中运行时工作得很好。但是,当在此运行时,它会中止并显示以下错误消息
回溯(最后一次调用):文件“lenet_my.py”,第 160 行,在 print(sess.run(v)) 文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/client /session.py”,第 766 行,在运行 run_metadata_ptr)文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py”,第 964 行,在 _run feed_dict_string,选项中, run_metadata)文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py”,第 1014 行,在 _do_run 目标列表,选项,run_metadata)文件“/usr/local/lib/ python2.7/dist-packages/tensorflow/python/client/session.py”,第 1034 行,在 _do_call raise type(e)(node_def, op, message) tensorflow.python.framework.errors_impl.FailedPreconditionError:尝试使用未初始化的值 lenet_model/conv_pool_1/W_conv1 [[节点:_send_lenet_model/conv_pool_1/W_conv1_0 = _SendT=DT_FLOAT, client_terminated=true, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device ="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=422131278131772803, tensor_name="lenet_model/conv_pool_1/W_conv1:0", _device="/job:localhost/replica:0/task: 0/cpu:0"]]0/任务:0/cpu:0"]]0/任务:0/cpu:0"]]
在我第一次看到这条消息后,我取消了#NOTE 下的注释,即
sess.run(tf.initialize_all_variables())
它没有显示这样的错误,但是预训练的变量没有被恢复,而是按照我在定义网络时定义它的方式进行了初始化。
所以我有两个问题!
首先,我不明白在一个单独的文件中运行代码和在一个文件中运行它以获得这种可怕的错误消息之间有什么区别第二,我不明白为什么初始化变量然后用编写的代码恢复模型上面不会恢复之前训练的变量。
提前谢谢