2016-02-26 70 views
5

我的理解是,为每个纪元洗牌训练样本是一个很好的做法,这样每个小批量包含整个数据集的一个很好的随机样本。如果我将整个数据集转换为包含TFRecords的单个文件,那么在加载整个数据集之后如何实现这种混洗?我的理解是,没有有效的随机访问TFRecord文件。所以,具体而言,我正在寻找如何在这种情况下使用TFRecord文件的指导。TF记录和记录洗牌

+0

有'shuffle_batch'使用'RandomShuffleQueue'。它洗牌缓冲部分的数据集,这个问题有更多的细节 - http://stackoverflow.com/questions/33715728/using-queues-to-uniformly-sample-from-multiple-input-files –

+0

这是一个有益的但是他提出的解决方案仍然会加载整个数据集:看起来问题的关键在于确保这些类在小批量中被同等地表示。如果加载整个数据集不太实际,那么看起来最好的方法就是维护文件名队列并加载单个实例(可能有多个线程进入队列)。在这种情况下,TFRecord似乎没有提供太多的价值。 – bobw

回答

3

这不是 - 您可以通过将输入分成多个输入数据文件,然后将它们对待as explained in this answer来改善混合。

如果您需要接近“完美”洗牌的任何内容,您需要将其读入内存中,但实际上对于大多数情况,您可能会通过分成100或1000个文件进行“足够好”的洗牌,然后使用一个大小足以容纳8-16个文件数据的shuffle队列。

我有一个痒在脑后,写一个外部随机洗牌队列,可以泄漏到磁盘,但它是我的优先级列表非常低 - 如果有人想贡献一个,我志愿审查它。 :)

+6

痒怎么样? +1 – TimZaman

0

其实现在你不必担心在保存到TFRecords之前洗牌。这是因为(当前)推荐的读取TFRecords的方法使用tf.data.TFRecordDataset,其实施.shuffle()方法。

+0

其实,我不确定这是否属实。您所描述的shuffle()方法只给出本地随机性(跨越队列的容量),而不是整个记录。 – ezfn

+0

我从来没有说过它使用整个数据集。但是这并不意味着基于队列的混洗不足以提供必要的随机性。我看到它在很少的实现中被使用,你可以看看例如tensor2tensor回购在这个方法正在使用。 – bartgras