在每个存储桶中聚集不均匀元素进行批处理?

时间:2019-05-09 00:28:48

标签: python tensorflow

单独(我认为),但在概念上与https://www.tensorflow.org/versions/r1.9/api_docs/python/tf/contrib/data/bucket_by_sequence_length?hl=en相关。

常规设置:

我想支持最大程度地使用批处理大小的批处理。

考虑以下情况:

max_batch_elements = 32 训练示例实际上是“元元素”,它由变化的多个批处理元素组成,需要分组在一起。

例如,一个训练示例可能填充5个批处理元素,另一个训练示例可能填充20个,另外6个,依此类推。然后,我们可以将这3个示例进行分组,从而填充(5 + 20 + 6 = 31)个批处理元素- ,当然相当有效(可用31/32)。 (如果我们要100%地提高效率,我们将再等len = 1个批处理元素的示例。)

我想建立一个有效的配料方案。

tf.bucket_by_sequence_length对于低批量计数的项目将是相当有效的:例如,对于1,2,3,...,16的存储桶大小,则存在相当有效的分档。例如,存储桶大小= 5 => 6个示例* 5个批处理元素=已填充30个批处理元素(最多32个)。

但是,随着序列的增加,效率会逐渐降低。例如,对于桶大小17,当然,只有一个示例可以通过(保留15个批处理元素未使用)。

理想情况下,我想设置一个存储桶,其中元素填充存储桶以完成操作:

例如,如果传入的示例是批处理镜头[5、15、6、20、30、1、4,...],那么我们会看到像这样的东西充满了:

Bucket 1: [5, 15, 6, 1, 4] => 32 total => gets sent to GPU for training
Bucket 2: [20]
Bucket 3: [30]
Bucket 4: gets created if necessary, presumably up to some maximum # of buckets, at which point the most-filled bucket gets emptied

(可能将6、1,&4示例放到存储桶2和3中;只要整个算法朝着更好地填充存储桶的方向,随机行为就可以了。)

在tf中上述(合理)可行吗?无论如何,用Python / Java / C ++ /实现都相当简单,但我不清楚如何在TF中实现。 (很可能我缺少一个隐藏的库函数。)

0 个答案:

没有答案