张量流连续文本序列到序列。为何批量?

时间:2017-07-22 14:25:33

标签: tensorflow batching rnn sequence-to-sequence

我正在构建一个序列到序列的莎士比亚预测器并查看示例代码,它似乎以50个字符为一组进行批处理。我有点困惑。如果文本是连续的并且您正在处理50个字符的块,那么这肯定意味着您只根据第50个字符后面的下一个预期字符计算损失,并且模型永远不会在下一个预期的字符上进行训练其他49个字符的字符。换句话说,如果你有1000个字符,20个50个字符,那么它只会被教导预测20个不同的字符。这些批次是不是每个时期都会随机偏移,所以它学会了如何预测其他字符?

这肯定是对的吗?在我的理解中,我在这里错过了什么?

此外,批次是否始终按顺序处理?当状态被推进以代表先前的序列时,这当然很重要。

由于 射线

更新7/24:这是原始代码......

    self.num_batches = int(self.tensor.size / (self.batch_size *
                                               self.seq_length))

    # When the data (tensor) is too small,
    # let's give them a better error message
    if self.num_batches == 0:
        assert False, "Not enough data. Make seq_length and batch_size small."

    self.tensor = self.tensor[:self.num_batches * self.batch_size * self.seq_length]
    xdata = self.tensor
    ydata = np.copy(self.tensor)
    ydata[:-1] = xdata[1:]
    ydata[-1] = xdata[0]
    self.x_batches = np.split(xdata.reshape(self.batch_size, -1),
                              self.num_batches, 1)
    self.y_batches = np.split(ydata.reshape(self.batch_size, -1),
                              self.num_batches, 1)

据我所知,它似乎并不重叠,但我是Python的新手,所以可能会遗漏一些东西。

1 个答案:

答案 0 :(得分:1)

如果您有1000 chars并且20 sets创建了50 chars,则会成为一个不重叠的窗口,正如您所说,它不会起作用。相反,您可以通过移动一个字符来考虑重叠窗口并创建(1000-50) sets个训练数据。这是正确的方法。