2017-11-21 9 views
0

私はLua/Torchの初心者です。私は、最大プール層を含む既存のモデルを持っています。私は入力をそのレイヤーに入れてチャンクに分割し、各チャンクを新しい最大プール・レイヤーに送りたいと思っています。Torch/Luaでは、テンソルがネットワークを流れる際に分割/連結できますか?

テンソルを2つのチャンクに分割し、2つのチャンクを2つのmax-poolingレイヤーを持つネットワークに転送するスタンドアロンのLuaスクリプトを作成しました。

しかし、それを既存のモデルに統合しようとすると、テンソル分割を行うためにデータを「中間フロー」に修正する方法を見つけることができません。私はドキュメントを読んだことがあり、関数の例や、線のどこかでテンソルを2つに分割し、各部分を別々に転送するアーキテクチャの例は見えません。

アイデア?ありがとう!

答えて

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 

それを使用する方法:あなたの層の入力が1次元である場合 層は、以下のようになりますか?以下のコードのような最初のチャンクサイズを指定する必要があります。あなたが実行可能iTorchノートコードhere

を見ることができます

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)}) 

関連する問題