我有一个CNN-LSTM模型,其中CNN模型将具有形状(None, 301,4,1)的输入数据作为输入数据,并输出具有形状(None, 606)的数据。为了使 cnn 输出适应LSTM的输入,我添加了一个 TimeDistributed 层,它在每个窗口大小 = 100 时调用 CNN 模型,因此该层的输入形状 = (None, 100,301,4,1),然后我们有一些堆叠的LSTM层。
这是CNN模型的架构:
这是LSTM模型的架构:
该架构的代码如下:
input_layer1=Input(shape=(301,4,1))
...
merge_layer=Concatenate(axis=1)([global_max_pooling, lambda_14])
cnn_model = Model(inputs= input_layer1, outputs=merge_layer) cnn_model.compile(optimizer=RMSprop(),loss="mean_squared_error",metrics=['mse', 'mae'])
input_lstm = Input(shape=(100,301,4,1))
cnn_output = TimeDistributed(cnn_model)(input_lstm)
...
output_layer=Dense(1,activation="linear")(lstm3)
cnn_lstm_model = Model(inputs= input_lstm, outputs=output_layer)
cnn_lstm_model.compile(optimizer=RMSprop(),loss="mean_squared_error",metrics=['mse', 'mae'])
然后只保存了 cnn_lstm_model 模型。
对于培训,这是我的代码:
batchsize=100
epoch=20
cnn_lstm_model.fit(train_data_force_temp_X,data_Y,
batch_size=batchsize,
epochs=epoch,
verbose=1,
shuffle=True,
validation_data=(test_data_force_temp_X,test_Y),
callbacks=[TensorBoard(log_dir="./CNN_LSTM")])
其中 train_data_force_temp_X.shape = (1960, 301, 4, 1) ,PS:1960 是样本数。
但我有这个问题:
ValueError: Input 0 is in compatible with layer model_1: expected shape=(None, 100, 301, 4, 1), found shape=(None, 301, 4, 1)
我知道将错误的形状传递给 cnn_lstm_model 但我认为它会首先将数据传递给具有 shape=(None, 301, 4, 1) 的 cnn 模型,然后对于每 100 个 CNN 输出,它会调用时间分布式层并继续该过程,看来我没有正确理解该过程。
所以我的问题是:
我是否必须先将数据运行到 cnn 模型中,进行预测,然后将这些输出用作 cnn_lstm 模型的输入?
如何修复培训过程?
预先感谢您的帮助。