LSTM 序列模型问题 re: ValueError: non-broadcastable output operand with shape doesn't match broadcast shape

数据挖掘 机器学习 神经网络 喀拉斯 张量流 lstm
2022-02-23 08:40:59

这可能是一个非常简单的问题,但我无法找到直接解决这个问题的资源。我知道我一定理解错了;我不太确定怎么做。

我注意到,如果我的 LSTM 序列模型的最后一个密集输出层中的单元数不等于特征数(列),我会收到错误消息。

如果您想在输出(密集)层中输出 1 个要素,并且您有多个输入要素,您将如何:

  1. 做到这一点没有错误
  2. 确定正在输出哪个功能,或者 Keras 是否为每个功能提供输出,而您必须确定您想要哪个?

我想训练具有多个特征的模型,但我只对一个特征的预测感兴趣。

示例:我有“打开”、“低”、“高”、“关闭”和“体积”列(5 个特征)的数据。如果我将最后一个密集层中的单元数设置为 5 以外的任何值,我会收到一个广播错误,告诉我模型中的形状不一致。如果我在最后一个 Dense 输出层中放置 5 个单元,则不会出现错误。

例子:

def create_model(self, epochs, batch_size):
      
    model = Sequential()

    # Adding the first LSTM layer and some Dropout regularisation
    model.add(LSTM(units=128, return_sequences=True,
                   batch_size=batch_size, input_shape=(TIME_STEP, self.X_train.shape[2])))

    # Adding a second LSTM layer and some Dropout regularisation
    model.add(LSTM(units=128, return_sequences=True))
    model.add(Dropout(DROPOUT))

    # Adding a third LSTM layer and some Dropout regularisation
    model.add(LSTM(units=128, return_sequences=True))
    model.add(Dropout(DROPOUT))

    # Adding a fourth LSTM layer and some Dropout regularisation
    model.add(LSTM(units=128, return_sequences=False))
    model.add(Dropout(DROPOUT))

    # Adding the output layer
    model.add(Dense(units=5))
    model.summary()

    # compile model
    adam = optimizers.Adam(lr=LR)
    model.compile(optimizer=adam, loss='mae')
    model.fit(self.X_train, self.y_train, epochs=EPOCHS, batch_size=BATCH_SIZE)

如果我在密集层中输入“units=1”,我会收到以下错误:

ValueError:形状 (11784,1) 的不可广播输出操作数与广播形状 (11784,5) 不匹配

1个回答

最终密集层的单位应等于 y_train 中的特征数。假设您的 y_train 的形状为 (11784,5),则密集层的单位应为 5,或者如果 y_train 的形状为 (11784,1),则单位应为 1。模型期望最终密集层的单位等于输出特征的数量。

您必须确定输入和输出中需要哪些功能。'open'、'low'、'high'、'close' 和 'volume' - 这些是你的特征。你想预测什么?这是分类问题还是回归问题?你的问题陈述是什么?基于这些,确定您的输入和输出特征。将输入特征放在 x_train 中,将输出特征放在 y_train 中。现在,在最后的密集层中,您应该使用等于 y_train 中特征数量的单位。