繁体   English   中英

TensorFlow:如何顺利使用管道来加载,训练和预测图像?

[英]TensorFlow: How to smoothly use pipeline to load, train and predict images?

我对阅读数据和批次相关的事情感到困惑。

我读了这样的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的返回数据是否有效。

使用mnist的tensorflow中的示例有一个名为“next_batch”的函数,但是当我使用自己的数据时我没有这个...

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

关于模型保存

在培训阶段,我使用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

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

关于预测

问题就像问题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()})

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

第1部分

对于第一个问题,根据tf.train.batch文档 ,当批处理耗尽时,该对象将抛出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部分

至于你的第二个问题,我只花了一些时间处理保存和恢复问题。 查看此示例以获得一些解释。 基本上,您可以按照自己的方式保存模型,但我建议您为要在以后使用的任何操作或变量的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]

第3部分

可能比较棘手? 您是如何设置网络的数据占位符的? 如果你定义它们:

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

在GitHubGist上发现这个例子有助于理解这一点。 这听起来不像是你的问题,但可以帮助你找到问题的根源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM