我正在尝试在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_shape
或batch_input_shape
参数。
为什么LSTM
图层应该有输入形状?据我所知,理论上可以有不同的输入形状,因为这是递归神经网络。
如何让我的代码工作?
答案 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'
。