Torch 将不同维度的张量插入 table
Torch Insert tensors of different dimension into a table
我正在尝试将不同维度的张量插入 lua table。但是插入是将最后一个张量写入 table.
中的所有先前元素
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)
也许我还不明白 table 在 Lua 中是如何工作的。但是此代码将最后一个张量复制到所有先前的 charFeatures
个元素。
这个问题与表格无关,但在 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()
一切都会按预期工作!
我正在尝试将不同维度的张量插入 lua table。但是插入是将最后一个张量写入 table.
中的所有先前元素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)
也许我还不明白 table 在 Lua 中是如何工作的。但是此代码将最后一个张量复制到所有先前的 charFeatures
个元素。
这个问题与表格无关,但在 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()
一切都会按预期工作!