0

我正在尝试构建一个用于对 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)

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

4

1 回答 1

0

由于 Lasagne/Theano 处理张量初始化的方式,您不能简单地指定(None, 1, None, None). 正如您已经发现的那样,您需要给出一个尺寸。事实上,正如在这个例子中看到的那样,LSTMLayers 似乎期望一个 size 的输入(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/

于 2016-03-07T00:02:24.310 回答