我正在尝试使用 CNN、LSTM 和 MLP 进行时间序列预测。但是当我将 TimeDistributed 与 CNN 一起使用时,它会在拟合过程中给出维度错误

时间:2021-05-10 17:15:20

标签: python tensorflow keras conv-neural-network lstm

我有 9 个特征,一个输出变量,即待预测,窗口大小为 5 代码在没有“TimeDistributed”命令的情况下运行良好

<块引用>

模型输入形状:feature_tensor.shape=(1649, 5, 9) 模型输出 形状:y_train.shape= (1649,)

Thats my Code:
    #Build the network model
    act_fn='relu'
    modelq = Sequential()
    modelq.add(TimeDistributed(Conv1D(filters=105, kernel_size=2, activation=act_fn, input_shape=(None, feature_tensor.shape[1],feature_tensor.shape[2]))))
    modelq.add(TimeDistributed(AveragePooling1D(pool_size=1)))
    modelq.add(TimeDistributed(Flatten()))
    modelq.add(LSTM(50))
    modelq.add(Dense(64, activation=act_fn))
    
    modelq.add(Dense(1))
    
    #Compile the model
    modelq.compile(optimizer='adam', loss='mean_squared_error') 
    modelq.fit(feature_tensor, y_train ,batch_size=1, epochs=epoch_count)

错误声明是: ValueError: 层 conv1d 的输入 0 与层不兼容:预期 min_ndim=3,发现 ndim=2。收到完整形状:(5, 9)

我觉得“模型拟合”期间“feature_tensor”的维度有问题,即最后一个命令......但我不知道它有什么问题:(

1 个答案:

答案 0 :(得分:0)

你的直觉是对的,问题是tensor_feature的维度。如果您查看 TimeDistributed 的文档,您会看到一个包含图像和 Conv2d 层的示例。输入必须具有以下形状:batch_size、时间步长、x_dim、y_dim、通道。由于您使用时间序列,因此您需要:batch_size、时间步长、1、特征。例如。您可以通过 numpy 重塑您的数据:

feature_tensor = np.reshape(feature_tensor, (-1, 5, 1, 9))

但是,我不确定将 Conv1D 与 TimeDistributed 结合使用是否有用,因为在这种情况下,您只对特征应用卷积,而不对应该应用一维卷积的时间连续值应用卷积。