(_, 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
这个函数的功能大致是:
- 将输入的句子先按照句子长度 boundaries 进行分割,然后分配到 bucket 中
- 然后再根据 batch_sizes 构成 batch
问题:我不明白的是,bucket_capacities 的作用是什么,难道是控制每一个 bucket 里面句子的个数?这样子的话,假设每一个长度的句子的数量都是足够多,那么是不是每一个 bucket 里面都只能是 2* batch_size 个句子,那么,每一个 bucket 只能产生 2 个 batch 的数据?所有的 batch 用完之后,再重新进行分配?
从代码的运行结果来看,很明显不是,因为比如说 [102] 这个长度的 batch 就出现了很多次,不止 2 次。
请教各位大佬!
这样子的函数出来的 batch 到底是什么样子的?
梦却是昨天 2018-6-16 15:59:49