我正在通过github (link)上的LSTM语言模型示例进行研究。对我来说,它的一般功能非常清楚。但是我仍在努力理解调用的contiguous()
作用,这在代码中多次发生。
例如,在代码的第74/75行中,创建了LSTM的输入和目标序列。数据(存储在中ids
)为二维,其中第一维为批处理大小。
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
举一个简单的例子,当使用批处理大小1和seq_length
10时inputs
,targets
如下所示:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
因此,总的来说,我的问题是,contiguous()
我需要什么,为什么需要它?
此外,我不明白为什么要针对目标序列而不是针对输入序列调用此方法,因为两个变量都包含相同的数据。
怎么可能targets
不连续并且inputs
仍然连续?
编辑:
我试图省略调用contiguous()
,但这在计算损失时会导致错误消息。
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
因此,显然contiguous()
必须在此示例中进行调用。
(为了保持可读性,我避免在此处发布完整的代码,可以使用上面的GitHub链接找到它。)
提前致谢!
tldr; to the point summary
一个简洁的要点摘要。