由于未定义的输入维度,简单的LSTM失败

时间:2015-11-09 20:30:15

标签: python neural-network lstm lasagne

我正在尝试构建一个LSTM模型来分类ATIS数据集。

从未定义大小为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)

重点是每个句子的大小不同,从而产生不同形状的上下文窗口字嵌入矩阵。我该怎么办?

1 个答案:

答案 0 :(得分:0)

由于Lasagne / Theano处理Tensors初始化的方式,您不能简单地指定Intent。正如您已经发现的那样,您需要给出一个尺寸。实际上,正如this example中所见,LSTMLayers似乎期望输入大小为(None, 1, None, None)

据我了解,您的选择是:

  1. 选择最大序列长度,然后用0#填充批次(或将批次分批分批,批次中的所有句子具有相同的序列长度)
  2. 批量大小为1,然后您可以将序列长度改为当前句子的大小(即您的批次)
  3. 其他一些相关链接:

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