为什么keras LSTM层需要输入形状?

时间:2017-03-10 15:24:12

标签: neural-network keras recurrent-neural-network keras-layer

我正在尝试在RNN中创建简单的keras,以便了解这个数据集:

X = np.array([[1, 1, 1, 1, 1, 1], [1, 1, 1], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2]])
y = np.array([[1], [1], [0], [1], [0]])

其中1s数组为1,2s数组为0

这是我的代码:

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LSTM
from keras.optimizers import RMSprop
import numpy as np

X = np.array([[1, 1, 1, 1, 1, 1], [1, 1, 1], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2]])
y = np.array([[1], [1], [0], [1], [0]])

print('Build model...')
model = Sequential()
model.add(LSTM(128))
model.add(Dense(1))
model.add(Activation('softmax'))

optimizer = RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)

但是我收到了错误:

  

ValueError:Sequential模型中的第一层必须得到一个   input_shapebatch_input_shape参数。

为什么LSTM图层应该有输入形状?据我所知,理论上可以有不同的输入形状,因为这是递归神经网络。

如何让我的代码工作?

1 个答案:

答案 0 :(得分:2)

因此,您的错误来自于您需要如何指定模型的输入形状。在Sequential案例中,您通常会在第一层设置input_shape

现在 - 问题出在您的输入中。随着

X = [[1, 1, 1, 1, 1, 1], [1, 1, 1], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2]]
Y = [[1], [1], [0], [1], [0]]

您将遇到问题,因为每个序列应具有相同的长度。我建议你做的是使用pad_sequences

from keras.preprocessing.sequence import pad_sequences

X = pad_sequences(X)
Y = numpy.array(Y)

现在 - 如您所述 - 您的任务是MLP任务,因此最好使用Embedding图层:

from keras.layers import Embedding

vocabulary_size = 2 + 1 # Maximal word index + 1
sequence_length = 8 # Maximal length of a sequence
embedding_dimension = 20 # You could choose a different one

model = Sequential()
model.add(Embedding(vocabulary_size, embedding_dimension, input_length=sequence_length)
model.add(LSTM(128))
model.add(Dense(1))
model.add(Activation('sigmoid'))

optimizer = RMSprop(lr=0.01)
model.compile(loss='binary_crossentropy', optimizer=optimizer)

我将activation更改为'sigmoid' beacuse 'softmax'无法使用1-d输出。因此,我将损失更改为'binary_crossentropy'