【问题标题】:Torch Insert tensors of different dimension into a tableTorch 将不同维度的张量插入表格
【发布时间】:2017-09-30 18:44:08
【问题描述】:

我正在尝试将不同维度的张量插入到 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 元素。

【问题讨论】:

    标签: lua lua-table torch


    【解决方案1】:

    这个问题与表格无关,但在 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()
    

    一切都会按预期工作!

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2021-10-07
      • 2020-02-11
      • 2016-05-02
      • 2015-09-20
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多