gpt4 book ai didi

tensorflow - Dataset.map 、 Dataset.prefetch 和 Dataset.shuffle 中 buffer_size 的含义

转载 作者:行者123 更新时间:2023-12-03 05:25:57 34 4
gpt4 key购买 nike

根据 TensorFlow documentation 、tf.contrib.data.Dataset 类的 prefetchmap 方法,都有一个名为 buffer_size 的参数.

对于 prefetch 方法,参数称为 buffer_size,根据文档:

buffer_size: A tf.int64 scalar tf.Tensor, representing the maximumnumber elements that will be buffered when prefetching.

对于map方法,参数被称为output_buffer_size并且根据文档:

output_buffer_size: (Optional.) A tf.int64 scalar tf.Tensor,representing the maximum number of processed elements that will bebuffered.

shuffle 方法类似,根据文档显示相同的数量:

buffer_size: A tf.int64 scalar tf.Tensor, representing the number ofelements from this dataset from which the new dataset will sample.

这些参数之间有什么关系?

假设我创建一个Dataset对象,如下所示:

 tr_data = TFRecordDataset(trainfilenames)
tr_data = tr_data.map(providefortraining, output_buffer_size=10 * trainbatchsize, num_parallel_calls\
=5)
tr_data = tr_data.shuffle(buffer_size= 100 * trainbatchsize)
tr_data = tr_data.prefetch(buffer_size = 10 * trainbatchsize)
tr_data = tr_data.batch(trainbatchsize)

上面代码片段中的 buffer 参数扮演什么角色?

最佳答案

TL;DR 尽管名称相似,但这些参数的含义却截然不同。 Dataset.shuffle() 中的 buffer_size 会影响数据集的随机性,从而影响元素的生成顺序。 Dataset.prefetch() 中的 buffer_size 仅影响生成下一个元素所需的时间。

<小时/>

tf.data.Dataset.prefetch() 中的 buffer_size 参数以及 tf.contrib.data.Dataset.map() 中的 output_buffer_size 参数提供一种调整输入管道性能的方法:两个参数都告诉 TensorFlow 创建最多包含 buffer_size 元素的缓冲区,以及一个后台线程来填充该缓冲区背景。(请注意,当 Dataset.map()tf.contrib.data 移动到 tf 时,我们从 Dataset.map() 中删除了 output_buffer_size 参数。 data。新代码应在 map() 之后使用 Dataset.prefetch() 以获得相同的行为。)

添加预取缓冲区可以通过将数据预处理与下游计算重叠来提高性能。通常,在管道的最后添加一个小的预取缓冲区(可能只有一个元素)是最有用的,但更复杂的管道可以从额外的预取中受益,特别是当生成单个元素的时间可能变化时。

相比之下,tf.data.Dataset.shuffle()buffer_size 参数影响转换的随机性。我们设计了 Dataset.shuffle() 转换(如它所取代的 tf.train.shuffle_batch() 函数)来处理太大而无法放入内存的数据集。它不会打乱整个数据集,而是维护一个包含 buffer_size 元素的缓冲区,并从该缓冲区中随机选择下一个元素(如果可用,则将其替换为下一个输入元素)。更改 buffer_size 的值会影响洗牌的均匀程度:如果 buffer_size 大于数据集中的元素数量,则会得到均匀的洗牌;否则,您将获得均匀的洗牌。如果它是 1 那么你根本就不会进行洗牌。对于非常大的数据集,典型的“足够好”的方法是在训练之前将数据随机分片成多个文件一次,然后均匀地对文件名进行洗牌,然后使用较小的洗牌缓冲区。但是,适当的选择将取决于您培训工作的确切性质。

<小时/>

关于tensorflow - Dataset.map 、 Dataset.prefetch 和 Dataset.shuffle 中 buffer_size 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46444018/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com