Tf.contrib.training.bucket_by_sequence_length 相关问题请教

(_, outputs) = tf.contrib.training.bucket_by_sequence_length (
            max_example_length,
            examples,
            batch_sizes,
            [b + 1 for b in boundaries],
            capacity=2,  # Number of full batches to store, we don't need many.
            bucket_capacities=bucket_capacities,
            dynamic_pad=True,
            keep_input=(max_example_length <= max_length)
        )

最近我在看一个 Tensorflow 写的 NLP 相关的代码,在处理数据的时候,我碰到了一个问题。如上面所示,我 google 了很多,但是还是不了解这个函数的输出到底是什么。
下面我给出所有的参数:
max_example_length: 256
examples: 输入数据
batch_sizes: [512, 409, 341, 292, 256, 204, 170, 146, 128, 102, 85, 73, 64, 51, 42, 36, 32, 25, 21, 18, 16]
boundaries: [8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224]
bucket_capacities:[1024, 818, 682, 584, 512, 408, 340, 292, 256, 204, 170, 146, 128, 102, 84, 72, 64, 50, 42, 36, 32]
keep_input=True

这个函数的功能大致是:

  1. 将输入的句子先按照句子长度 boundaries 进行分割,然后分配到 bucket 中
  2. 然后再根据 batch_sizes 构成 batch

问题:我不明白的是,bucket_capacities 的作用是什么,难道是控制每一个 bucket 里面句子的个数?这样子的话,假设每一个长度的句子的数量都是足够多,那么是不是每一个 bucket 里面都只能是 2* batch_size 个句子,那么,每一个 bucket 只能产生 2 个 batch 的数据?所有的 batch 用完之后,再重新进行分配?
从代码的运行结果来看,很明显不是,因为比如说 [102] 这个长度的 batch 就出现了很多次,不止 2 次。

请教各位大佬!
这样子的函数出来的 batch 到底是什么样子的?


梦却是昨天 2018-6-16 15:59:49

参考定义


neverchange 发表于 2018-7-4 12:06:48

def bucket_by_sequence_length (element_length_func,
bucket_boundaries,
bucket_batch_sizes,
padded_shapes=None,
padding_values=None,
pad_to_bucket_boundary=False):
“”"A transformation that buckets elements in a Dataset by length.


kdongyi 发表于 2018-7-7 10:56:03