Torch 将不同维度的张量插入表中

我试图将不同维度的张量插入到 Lua 表中。但插入操作会将最后一个张量写入到表中前面的所有元素中。

代码示例:

require 'nn';

char = nn.LookupTable(100,10,0,1)
charRep = nn.Sequential():add(char):add(nn.Squeeze())

c = {}
c[1] = torch.IntTensor(5):random(1,100)
c[2] = torch.IntTensor(2):random(1,100)
c[3] = torch.IntTensor(3):random(1,100)
--这部分能够正常执行
print(c)

charFeatures = {}
for i=1,3 do
  charFeatures[i] =  charRep:forward(c[i])
  --table.insert(charFeatures, charRep:forward(c[i]))
  --当使用 table.insert 时没有差别
end
--这部分执行失败
print(charFeatures)

也许我还没有完全理解 Lua 中的表是如何工作的。但此代码将最后一个张量复制到所有先前的 charFeatures 元素中。

点赞
用户3754413
用户3754413

问题与表格无关,但在 Torch 中非常常见。当您在神经网络上调用 forward 方法时,它的状态值 output 将被更改。现在,当您将该值保存到 charFeatures[i] 中时,您实际上在 charFeatures[i]charRep.output 之间创建了一个引用。然后,在循环的下一次迭代中修改 charRep.output,因此所有 charFeatures 元素也会被修改,因为它们指向相同的值,即 charRep.output

请注意,这种行为与您执行以下操作时相同:

a = torch.Tensor(5):zero()
b = a
a[1] = 0
-- 然后 b 也被修改

最后,为解决您的问题,您应该克隆网络的输出:

charFeatures[i] = charRep:forward(c[i]):clone()

然后一切都会按预期工作!

2017-05-03 14:27:59