【发布时间】:2018-08-01 14:50:39
【问题描述】:
我在 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() 是必要的。
【问题讨论】:
-
什么情况下我们确实需要致电
contiguous?
标签: python memory pytorch contiguous