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

Tensorflow 使用队列从多个输入文件中统一采样,tensorflow,Tensorflow,数据集中的每个类都有一个序列化文件。我想使用队列加载这些文件中的每一个,然后将它们放在一个随机的ShuffleQueue中,这样我就可以从每个类中随机混合一些示例。我认为这个代码会起作用 在本例中,每个文件有10个示例 filename=[“a”,“b”,…] 使用self.test_session()作为sess: #对于每个文件,打开一个队列并获取 #队列的结果。 字符串=[] rq=tf.RandomShuffleQueue(1000,10,[tf.string],shapes=()) 对

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

在本例中,每个文件有10个示例

filename=[“a”,“b”,…]
使用self.test_session()作为sess:
#对于每个文件,打开一个队列并获取
#队列的结果。
字符串=[]
rq=tf.RandomShuffleQueue(1000,10,[tf.string],shapes=())
对于文件名中的文件名:
q=tf.FIFOQueue(99,[tf.string],shapes=())
q、 排队([filename]).run()
q、 close().run()
#read_string只是从文件中提取一个字符串
键,输出字符串=输入数据。读取字符串(q、图像大小、通道、标签字节)
strings.append(out\u string)
rq.enqueue([out_string]).run()
rq.close().run()
qs=rq.dequeue()
标签,图像=输入数据。字符串到数据(qs,图像大小,通道,标签字节)
对于范围(11)中的i:
l、 im=sess.run([标签,图像])
打印(“L:{}”。格式(L)
这对于10个呼叫来说效果很好,但是在11号,它说队列是空的

我相信这是因为我对这些队列的操作有误解。我向
随机随机队列
中添加了10个变量,但每个变量本身都是从队列中提取的,因此我假设在每个文件队列都为空之前,队列不会被清空


我做错了什么?

这个问题的正确答案取决于您有多少文件、文件大小以及文件大小的分布情况

您的示例的直接问题是,
rq
只为文件名中的每个
文件名获取一个元素,然后队列关闭。我假设有10个
文件名
,因为
rq.dequeue()
每次调用
sess.run([label,image])将消耗一个
rq
元素
。由于队列已关闭,因此无法添加更多元素,第11次激活
rq.dequeue()
操作失败

一般的解决方案是,您必须创建额外的线程来保持运行
rq.enqueue([out\u string])
在循环中。TensorFlow包括一个旨在简化此过程的
QueueRunner
类,以及一些处理常见情况的其他函数。说明了如何使用这些函数,还提供了一些有关它们的详细信息


至于您的特定问题,您可以处理此问题的一种方法是创建
N
读卡器(针对每个
N
文件)。然后您可以创建
N
元素(每个读卡器一个)进入一个批次,并使用以足够大的容量和出列后的
min\u将批次一次添加到一个中,以确保类之间有足够的混合。调用
randomsufflequeue
将为您提供一批从每个文件中以相同概率采样的
k
元素。

开始解决这个问题:您想将所有示例读入内存并将其洗牌,还是想随着空间的释放继续从10个文件输入随机洗牌队列?是否可能有比可用线程更多的读卡器?我有100个文件,希望从这些文件中进行大致相同的采样。我可以在此ca中创建100个读卡器吗东南方?