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

为什么keras LSTM层需要输入形状?,keras,neural-network,deep-learning,recurrent-neural-network,keras-layer,Keras,Neural Network,Deep Learning,Recurrent Neural Network,Keras Layer,我正在尝试在keras中创建简单的RNN,它将通过此数据集学习: 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.layer

我正在尝试在
keras
中创建简单的
RNN
,它将通过此数据集学习:

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:顺序模型中的第一层必须获得
input\u-shape
batch\u-input\u-shape
参数

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


如何使我的代码工作?

因此,您的错误来自这样一个事实:您需要了解如何为模型指定输入形状。在
Sequential
情况下,通常通过在第一层中设置
input\u 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]]
您将遇到问题,因为每个序列应该具有相同的长度。我建议你做的是使用

现在,正如您所提到的,您的任务是一个
MLP
任务,因此最好使用一个层:


我将
激活
更改为
'sigmoid'
因为
'softmax'
无法使用
1-d
输出。因此,我将损耗改为“二进制交叉熵”

你能打印出
X.shape
?@MarcinMożejko(5,)你能打印出来吗?(我的意思是
X
)@MarcinMożejko数组([[1,1,1,1,1,1,1],[1,1,1,1],[2,2,2,2],[1,1,1,1,1,1],[2,2,2],[1,1,1,1],[2,2],[1,1,1,1],[2,2],[2],dtype=object)您需要使每个列表具有相同的长度。Keras不接受长度不同的序列。谢谢。它起作用了。如何使用预测方法?当我编写model.predict(X[0])时,我得到了:ValueError:检查时出错:预期嵌入\u输入\u 1具有形状(无,8),但得到了具有形状(8,1)的数组Try
model.predict(X[:1])
。请记住,在预测过程中,您必须为模型提供一个完整形状的矩阵。为什么不使用掩蔽?:)嵌入和LSTM一个接一个的使用都很好,很有效!我看到嵌入层需要词汇表大小。在real app中,会有word2vec中的浮点数组,例如,不仅是1和2,还有0和1之间的任何实数。在这种情况下,如何设置词汇量?@NassimBen-yes-masking可以很好地工作。但我不想让我的答案更加复杂。在这种情况下,当您进行嵌入时,您可以切掉
嵌入层
并将向量直接馈送到
LSTM
层。
from keras.preprocessing.sequence import pad_sequences

X = pad_sequences(X)
Y = numpy.array(Y)
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)