【问题标题】:Why keras LSTM layer requires input shape?为什么keras LSTM层需要输入形状?
【发布时间】:2017-03-10 15:24:11
【问题描述】:

我正在尝试在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_shapebatch_input_shape 参数。

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

如何让我的代码工作?

【问题讨论】:

  • 你能打印出X.shape吗?
  • @MarcinMożejko (5,)
  • 你能打印出来吗? (我的意思是X
  • @MarcinMożejko 数组([[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]], dtype=object)
  • 您需要使每个列表具有相同的长度。 Keras 不接受不同长度的序列。

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


【解决方案1】:

所以你的错误来自于你需要一些如何为你的模型指定输入形状的事实。在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'

【讨论】:

  • 谢谢。有用。如何使用预测方法?当我写 model.predict(X[0]) 时,我得到: ValueError: Error when checks : expected embedding_input_1 to have shape (None, 8) but got array with shape (8, 1)
  • 试试model.predict(X[:1])。请记住,您必须在预测期间为您的模型提供一个完整的矩阵。
  • 为什么不使用遮罩? :) 嵌入和 LSTM 一个接一个地使用它可以正常工作。
  • 它有效!我看到嵌入层需要词汇大小。在真实的应用程序中会有来自 word2vec 的浮点数组,例如不仅是 1 和 2,还有 0 和 1 之间的任何实数。这种情况下如何设置词汇量?
  • @NassimBen - 是的 - 掩蔽可以正常工作。但我不想让我的答案更加复杂。万一 - 当你有嵌入 - 然后你可以砍掉 Embedding 层并将向量直接提供给 LSTM 层。
猜你喜欢
  • 2018-02-27
  • 2020-11-27
  • 2019-01-22
  • 2019-01-20
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多