TL; DR尽管名称相似,但这些参数具有完全不同的含义。 Dataset.shuffle()
的buffer_size
可能会影响数据集的随机性,从而影响元素生成的顺序。 Dataset.prefetch()
的buffer_size
仅影响生成下一个元素所需的时间。
该buffer_size
在参数tf.data.Dataset.prefetch()
和output_buffer_size
在参数tf.contrib.data.Dataset.map()
提供了一种方式来调整你的输入管线的性能 :这两个参数告诉TensorFlow创造一个缓冲区最多有buffer_size
元素,还有一个后台线程在后台填充该缓冲区。 (请注意,当output_buffer_size
参数从Dataset.map()
移至tf.contrib.data
时,已将其从Dataset.map()
中tf.data
。新代码应在map()
之后使用Dataset.prefetch()
map()
以获得相同的行为。)
通过将数据的预处理与下游计算重叠,添加预取缓冲区可以提高性能。通常,最有用的是在流水线的末尾添加一个小的预取缓冲区(可能只有一个元素),但是更复杂的流水线可以从附加的预取中受益,尤其是在产生单个元素的时间可以变化的情况下。
相比之下, tf.data.Dataset.shuffle()
的buffer_size
参数会影响转换的随机性 。我们设计了Dataset.shuffle()
转换(例如它替换的tf.train.shuffle_batch()
函数)来处理太大而无法容纳在内存中的数据集。它没有改组整个数据集,而是维护一个buffer_size
元素的缓冲区,并从该缓冲区中随机选择下一个元素(如果可用,将其替换为下一个输入元素)。更改buffer_size
的值会影响混洗的均匀性:如果buffer_size
大于数据集中的元素数量,则会得到均匀的混洗;如果它是1
那么您根本不会洗牌。对于非常大的数据集,典型的“足够好”的方法是在训练之前将数据随机分片到多个文件中,然后均匀地对文件名进行混洗,然后使用较小的混洗缓冲区。但是,适当的选择将取决于培训工作的确切性质。
0
根据TensorFlow 文档 ,
tf.contrib.data.Dataset
类的prefetch
和map
方法都有一个名为buffer_size
的参数。对于
prefetch
方法,根据文档,该参数称为buffer_size
:对于
map
方法,根据文档,该参数称为output_buffer_size
:同样,对于
shuffle
方法,根据文档显示相同的数量:这些参数之间有什么关系?
假设我创建一个
Dataset
对象,如下所示:上面的代码片段中的
buffer
参数起着什么作用?