HSK*_*HSK 4 python tensorflow tensorflow-datasets
TensorFlow 提供的股票示例使用mapbefore 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)
Run Code Online (Sandbox Code Playgroud)
但是,性能指南页面和GitHub 问题之一表明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))
Run Code Online (Sandbox Code Playgroud)
我想知道这是否会引入任何我可能没想到的问题,而不是 TensorFlow 提供的股票示例。我希望两个代码做同样的事情,但第二个做的更快;在最坏的情况下以相同的速度。
这可能是个案问题。前几天遇到一个问题,调用dataset.shuffle(180000)时我的电脑会死机。原来,如果我在shuffle()之前map(),它会冻结;但是如果我在 shuffle() 之后映射(),它不会。
感觉(至少根据我的经验),在改组时,tensorflow 可能会改组内存中的实际张量,而不是它们的引用(或“指针”)。就我而言,我的文件是具有 112x112 像素和 3 个颜色通道的图像。如果我在 shuffle() 之前 map(),shuffle(180000)将 180000 张量与 112x112x3 数字混洗;但是,如果我在 map() 之前 shuffle(),shuffle(180000)将只随机播放 180000 个张量,每个张量只包含一个短字符串(文件名如“abc-001.jpeg”)。
根据我上面的经验,没有任何并行计算,如果你要 map() 的数据比它们的文件名大得多(通常是这种情况),那么 map() 之前的 shuffle() 应该比 map 快() 在 shuffle() 之前。
在股票的例子中,我认为是因为股票数据的规模比较小。与我的情况下一个张量中的 112x112x3 数字不同,每个股票数据点应该只有 4 个价格(开盘价、收盘价、最高价、最低价)和 1 个时间(年-月-日-小时:分钟:秒)。在这种情况下 shuffle() 数据不会成为问题。
总而言之,我认为在大多数情况下(文件大小 > 文件名大小),在 map() 之前使用 shuffle() 更好。
| 归档时间: |
|
| 查看次数: |
2035 次 |
| 最近记录: |