为什么 keras LSTM 层需要输入形状?
Why keras LSTM layer requires input shape?
我正在尝试在 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: The first layer in a Sequential model must get an
input_shape
or batch_input_shape
argument.
为什么LSTM
层应该有输入形状?据我所知,理论上,可以有不同的输入形状,因为这是递归神经网络。
如何让我的代码工作?
所以你的错误来自于你需要一些如何为你的模型指定输入形状的事实。在 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'
因为 'softmax'
不适用于 1-d
输出。因此,我将 loss 更改为 'binary_crossentropy'
.
我正在尝试在 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: The first layer in a Sequential model must get an
input_shape
orbatch_input_shape
argument.
为什么LSTM
层应该有输入形状?据我所知,理论上,可以有不同的输入形状,因为这是递归神经网络。
如何让我的代码工作?
所以你的错误来自于你需要一些如何为你的模型指定输入形状的事实。在 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'
因为 'softmax'
不适用于 1-d
输出。因此,我将 loss 更改为 'binary_crossentropy'
.