TensorFlow提供的股票示例在map
之前使用shuffle
,例如:
filenames = ["/var/data/file1.tfrecord", "/var/data/file2.tfrecord"]
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(...)
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.batch(32)
但是,performance guide page和one of the GitHub issues出于性能原因建议最好使用map_and_batch
。但是,shuffle
介于两者之间,我不确定该怎么做。看起来甚至在shuffle
和map
做这项工作之前就应用batch
,就像这样:
filenames = ["/var/data/file1.tfrecord", "/var/data/file2.tfrecord"]
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.apply(tf.contrib.data.map_and_batch(..., batch_size=32))
我想知道这是否会引入我可能不会想到的任何问题,而不是TensorFlow提供的示例股票。我希望这两个代码可以做相同的事情,但是第二个代码可以做得更快。在最坏的情况下以同样的速度。
答案 0 :(得分:1)
这可能是个案问题。几天前,我遇到了一个问题my computer will freeze when I call dataset.shuffle(180000)。原来,如果我在shuffle()之前映射(),它将冻结;但是如果我在shuffle()之后映射(),它将不会。
感觉(至少根据我的经验),在改组时,tensorflow可能改组了内存中的实际张量,而不是其引用(或“指针”)。就我而言,我的文件是具有112x112像素和3个颜色通道的图像。如果我在shuffle()之前进行map(),则shuffle(180000)
将以112x112x3的数字对180000张量进行洗牌;但是如果我在map()之前先随机播放(),shuffle(180000)
只会随机播放180000张量,每个张量只包含一个短字符串(文件名如“ abc-001.jpeg”)。
根据我的上述经验,没有任何并行计算,如果要映射的数据的大小比其文件名大得多(通常是这种情况),则在map()之前先随机播放() )应该比shuffle()之前的map()更快。
在股票示例中,我认为这是因为股票数据的规模相对较小。与本例中一个张量中的112x112x3数字不同,每个股票数据点应仅具有4个价格(开盘,收盘,高,低)和1次时间(年-月-日-小时:分钟:秒)。在这种情况下,shuffle()数据不会成为问题。
总而言之,我认为在大多数情况下(文件大小>文件名大小),在map()之前先shuffle()更好。