2017-05-03 1 views
0

루아 테이블에 다른 크기의 텐서를 삽입하려고합니다. 그러나 삽입은 테이블의 모든 이전 요소에 마지막 텐서를 쓰는 것입니다.Torch 서로 다른 차원의 텐서를 테이블에 삽입하십시오.

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) 

이 어쩌면 내가 이해하지 않았습니다. 그러나이 코드는 마지막 텐서를 이전의 모든 charFeatures 요소로 복사합니다.

답변

0

문제는 테이블과 관련이 없지만 Torch에서는 매우 일반적입니다. 신경망에서 forward 메서드를 호출하면 상태 값 output이 변경됩니다. 이제이 값을 charFeatures[i]에 저장하면 charFeatures[i]에서 charRep.output까지 참조가 생성됩니다. 그런 다음 루프 charRep.output의 다음 반복에서 수정되며 따라서 charRep.output 인 동일한 값을 가리 키므로 charFeatures의 모든 요소도 수정됩니다. 이 동작은 마지막 문제는 네트워크의 출력을 복제해야 해결하기 위해 당신이

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

을 수행 할 때와 동일한 지

참고 :

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

그리고 예상대로 모두 작동합니다!

+0

감사합니다. 그것은 예상대로 작동합니다 :) –

관련 문제