我在 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
但仍然是连续的?
编辑:
我试图省略 call contiguous()
,但这会在计算损失时导致错误消息。
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
contiguous()
所以显然在这个例子中调用是必要的。