【问题标题】:ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 32, 24, 7)ValueError: 层 lstm 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无、32、24、7)
【发布时间】:2021-10-08 09:44:32
【问题描述】:

我仍在研究如何解决此错误... 因为我必须将我的第一层输入形状固定为 input_shape=(BATCH_SIZE, N_PAST, N_FEATURES) 我收到有关 LSTM 和 GRU 的任何错误的错误

    model = tf.keras.models.Sequential([
        tf.keras.layers.LSTM(64, return_sequences=True, input_shape=(BATCH_SIZE,N_PAST, N_FEATURES)),
        tf.keras.layers.Dense(N_FEATURES)
    ])

    model.summary()

    optimizer =  tf.keras.optimizers.SGD(lr=1e-8, momentum=0.9)
    model.compile(
        loss="mse",
        optimizer=optimizer,
        metrics=["mae"]
    )
    model.fit(
        train_set, validation_data=valid_set,validation_steps=100, epochs=100
    )

【问题讨论】:

  • 您不应在输入形状中包含 batch_size。
  • 这是一道测试题。它在 cmets 中有这样的语句:~~“无论你的第一层是什么,输入形状都将是 (BATCH_SIZE, N_PAST = 24, N_FEATURES = 7) 模型的输出形状必须是 (BATCH_SIZE, N_FUTURE = 24, N_FEATURES = 7). 确保最后的密集层有 N_FEATURES = 7 个神经元,因为模型预测了 7 个特征。"~~ 我理解错了吗?
  • 实际上批量维度是由模型自动考虑的。您无需指定它。模型本身将使用None 作为第一维添加它。在 input_shape 你只需要指定其他维度。
  • 当我更改 input_shape=(N_PAST, N_FEATURES), tensorflow.python.framework.errors_impl.InvalidArgumentError: 操作需要一个包含 24 个元素的列表但得到一个包含 47 个元素的列表时,我遇到了另一个错误。
  • 显然 tt 预计 N_PAST 为 24,但它得到了 47。

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


【解决方案1】:

从来不需要给模型一个固定的batch_size维度值,tensorflow会根据给定的数据形状动态地处理这个。

所以在模型的构建中:

tf.keras.layers.Dense(7, input_shape=(N_PAST, N_FEATURES), activation='relu')

执行 summary() 时,此层的输入形状应为 (None, N_PAST, N_FEATURES)

【讨论】:

  • 谢谢。现在我的 windowed_dataset 出现问题,因为它给出了错误 tensorflow.python.framework.errors_impl.InvalidArgumentError: Operation expected a list with 24 elements but got a list with 47 elements
【解决方案2】:

您不需要添加 BATCH_SIZE:

input_shape=(N_PAST, N_FEATURES)

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多