2016-06-10 16 views
2

Ich habe folgende LSTM Modellimplementierung in Fackel, die ich von hier aus nahm: https://github.com/wojzaremba/lstm/blob/master/main.luaLSTM oben auf CNN

Ich habe eine Frage zu folgendem Stück Code:

local function create_network() 
    local x    = nn.Identity()() 
    local y    = nn.Identity()() 
    local prev_s   = nn.Identity()() 
    local i    = {[0] = LookupTable(params.vocab_size, 
                params.rnn_size)(x)} 
    local next_s   = {} 
    local split   = {prev_s:split(2 * params.layers)} 
    for layer_idx = 1, params.layers do 
    local prev_c   = split[2 * layer_idx - 1] 
    local prev_h   = split[2 * layer_idx] 
    local dropped  = nn.Dropout(params.dropout)(i[layer_idx - 1]) 
    local next_c, next_h = lstm(dropped, prev_c, prev_h) 
    table.insert(next_s, next_c) 
    table.insert(next_s, next_h) 
    i[layer_idx] = next_h 
    end 
    local h2y    = nn.Linear(params.rnn_size, params.vocab_size) 
    local dropped   = nn.Dropout(params.dropout)(i[params.layers]) 
    local pred    = nn.LogSoftMax()(h2y(dropped)) 
    local err    = nn.ClassNLLCriterion()({pred, y}) 
    local module   = nn.gModule({x, y, prev_s}, 
             {err, nn.Identity()(next_s)}) 
    module:getParameters():uniform(-params.init_weight, params.init_weight) 
    return transfer_data(module) 
end 

In der Einbettung Teil der lstm Eingabe, der Code verwendet eine LookupTable Schicht bei der Handhabung der Ptb-Datenbank, jetzt frage ich mich, wie man LookupTable verwenden, um andere Einbettung zu anderen Daten zu definieren. Insbesondere ist die Eingabe RGB-Bilder und die Einbettung wird eines der CNN-Modelle sein, beispielsweise AlexNet ohne vollständig verbundene Schichten. (https://gist.github.com/gcr/0bab9929dfee95164a4d)

Es sieht für mich zu unscharf. Gibt es ein besseres Design für diesen Zweck? Wie kann ich LSTM auf dem CNN-Modell erstellen?

Antwort

0

Taschenlampe nn.LookupTable ist einfach doing Tensor index auf seinem Gewicht Tensor. In dem von Ihnen angegebenen Code wird es auch zum Erlernen von Wortvektoren verwendet, da es im nngraph-Modell enthalten ist. Wenn Sie über ein vortrainiertes Modell verfügen, können Sie seine Gewichtungen auf LookupTable festlegen. Dieses Mal sollten Sie es jedoch nicht in den ngraph aufnehmen. Die Dimensionen des Gewichtstensors sollten nIndex sein (z. B. wie viele verschiedene Bilder Sie haben) x nOutput (z. B. die versteckte Größe von LSTM - rnn_size in Ihrem Code). Oder Sie müssen LookupTable überhaupt nicht verwenden, Sie können den Eingabe-Tensor direkt angeben.