2017-05-03 2 views
0

J'essaie d'insérer des tenseurs de différentes dimensions dans une table lua. Mais l'insertion écrit le dernier tenseur à tous les éléments précédents de la table.Torche Insérer des tenseurs de différentes dimensions dans une 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) 

Peut-être que je n'ai pas compris comment les tables fonctionnent en Lua. Mais ce code copie le dernier tenseur à tous les éléments précédents charFeatures.

Répondre

0

Le problème n'est pas lié aux tables, mais il est très courant dans Torch. Lorsque vous appelez la méthode forward sur un réseau de neurones, sa valeur d'état output est modifiée. Maintenant, lorsque vous enregistrez cette valeur dans charFeatures[i] vous créez réellement une référence de charFeatures[i] à charRep.output. Ensuite, dans la prochaine itération de la boucle charRep.output est modifiée et par conséquent tous les éléments de charFeatures sont modifiés aussi, car ils pointent vers la même valeur qui est charRep.output.

Notez que ce comportement est le même que lorsque vous faites

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

Enfin, pour résoudre votre problème, vous devez cloner la sortie du réseau:

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

Et tout fonctionnera comme prévu!

+0

Merci. Cela fonctionne comme prévu :) –