LSTM在CNN之上

时间:2016-06-10 12:33:47

标签: lua neural-network torch conv-neural-network lstm

我在火炬中有以下lstm模型实现,我从这里开始: https://github.com/wojzaremba/lstm/blob/master/main.lua

我对以下代码有疑问:

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?

1 个答案:

答案 0 :(得分:0)

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