【发布时间】:2018-12-02 23:31:58
【问题描述】:
我正在使用 Tensorflow 数据集 API 来获取一堆文件名;打乱文件名;执行 python 函数来加载图像文件,对其进行预处理,并将它们转换为张量;然后缓存、重复和批处理它们。到目前为止,一切顺利。
当我向张量添加 shuffle() 时,性能会下降 9 倍。同样,当我做self.dataset.apply(tf.data.experimental.shuffle_and_repeat(16384)).
为什么shuffle 会严重影响性能,我该如何解决?
代码:
filenames = tf.data.Dataset.list_files(self.FILE_PATTERN).shuffle(buffer_size=16384)
dataset = filenames.map(lambda filename: self.pp(filename),
num_parallel_calls=self.N_CPUS)
dataset = dataset.cache("./cachefile")
# The line below (shuffle_and_repeat) made performance very bad (1s/step without, 9s/step with)
# dataset = dataset.apply(tf.data.experimental.shuffle_and_repeat(16384))
# This too:
# dataset = dataset.repeat().shuffle(16384)
# This works fine, but doesn't shuffle:
dataset = dataset.repeat()
dataset = dataset.batch(self.BATCH_SIZE)
dataset = dataset.prefetch(4)
【问题讨论】:
-
既然你已经洗过一次了,有什么特别的理由要再次洗牌吗?
-
对于 SGD,我希望它在每个时期都洗牌;也就是说,在
repeat之后洗牌。 -
我认为问题可能是缓存将数据溢出到磁盘而不是内存中。所以它可能会读取缓存文件并将其再次加载到内存中,然后随机播放并重复?您是否尝试过洗牌然后重复而不是重复然后洗牌,尽管融合的操作应该做同样的事情?
-
您好,这个有答案吗?我在这里遇到了同样的问题。
标签: python performance tensorflow tensorflow-datasets