【问题标题】:TensorFlow Dataset: shuffle before map (map_and_batch)?TensorFlow数据集:地图前洗牌(map_and_batch)?
【发布时间】:2019-01-25 08:36:33
【问题描述】:

TensorFlow 提供的股票示例在shuffle 之前使用了map,如下所示:

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 pageone of the GitHub issues 建议出于性能原因最好使用 map_and_batch。但是由于shuffle 介于两者之间,我不太确定在那里做什么。看起来甚至在 mapbatch 完成这项工作之前就应用了 shuffle,如下所示:

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 提供的示例。我希望这两个代码做同样的事情,但第二个代码做得更快;在最坏的情况下以相同的速度。

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

    这可能是一个个案问题。前几天遇到一个问题my computer will freeze when I call dataset.shuffle(180000)。事实证明,如果我在 shuffle() 之前 map(),它会冻结;但是如果我在 shuffle() 之后 map(),它不会。

    感觉就像(至少根据我的经验)在洗牌时,张量流可能正在洗牌内存中的实际张量,而不是它们的参考(或“指针”)。就我而言,我的文件是具有 112x112 像素和 3 个颜色通道的图像。如果我在 shuffle() 之前使用 map(),shuffle(180000) 将用 112x112x3 个数字随机播放 180000 个张量;但是如果我在 map() 之前 shuffle(),shuffle(180000) 将只是 shuffle 180000 个张量,每个张量只包含一个短字符串(文件名如“abc-001.jpeg”)。

    根据我上面的经验,在没有任何并行计算的情况下,如果你要 map() 的数据比它们的文件名大得多(通常是这种情况),那么 shuffle() 在 map( ) 在 shuffle() 之前应该比 map() 快。

    在股票的例子中,我认为是因为股票数据的规模相对较小。在我的例子中,与一个张量中的 112x112x3 数字不同,每个股票数据点应该只有 4 个价格(开盘价、收盘价、最高价、最低价)和 1 个时间(年-月-日-小时:分钟:秒)。在这种情况下 shuffle() 数据不会成为问题。

    总而言之,我认为在大多数情况下(文件大小 > 文件名大小),在 map() 之前使用 shuffle() 会更好。

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2017-12-08
      • 2019-09-11
      • 2019-11-24
      • 2018-03-16
      相关资源
      最近更新 更多