在 CNN 之上的 LSTM

我已经在 Torch 中实现了以下 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

在处理 ptb 数据库的嵌入部分中,代码在处理时使用了 LookupTable 层,现在我想知道如何使用 LookupTable 来定义不同类型数据的其他嵌入。特别是,输入是 RGB 图像,嵌入将是其中一种 CNN 模型,例如没有全连接层的 AlexNet。

对于我来说,它看起来太模糊了。 有没有更好的设计来达到这个目的? 如何创建 CNN 之上的 LSTM 模型?

点赞
用户213123
用户213123

Torch nn.LookupTable 简单来说就是在其权重张量上执行 Tensor 索引。在你指定的代码中,它也用于学习单词向量,因为它包含在 nngraph 模型中。如果你有一个预训练模型,你可以将其权重设置为 LookupTable,但这次你不应该在 nngraph 中包含它。权重张量的维度应该是 nIndex(例如,你有多少个不同的图像)x nOutput(例如,LSTM 隐藏层大小 - 代码中的 rnn_size)。或者,你也可以直接指定输入张量而不使用 LookupTable。

2016-08-05 06:51:28