我是tensorflow的新手。我已经构建了一个用于mnist图像分类的网络,如下所示我正在使用队列从磁盘批处理中读取图像(png)并将其传递给训练操作(我现在对此感到非常满意)这一切都很好,直到我开始评估我的准确性在训练时按一定数量的步骤进行。
我正在使用Saver对象保存模型,并且可以看到正在写入磁盘的元数据和检查点文件。
现在真正的挑战是在模型完成训练后恢复模型并将其用于新图像的预测
我的图表中的第一步(训练)就像下面的x_image(火车队列中的图像)h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1)+ b_conv1)
由于我没有使用Feed字典方法,我不能仅使用saver恢复精度并传递新数据。我必须为测试数据定义队列并重建图形(与之前完全一样),并将参考x_image更改为指向测试数据队列。
我现在如何在训练时恢复学习的重量,并使用这个新图表来简单地运行我的预测/准确度操作。
我试着跟着 - https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10.py教程但迷失了eval代码。
此外,如果我在训练图中添加一个虚拟常量,然后尝试检索它的值,我就可以重新检索它。
任何1请帮助。感谢
答案 0 :(得分:2)
好的,我找到了答案。
最初的挑战是在训练和验证阶段使用队列时在列车和测试数据之间切换。 现在,由于队列是图结构的一部分,我们不能简单地修改它们。
我发现一篇文章使用tf.case在列车和测试队列之间切换,但我不能随机使用随机播放。
手头的真正任务是保存模型后训练并使用保存的模型进行生产预测。
所以这是流程:
<强>训练强>
<强>评价强>
还要确保关闭eval中的drop out功能,因为它会改变同一输入的输出
下面是伪代码
train_op, y_predict, accuracy = create_graph(train_input, train_label)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
model_saver = tf.train.Saver()
for i in range(2000):
if i%100 == 0:
train_accuracy = sess.run(accuracy)
print("step %d, training accuracy %f" %(i, train_accuracy))
sess.run(train_op)
print(sess.run(accuracy))
model_saver.save(sess, 'model/simple_model', global_step=100)
coord.request_stop()
coord.join(threads)
进行评估
_, y_predict, accuracy = create_graph(test_input, test_label)
saver = tf.train.Saver()
with tf.Session() as sess:
saver.restore(sess, tf.train.latest_checkpoint("./model/"))
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
label_predict = sess.run([y_predict])