0

我有一个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 模型的输入?

  • 如何修复培训过程?

预先感谢您的帮助。

4

0 回答 0