首页 > 解决方案 > 使用双向而不是标准 LSTM 层时的形状错误

问题描述

切换到双向层时,我的代码出错。该模型在使用标准 LSTM 层时有效。我得到的错误是:

File "<ipython-input-22-1e9000cb0bf6>", line 12, in <module>
model.build(input_shape)
ValueError: Input 0 is incompatible with layer bidirectional_11: expected ndim=3, found ndim=2

我的代码如下所示:

input_shape = (lengtharray,1)
model = Sequential()
model.add(Bidirectional(CuDNNLSTM(128, input_shape=input_shape, return_sequences=True)))
model.add(Dropout(0.5))
model.add(Dense(64))
model.add(Bidirectional(CuDNNLSTM(128)))
model.add(Dropout(0.5))
model.add(Dense(64))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.build(input_shape)

opt = keras.optimizers.Adam(lr=0.01, decay=0.0001)
model.compile(loss='binary_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])
callbacks = [EarlyStopping(monitor='val_loss'),
             ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)]
model.summary()

为什么在使用双向而不是标准 LSTM 时会返回形状错误?

标签: pythontensorflowkeras

解决方案


我无法测试您的代码(因为我在移动),但是如果您定义input_shape外部CuDNN但内部,Bidirectional那么它应该可以工作。所以像这样

Bidirectional(CuDNNLSTM(128, return_sequences=True),input_shape=input_shape)

事情是双向的行为类似于 LSTM,所以它需要像这里提到的 LSTM 这样的参数。对于双向示例,您可以遵循


推荐阅读