2017-11-21 26 views
0

저는 루아/토치 초심자입니다. 최대 풀링 레이어가 포함 된 기존 모델이 있습니다. 나는 그 레이어로 입력을 가져 와서 청크로 분할하여 각 청크를 새로운 최대 풀링 레이어에 넣고 싶습니다.Torch/Lua에서 텐서가 네트워크를 통해 흐를 때 쪼개거나 연결시킬 수 있습니까?

나는 텐서를 두 개의 청크로 나눌 수 있고 두 개의 청크를 두 개의 최대 풀링 레이어가있는 네트워크에 전달할 수있는 독립형 루아 스크립트를 작성했습니다.

하지만 다시 기존 모델에 통합하려고하면 "중간 흐름"데이터를 수정하는 방법을 이해할 수 없습니다. 즉, 텐서 분할을 수행하는 것입니다. 필자는 문서를 읽었을 때 어떤 함수 나 예제를 보지 못했습니다. 선의 어딘가에서 텐서를 두 개로 나누고 각 부분을 개별적으로 전달합니다.

아이디어가 있으십니까? 감사!

답변

0

직접 레이어를 정의하고 싶습니다. 당신의 레이어 입력 한 차원 인 경우 레이어는 아래와 같이 될 것입니다 :

CSplit, parent = torch.class('nn.CSplit', 'nn.Module') 

function CSplit:__init(firstCount) 
    self.firstCount = firstCount 
    parent.__init(self) 
end 

function CSplit:updateOutput(input) 
    local inputSize = input:size()[1] 
    local firstCount = self.firstCount 
    local secondCount = inputSize - firstCount 
    local first = torch.Tensor(self.firstCount) 
    local second = torch.Tensor(secondCount) 
    for i=1, inputSize do 
     if i <= firstCount then 
      first[i] = input[i] 
     else 
      second[i - firstCount] = input[i] 
     end 
    end 
    self.output = {first, second} 
    return self.output 
end 

function CSplit:updateGradInput(input, gradOutput)  
    local inputSize = input:size()[1] 
    self.gradInput = torch.Tensor(input) 
    for i=1, inputSize do 
     if i <= self.firstCount then 
      self.gradInput[i] = gradOutput[1][i] 
     else 
      self.gradInput[i] = gradOutput[2][i-self.firstCount] 
     end 
    end 
    return self.gradInput 
end 

는 어떻게 사용 하는가? 아래 코드와 같이 첫 번째 청크 크기를 지정해야합니다.

testNet = nn.CSplit(4) 
input = torch.randn(10) 
output = testNet:forward(input) 
print(input) 
print(output[1]) 
print(output[2]) 
testNet:backward(input, {torch.randn(4), torch.randn(6)}) 

당신이 볼 수있는 실행 가능한 iTorch 노트북 코드 here