2017-05-03 3 views
0

ルアテーブルに異なる次元のテンソルを挿入しようとしています。しかし、挿入は最後のテンソルをテーブルのすべての前の要素に書き込んでいます。トーチ異なる次元のテンソルをテーブルに挿入する

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要素にコピーします。

答えて

0

問題はテーブルに関連していませんが、Torchでは非常に一般的です。ニューラルネットでforwardメソッドを呼び出すと、その状態値outputが変更されます。この値をcharFeatures[i]に保存すると、実際にはcharFeatures[i]からcharRep.outputへの参照が作成されます。次に、ループcharRep.outputの次の反復では、charRep.outputという同じ値を指しているので、charFeaturesのすべての要素も変更されます。予想通り

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

そして、すべてが動作します:あなたが最後にあなたの問題を解決するために

a = torch.Tensor(5):zero() 
b = a 
a[1] = 0 
-- then b is also modified 

を行うときに、ネットワークの出力のクローンを作成する必要があり、この動作は同じであることを

注意!

+0

ありがとうございました。それは期待どおりに動作します:) –

関連する問題