我有一个 CNN-LSTM 模型,其中 CNN 模型将形状为 (None, 301,4,1) 作为输入数据并输出形状为 (None, 606) 的数据。为了使 cnn 输出适应 LSTM 的输入,我添加了一个 TimeDistributed 层,它调用 CNN 模型每个窗口大小=100,因此该层的输入形状=(无, 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:输入 0 与层 model_1 不兼容:预期 shape=(None, 100, 301, 4, 1), 找到 shape=(None, 301, 4, 1)
我知道将错误的形状传递给 cnn_lstm_model 但我认为它会首先将数据传递给具有 shape=(None, 301, 4, 1) 的 cnn 模型,然后对于每 100 个 CNN 输出,它将调用时间分布层,继续这个过程,看来我没有正确理解这个过程。
所以我的问题是:
我是否必须先将数据运行到 cnn 模型中,然后进行预测和 然后将这些输出用作 cnn_lstm 模型的输入?
我该如何修复训练过程?
预先感谢您的帮助。