【问题标题】:TensorFlow: How to smoothly use pipeline to load, train and predict images?TensorFlow:如何流畅地使用管道来加载、训练和预测图像?
【发布时间】:2017-02-06 03:39:16
【问题描述】:

我对读取的数据和批处理相关的事情感到困惑。

我是这样读 png 的:

trainInputQueue = tf.train.string_input_producer(filePaths, shuffle=False)
key, value = tf.WholeFileReader().read(trainInputQueue)
images = tf.image.decode_png(value, channels=0)
images = tf.reshape(images, para['shape'])
images.set_shape(para['shape'])
images = tf.cast(images, tf.float32) * (1. / 255) - 0.5
return images

然后用上面的代码读取得到的trainX,testX。它们都是.png。

然后我用tf.placeholder 定义我的网络作为输入和输出。

然后我用:

trainXBatch, trainYBatch = tf.train.batch(
    [trainX, trainY],
    batch_size=batch_size
)

直到这里,它们都是传统的东西。读取的数据是张量,而不是 numpy.ndarray 或列表。

那么我的问题如下。我真的需要一些示例代码来学习:

1。关于培训

val, c = sess.run([optimizer, cost], feed_dict={X: trainXBatch.eval(), Y: trainYBatch.eval()})

当我训练模型时,如何确保我使用了所有数据? “eval()”的工作方式是什么?每次它返回新的batch_size 数据或其他方式? 我试过了

for i in range( a very big number):
    val, c = sess.run([optimizer, cost], feed_dict={X: trainXBatch.eval(), Y: trainYBatch.eval()})

'eval()' 总是可以返回数据,而且数据是不一样的。我不知道我是否使用了所有数据,以及从eval返回的数据是否有效。

在tensorflow中用mnist的例子有一个名为“next_batch”的函数,但是我用自己的数据时没有这个东西……

我只是想知道如何使用数据以像 keras 一样的传统方式使用标签进行训练。

2。关于模型保存

在训练阶段,我使用 saver 作为:

saver = tf.train.Saver(tf.all_variables())
with tf.Session() as sess:
    #...some codes
    saver.save(sess, model_path + '/' + modelNamePrefix + model_name)

在预测阶段:

saver = tf.train.Saver(tf.all_variables())
# other codes same as training phase
with tf.Session() as sess:
    sess.run(init)
    saver.restore(sess, model_path + '/' + modelNamePrefix + model_name)
    # then use sess.run to predict

这些代码对吗?我没有得到很好的结果,所以我不确定它是否有效。

3。关于预测

这个问题就像问题 1,关于评估。 比如我有1000张图片要预测,图片在testX中,print(testX.get_shape())我可以看到(?, 32, 32, 3),和trainX一样。 但是对于同一个模型,testX.eval() 不能直接发送到 feed_dict。 也许我还需要

testXBatch, testYBatch = tf.train.batch(
    [testX.data, testY.data],
    batch_size=1
)

但是!如何确保我预测所有测试数据? 我只是用

for i in range(a big number):
    yimgs = sess.run(y_pred, feed_dict={X: testXBatch.eval()})

并且程序可以输出比我拥有的测试图像更多的“大量”图像。 如何以舒适的方式预测测试图像?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    第 1 部分

    对于您的第一个问题,根据the tf.train.batch documentation,当批次用完时,该对象将抛出tf.errors.OutOfRangeError。它还包含一个元素capacity,它告诉您队列中有多少项目。您可以让您的 for 循环运行直到队列耗尽,以防万一查找该错误:

    try:
        for _ in range(a_batch.capacity // a_batch.batch_size):
            # run your training operation
    except tf.errors.OutOfRangeError:
        pass
    

    第 2 部分

    关于你的第二个问题,我刚刚也花了一些时间处理保存和恢复。查看this example 以获得一些解释。基本上,您可以按照自己的方式保存模型,但我建议您为以后要使用的任何操作或变量的 name 字段分配一个唯一值。这使得以后更容易取回它们。保存模型时,您会得到一个名为 [filename].meta 的文件。要恢复您的会话和图表:

    tf.reset_default_graph()  # include this if you are working in a notebook and may already have a graph designed
    saver = tf.train.import_meta_graph('/path/to/[filename].meta')
    sess = tf.Session()
    saver.restore(sess, '/path/to/[filename]')  # leave off the ".meta"
    graph = sess.graph
    

    并加载您命名的任何操作或变量:

    tensor_name = graph.get_tensor_by_name('tensor_name:0')  # note the ":0"
    

    如果您使用tf.add_to_collection() 保存了任何运算符,请使用:

    op_name = tf.get_collection('op_name')[0]
    

    第三部分

    可能更棘手?您如何设置网络的数据占位符?如果您将它们定义为:

    data = tf.placeholder(tf.float32, [None, 32, 32, 3], name='data')
    

    那么您应该能够向您的网络提供任何批量大小,它会神奇地处理它:

    test_error = sess.run(my_error_op, feed_dict={data: all_the_test_data})
    

    我发现this example on GitHubGist 有助于理解这一点。听起来并不完全像您的问题,但可能会帮助您深入了解此问题。

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 2020-01-30
      • 2017-01-15
      • 2018-05-03
      • 2022-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多