2017-05-03 1 views
0

Ich versuche, Tensoren verschiedener Dimensionen in eine Lua-Tabelle einzufügen. Aber die Einfügung schreibt den letzten Tensor auf alle vorherigen Elemente in der Tabelle.Torch Setze Tensoren unterschiedlicher Abmessungen in eine Tabelle ein

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) 

Vielleicht habe ich nicht verstanden, wie Tabellen in Lua arbeiten. Aber dieser Code kopiert den letzten Tensor auf alle vorherigen charFeatures Elemente.

Antwort

0

Das Problem bezieht sich nicht auf Tabellen, ist aber bei Torch sehr verbreitet. Wenn Sie die forward Methode auf einem neuronalen Netz aufrufen, wird sein Statuswert output geändert. Wenn Sie jetzt diesen Wert in charFeatures[i] speichern, erstellen Sie tatsächlich eine Referenz von charFeatures[i] bis charRep.output. Dann wird in der nächsten Iteration der Schleife charRep.output modifiziert und folglich werden auch alle Elemente von charFeatures modifiziert, da sie auf denselben Wert zeigen, der charRep.output ist.

Beachten Sie, dass dieses Verhalten ist das gleiche wie wenn Sie das tun

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

Schließlich Ihr Problem lösen Sie die Ausgabe des Netzes klonen sollte: wie erwartet

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

Und das alles funktioniert!

+0

Danke. Es funktioniert wie erwartet :) –

Verwandte Themen