gpt4 book ai didi

tensorflow - 使用队列从多个输入文件中统一采样

转载 作者:行者123 更新时间:2023-12-03 21:59:09 25 4
gpt4 key购买 nike

我的数据集中的每个类都有一个序列化文件。我想使用队列来加载这些文件中的每一个,然后将它们放在一个 RandomShuffleQueue 中,这样我就可以从每个类中随机混合一些示例。我认为这段代码会起作用。

在此示例中,每个文件都有 10 个示例。

filenames = ["a", "b", ...]

with self.test_session() as sess:
# for each file open a queue and get that
# queue's results.
strings = []
rq = tf.RandomShuffleQueue(1000, 10, [tf.string], shapes=())
for filename in filenames:
q = tf.FIFOQueue(99, [tf.string], shapes=())
q.enqueue([filename]).run()
q.close().run()
# read_string just pulls a string from the file
key, out_string = input_data.read_string(q, IMAGE_SIZE, CHANNELS, LABEL_BYTES)
strings.append(out_string)

rq.enqueue([out_string]).run()

rq.close().run()
qs = rq.dequeue()
label, image = input_data.string_to_data(qs, IMAGE_SIZE, CHANNELS, LABEL_BYTES)
for i in range(11):
l, im = sess.run([label, image])
print("L: {}".format(l)

这适用于 10 次调用,但在 11 日它说队列是空的。

我相信这是由于我对这些队列的运作方式存在误解。我将 10 个变量添加到 RandomShuffleQueue ,但是这些变量中的每一个本身都是从队列中提取的,所以我假设在每个文件队列为空之前队列不会被清空。

我在这里做错了什么?

最佳答案

这个问题的正确答案取决于你有多少文件,它们有多大,以及它们的大小是如何分布的。

您的示例的直接问题是 rq每个 filename in filenames 只获取一个元素,则队列关闭。我假设有 10 filenames , 自 rq.dequeue()将消耗 rq 的一个元素每次调用sess.run([label, image]) .由于队列关闭,不能再添加元素,第11次激活rq.dequeue()操作失败。

一般的解决方案是您必须创建额外的线程才能继续运行rq.enqueue([out_string])在一个循环中。 TensorFlow 包含一个 QueueRunner旨在简化这一点的类,以及处理常见情况的其他一些函数。 documentation for threading and queues解释了它们是如何使用的,在 using queues to read from files 上也有一些很好的信息。 .

对于您的特定问题,您可以处理的一种方法是创建 N阅读器(对于每个 N 个文件)。然后你可以 tf.pack() N元素(每个读者一个)成一个批处理,并使用 enqueue_many 一次添加一个批处理到 tf.RandomShuffleQueue 具有足够大的容量和min_after_dequeue以确保类之间有足够的混合。调用 dequeue_many(k) RandomShuffleQueue会给你一批k以相等概率从每个文件中采样的元素。

关于tensorflow - 使用队列从多个输入文件中统一采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33715728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com