Keras LSTM输入维度设置

20

我试图使用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) - Andre Holzner
@AndreHolzner 我曾经尝试将input_shape设置为(10000, 20),但是没有成功。错误信息是ValueError: 检查输入时出错:预期lstm_28_input有3个维度,但得到的数组形状为(10000, 20)。 - Mr.cysl
尝试设置input_shape=(None, 20, 1)并将输入大小调整为(10000,20,1)。例如,如果您的输入存储在numpy数组中,请使用numpy.resize函数进行调整。 - Andre Holzner
2
@AndreHolzner 刚试了一下。得到了一个大小为(10000,20,1)的训练 np.array。然而,仍然出现维度不匹配的错误。我随后将输入大小更改为(20,1),现在它可以工作了! - Mr.cysl
1个回答

45

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

首先,像Keras中的所有层一样,LSTM接受两个参数: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)))

16
亲爱的先生,我向您表达深深的爱意。 - Alex Parakhnevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接