【问题标题】:Simple LSTM failing due undefined input dimension由于未定义的输入维度,简单的 LSTM 失败
【发布时间】:2016-02-10 14:31:08
【问题描述】:

我正在尝试构建一个用于对 ATIS 数据集进行分类的 LSTM 模型。

从一个未定义大小 N 的句子,我生成一个上下文窗口词嵌入矩阵。这就是我需要以我的模型为基础的东西,但我不知道如何做到这一点。

当我将输入层定义为:

def build_lstm(input_var=None):
    l_in = lasagne.layers.InputLayer(shape=(None, 1, None, None), input_var=input_var)
    l_hid = l_lstm = lasagne.layers.LSTMLayer(l_in, num_units=300)
    l_out = lasagne.layers.DenseLayer(l_hid, num_units=127, nonlinearity=lasagne.nonlinearities.softmax)

return l_out

我明白了:

TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

如果我在 l_in 声明中定义输入形状,它会起作用,例如:

l_in = lasagne.layers.InputLayer(shape=(None, 1, 30, 30), input_var=input_var)

关键是每个句子都有不同的大小,从而产生了一个不同形状的上下文窗口词嵌入矩阵。我能做什么?

【问题讨论】:

    标签: python neural-network lstm lasagne


    【解决方案1】:

    由于 Lasagne/Theano 处理张量初始化的方式,您不能简单地指定 (None, 1, None, None)。正如您已经发现的那样,您需要给出一个尺寸。事实上,正如在this example 中看到的那样,LSTMLayers 似乎期望输入大小为(batch size, SEQ_LENGTH, num_features)

    据我了解,您的选择是:

    1. 选择最大序列长度,然后用 0 填充批次(或将批次分批,批次中的所有句子都具有相同的序列长度)
    2. 将批次大小设为 1,然后您可以将序列长度更改为当前句子的大小(即您的批次)

    其他一些相关链接:

    https://groups.google.com/forum/#!msg/lasagne-users/9nMD5VJPLXA/sNzqxON_DwAJ https://www.reddit.com/r/MachineLearning/comments/3dqdqr/keras_lstm_limitations/

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      相关资源
      最近更新 更多