2016-06-10 74 views
2

顶我在火炬下面LSTM模型实现,这是我从这里拿了: https://github.com/wojzaremba/lstm/blob/master/main.luaLSTM在CNN

我有一个关于下面这段代码的问题:

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 

在嵌入部分lstm输入,代码在处理ptb数据库时使用LookupTable层,现在我想知道如何使用LookupTable来定义其他嵌入到不同类型的数据。特别地,输入是RGB图像,并且嵌入将是CNN模型之一,例如没有完全连接层的AlexNet。 (https://gist.github.com/gcr/0bab9929dfee95164a4d

它对我来说看起来太模糊。 有更好的设计为此目的? 如何在CNN模型上创建LSTM?

回答

0

火炬nn.LookupTable简直是doing张量index对其重量张量。在您指定的代码中,它也用于学习单词向量,因为它包含在nngraph模型中。如果您有预先训练好的模型,可以将其权重设置为LookupTable,但是这次不应将其包含在nngraph中。权重张量的维数应该是nIndex(例如,你有多少个不同的图像)xnOutput(例如LSTM隐藏大小 - 代码中的rnn_size)。或者,您根本不必使用LookupTable,您可以直接指定输入张量。