据我了解,批量允许您通过增加每次迭代为模型提供的数据量来更有效地运行模型。因此,如果您有1000个句子对,则可以选择批量大小为100,因此每次迭代100个随机句子对被提供给模型以供学习。
批量大小控制输入模型的句子数。
同时,水桶允许您设置不同长度的句子。如果一个句子有6个令牌长度输入和6个令牌长度输出(或6个字母,假设每个字母有一个令牌),则可以将其填充到桶大小(10,10)。
Bucket(I / O)大小控制输入/输出句子长度。
以下是基于我的假设(上文)我不理解的内容:
在此代码中,取自Tensorflow教程here,encoder_input
的长度为self.batch_size
(来自函数get_batch
,位于文件seq2seq_model.py
中):
encoder_size, decoder_size = self.buckets[bucket_id]
encoder_inputs, decoder_inputs = [], []
# Get a random batch of encoder and decoder inputs from data,
# pad them if needed, reverse encoder inputs and add GO to decoder.
for _ in xrange(self.batch_size):
encoder_input, decoder_input = random.choice(data[bucket_id])
# Encoder inputs are padded and then reversed.
encoder_pad = [data_utils.PAD_ID] * (encoder_size - len(encoder_input))
encoder_inputs.append(list(reversed(encoder_input + encoder_pad)))
# Decoder inputs get an extra "GO" symbol, and are padded then.
decoder_pad_size = decoder_size - len(decoder_input) - 1
decoder_inputs.append([data_utils.GO_ID] + decoder_input +
[data_utils.PAD_ID] * decoder_pad_size)
然后将 encoder_inputs
转换为批次主要向量,并在不改变其长度的情况下返回。
在函数step
(同一文件)之后,使用以下代码检查encoder_inputs
的长度是否与self.buckets[bucket_id][0]
的输入长度相等。
encoder_size, decoder_size = self.buckets[bucket_id]
if len(encoder_inputs) != encoder_size:
raise ValueError("Encoder length must be equal to the one in bucket,"
" %d != %d." % (len(encoder_inputs), encoder_size))
这是否意味着batch_size必须与存储桶输入大小相同?这怎么可能?通过检查,batch_size为64,同时存在许多不同的桶大小。我错过了什么?