Keras LSTM 输入维度设置

Posted

技术标签:

【中文标题】Keras LSTM 输入维度设置【英文标题】:Keras LSTM input dimension setting 【发布时间】:2018-06-16 21:10:52 【问题描述】:

我正在尝试使用 keras 训练 LSTM 模型,但我认为我这里出了点问题。

我得到一个错误

ValueError:检查输入时出错:预期 lstm_17_input 有 3维,但得到了形状为(10000, 0, 20)的数组

虽然我的代码看起来像

model = Sequential()
model.add(LSTM(256, activation="relu", dropout=0.25, recurrent_dropout=0.25, input_shape=(None, 20, 64)))
model.add(Dense(1, activation="sigmoid"))
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          metrics=['accuracy'])
model.fit(X_train, y_train,
      batch_size=batch_size,
      epochs=10)

其中X_train 的形状为(10000, 20),前几个数据点类似于

array([[ 0,  0,  0, ..., 40, 40,  9],
   [ 0,  0,  0, ..., 33, 20, 51],
   [ 0,  0,  0, ..., 54, 54, 50],
...

y_train 的形状为(10000, ),这是一个二进制 (0/1) 标签数组。

有人能指出我在哪里错了吗?

【问题讨论】:

你说input_shape=(None, 20, 64) 但你的输入只有两个维度(10000, 20) ? @AndreHolzner 我曾经尝试设置 input_shape = (10000, 20),但没有运气。错误是 ValueError: Error when checks input: expected lstm_28_input to have 3 dimensions, but got array with shape (10000, 20) 尝试设置input_shape=(None, 20, 1) 并将输入大小调整为(10000,20,1)。例如。如果您的输入在 numpy 数组中,请使用 numpy.resize。 @AndreHolzner 刚试过。得到一个大小为 (10000, 20, 1) 的训练 np.array。但是,仍然有一个错误说尺寸不匹配。然后我将输入大小更改为 (20, 1),它现在可以工作了! 【参考方案1】:

为了完整起见,这就是发生的事情。

首先,LSTM 与 Keras 中的所有层一样,接受两个参数:input_shapebatch_input_shape。区别在于约定input_shape不包含批量大小,而batch_input_shape包含批量大小的完整输入形状

因此,规范 input_shape=(None, 20, 64) 告诉 keras 期望 4 维输入,这不是您想要的。正确的应该是(20,)

但这还不是全部。 LSTM 层是一个循环层,因此它需要一个 3 维输入(batch_size, timesteps, input_dim)。这就是为什么正确的规范是input_shape=(20, 1)batch_input_shape=(10000, 20, 1)。另外,你的训练数组也应该被重新塑造,以表示它有20时间步和1每一步的输入特征。

因此,解决方案:

X_train = np.expand_dims(X_train, 2)  # makes it (10000,20,1)
...
model = Sequential()
model.add(LSTM(..., input_shape=(20, 1)))

【讨论】:

亲爱的先生,我送你很多爱。

以上是关于Keras LSTM 输入维度设置的主要内容,如果未能解决你的问题,请参考以下文章

当我给它2时,Keras LSTM需要3个维度,而当我给它3时,它需要4个维度

Keras 嵌入层 - ValueError:检查输入时出错:预期有 2 个维度,但得到了 (39978, 20, 20)

理解 LSTM 中的输入和输出形状 | tf.keras.layers.LSTM(以及对于return_sequences的解释)

Keras LSTM 多维输入

ValueError:检查输入时出错:预期 lstm_1_input 具有 3 个维度,但得到的数组具有形状 (393613, 50)

将 gridsearchCV 与 Keras RNN-LSTM 一起使用时出现尺寸错误