如何对齐两个tf.RandomShuffleQueue以保证输入与标签匹配?
解决RandomShuffleQueue导致输入与标签无法对齐的问题
你遇到的问题其实很典型——两个独立的RandomShuffleQueue会各自独立地随机打乱队列内的数据,它们之间没有任何同步机制,所以输入和标签的对应关系自然就被破坏了。而FIFOQueue是按顺序出队,所以两个队列的顺序能保持一致,但换成随机队列就不行了。
正确的解决思路:把输入和标签打包进同一个队列
不要分开维护输入队列和标签队列,应该把每个输入对应的标签打包成一个整体(比如一个tuple),然后将这个整体存入同一个RandomShuffleQueue中。这样队列在随机打乱时,会对整个(输入,标签)样本进行打乱,确保出队时输入和标签始终是一一对应的。
修改后的代码示例
import tensorflow as tf # 把输入和标签打包成一个整体,存入同一个RandomShuffleQueue queue = tf.RandomShuffleQueue( capacity=50, min_after_dequeue=2, dtypes=["int32", "int32"], shapes=[(), ()] ) # 同时入队输入和标签的批量数据 input_data = range(5) label_data = range(5) enqueue_op = queue.enqueue_many((input_data, label_data)) # 同时出队一组输入和标签 input_res, label_res = queue.dequeue_many(10) with tf.Session() as sess: # 填充队列 for _ in range(10): sess.run(enqueue_op) # 获取结果 print(sess.run([input_res, label_res]))
为什么这个方法有效?
当你把输入和标签作为一个单元存入队列时,队列的随机打乱操作是针对整个单元进行的。也就是说,不管怎么打乱,每个输入始终和它对应的标签绑定在一起,出队的时候自然就能保持对齐了。
而你之前的做法中,两个RandomShuffleQueue各自独立随机出队,相当于两个完全不相关的随机序列,当然没法保证输入和标签的对应关系啦。
内容的提问来源于stack exchange,提问作者partida
相关产品推荐
相关产品推荐

