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



我是Tensorflow的新手。我已经为mnist图像分类构建了一个convonet,如下所示,我正在使用队列从磁盘批处理中读取图像(png)并将其传递给训练操作(我现在对此很满意)在训练之前一切都很好,我在训练时正在评估我的准确性操作在一定数量的步骤。

我正在使用 Saver 对象保存模型,可以看到正在磁盘上写入的元和检查点文件。

现在真正的挑战是在模型完成训练后恢复模型,并将其用于对新图像的预测。

我的图表(训练)的第一步如下所示,它需要x_image(来自火车队列的图像)h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

由于我没有使用饲料字典方法,因此我不能仅使用保护程序恢复准确性操作并传递新数据。我必须定义测试数据的队列,并使用引用重建图形(与之前完全相同),x_image更改为指向测试数据队列。

我现在如何在训练时恢复学习的权重,并将其与这个新图一起使用,以简单地运行我的预测/准确性操作。

我试图跟随 - https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10.py 教程,但迷失了评估代码。

此外,如果我在我的训练图中添加一个虚拟常量,然后尝试检索它的值,我能够检索它。

任何 1 请帮忙。谢谢

好的,所以我找到了答案。

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

我找到了一篇使用 tf.case 在训练队列和测试队列之间切换的文章,但我无法使用随机批处理。

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

所以这是流程:

训练

  • 创建一个创建图形的方法(将图像张量作为 输入)。
  • 通过传递训练图像批处理构建训练图
  • 执行训练并使用保护程序对象保存模型。

评估

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

还要确保关闭评估中的丢弃功能,因为它会不断改变相同输入的输出

下面是伪代码

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])

最新更新