2017-11-21 1 views
0

Ich bin ein Neuling mit Lua/Torch. Ich habe ein vorhandenes Modell, das eine maximale Pooling-Ebene enthält. Ich möchte die Eingabe in diese Ebene übernehmen und sie in Blöcke aufteilen, wobei jeder Block in eine neue Max-Pooling-Ebene gespeist wird.In Torch/Lua kann ich Tensoren teilen/anzeigen, wenn sie durch ein Netzwerk fließen?

Ich habe ein eigenständiges Lua-Skript geschrieben, das einen Tensor in zwei Chunks aufteilen und die zwei Chunks in ein Netzwerk mit zwei Max-Pooling-Layern weiterleiten kann.

Aber versuchen, das zurück in das bestehende Modell zu integrieren Ich kann nicht herausfinden, wie man die Daten "Mid-Flow", sozusagen, um die Tensor-Split zu tun. Ich habe die Dokumente gelesen und kann keine Funktion oder ein Beispiel für Architektur erkennen, die irgendwo entlang der Linie einen Tensor in zwei teilt und jeden Teil einzeln weiterleitet.

Irgendwelche Ideen? Vielen Dank!

Antwort

0

Sie möchten selbst eine Ebene definieren. Die Schicht wie unten sein wird, wenn Sie Ihre Schicht Eingabe einer Dimension ist:

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 

Wie es zu benutzen? Sie müssen die erste Chunk-Größe wie den folgenden Code angeben.

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

können Sie runnable iTorch Notebook Code here

sehen
Verwandte Themen