【问题标题】:Tensor flow continuous text sequence-to-sequence. Why batch?TensorFlow 连续文本序列到序列。为什么要分批?
【发布时间】:2017-12-28 13:34:40
【问题描述】:

我正在构建一个序列到序列的莎士比亚预测器并查看示例代码,它似乎以 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 新手,所以可能会遗漏一些东西。

【问题讨论】:

  • 如果你有 1000 个字符,如果你创建了 20 个 50 个字符的集合,那将成为一个不重叠的窗口,正如你所说,它不会工作。相反,您可以考虑通过移动一个字符来重叠窗口并创建 (1000-50) 组训练数据。
  • 非常感谢您的评论。这就是我的想法,但我正在查看的原始代码似乎正在这样做,它似乎是莎士比亚生成器的一个流行示例。我已经通过帖子更新以包含代码。谢谢。
  • 维杰,您介意将其发布为答案吗?再次感谢您的帮助。

标签: tensorflow batching rnn sequence-to-sequence


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 2017-09-14
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多