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



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

我这样读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。都是砰砰声。

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

然后我用:

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

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

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

<标题> 1。关于培训h1> 我训练模型时,我如何确保我使用了所有的数据?eval()是如何工作的?每次它返回新的batch_size数据或其他方式?I tried
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与mist的例子有一个名为"next_batch"的函数,但我没有这个东西,当我使用我自己的数据…

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

<标题> 2。关于模型保存

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

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。关于预测h1> 个问题和问题1一样,是关于eval的。例如,我有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()})

,程序可以输出比我拥有的测试图像更多的"大量"图像。我如何以一种舒适的方式预测测试图像?

第一部分

对于您的第一个问题,根据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上发现这个例子有助于理解这一点。这听起来不像完全是你的问题,但可以帮助你找到问题的根源。

最新更新