割炬将不同尺寸的张量插入表格中

时间:2017-05-03 05:07:50

标签: lua lua-table torch

我试图将不同尺寸的张量插入到lua表中。但插入是将最后一个张量写入表中的所有先前元素。

MWE:

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)
--This works fine
print(c)

charFeatures = {}
for i=1,3 do
  charFeatures[i] =  charRep:forward(c[i])
  --table.insert(charFeatures, charRep:forward(c[i]))
  -- No difference when table.insert is used
end
--This fails
print(charFeatures)

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

1 个答案:

答案 0 :(得分:0)

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

请注意,此行为与您执行

时的行为相同
a = torch.Tensor(5):zero()
b = a
a[1] = 0
-- then b is also modified

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

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

一切都会按预期工作!