我正在构建一个序列到序列的莎士比亚预测器,并查看它似乎以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 回答
如果您有
1000 chars
并且如果您创建20 sets
的50 chars
,那将成为一个不重叠的窗口,正如您所说,它将无法正常工作 . 相反,您可以通过移动一个字符来考虑重叠窗口并创建(1000-50) sets
的训练数据 . 这是正确的方法 .