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_shape
和 batch_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的解释)
ValueError:检查输入时出错:预期 lstm_1_input 具有 3 个维度,但得到的数组具有形状 (393613, 50)