如何使用队列方法使用已保存模型的测试数据(不使用feed_dict)#tensorflow?

时间:2017-06-12 09:08:00

标签: tensorflow

我是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请帮助。感谢

1 个答案:

答案 0 :(得分:2)

好的,我找到了答案。

最初的挑战是在训练和验证阶段使用队列时在列车和测试数据之间切换。 现在,由于队列是图结构的一部分,我们不能简单地修改它们。

我发现一篇文章使用tf.case在列车和测试队列之间切换,但我不能随机使用随机播放。

手头的真正任务是保存模型后训练并使用保存的模型进行生产预测。

所以这是流程:

<强>训练

  • 创建一个创建图形的方法(将图像张量设为 输入)。
  • 通过培训图像批次构建培训图表
  • 执行培训并使用保护程序对象保存模型。

<强>评价

  • 现在使用测试图像批次重建相同的图形。
  • 在会话中使用saver对象来恢复权重(注意,您不需要传递要恢复的变量,默认情况下它会恢复所有可恢复的变量) 此时不要运行gloabl变量初始化程序
  • 运行您的预测运算(从新构建的图表生成)

还要确保关闭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])