Keras LSTM输入尺寸设置

Mr.*_*ysl 8 python deep-learning lstm keras tensorflow

我试图用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)
Run Code Online (Sandbox Code Playgroud)

哪里X_train有一个形状,(10000, 20)前几个数据点是这样的

array([[ 0,  0,  0, ..., 40, 40,  9],
   [ 0,  0,  0, ..., 33, 20, 51],
   [ 0,  0,  0, ..., 54, 54, 50],
...
Run Code Online (Sandbox Code Playgroud)

并且y_train具有(10000, )二进制(0/1)标签数组的形状.

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

Max*_*xim 17

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

首先LSTM,像Keras中的所有图层一样,接受两个参数:input_shapebatch_input_shape.所不同的是惯例,input_shape 不包含批量大小,同时batch_input_shape全情投入的形状,包括批量大小.

因此,规范input_shape=(None, 20, 64)告诉keras期望一个4维输入,这不是你想要的.这是正确的(20,).

但那还不是全部.LSTM层是一个循环层,因此它需要一个三维输入(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)))
Run Code Online (Sandbox Code Playgroud)

  • 亲爱的先生,我送你很多爱. (8认同)