2017-05-03 50 views
0

我試圖將不同維度的張量插入到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是如何工作的。但是這段代碼將最後一個張量複製到所有以前的元素。

回答

0

該問題與表格無關,但在火炬中很常見。當您在神經網絡上調用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() 

和預期都將工作!

+0

謝謝。它按預期工作:) –