【问题标题】:Keras Functional API: "Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (X, Y)"Keras 功能 API:“检查输入时出错:预期 input_1 有 4 个维度,但得到了形状为 (X, Y) 的数组”
【发布时间】:2020-02-25 15:26:56
【问题描述】:

我正在尝试使用 Keras 的拟合生成器来拟合 ConvNet 模型,但是在尝试将数据提供给输入层时它失败了。它告诉我它期待一个三维输入,但我的输入只有两个。如果我在我的输入形状中添加一个通道,它会要求四个维度。

这是我不添加通道参数时的确切错误:

ValueError: Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (1000, 597)

当我将输入形状更改为 (1000, 597, 1) 时:

ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (1000, 597)

这是我的模型的代码:

def initialise_model():
    input_layer = Input((1, 1000, 597))
    conv_layer_1 = Conv2D(filters=30, kernel_size=(10, 1), strides=(1, 1), padding="same", activation="relu")(input_layer)
    conv_layer_2 = Conv2D(filters=30, kernel_size=(8, 1), strides=(8, 1), padding="same", activation="relu")(conv_layer_1)
    conv_layer_3 = Conv2D(filters=40, kernel_size=(6, 1), strides=(6, 1), padding="same", activation="relu")(conv_layer_2)
    conv_layer_4 = Conv2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_3)
    conv_layer_5 = Conv2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_4)
    flatten_layer = Flatten()(conv_layer_5)
    dense_layer = Dense(1024, activation="relu")(flatten_layer)
    label_layer = Dense(1024, activation="relu")(dense_layer)
    output_layer = Dense(1, activation="linear")(label_layer)

    model = Model(inputs=input_layer, outputs=output_layer)

    adam_optimiser = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
    model.compile(optimizer=adam_optimiser, loss="mean_squared_error", metrics=["accuracy", "mean_squared_error"])
    return model

还有我的健康生成器:

model = initialise_model()
early_stopping = EarlyStopping(monitor="val_loss", min_delta=0, patience=0, verbose=1, restore_best_weights=True)
model.fit_generator(generator, epochs=1, steps_per_epoch=1, verbose=2, callbacks=[early_stopping])

值得注意的是,我的生成器的输出符合预期,形状正确。

非常感谢

【问题讨论】:

  • 你的目标形状是什么?
  • 请提供完整的错误
  • 请提供生成器代码,为什么需要重塑层??
  • @IoannisNasios 卷积网络的目标形状是 (1000, 1)
  • @Mukul 正如其他人指出的那样,重塑是我的一个错误,它已从示例代码中删除

标签: python machine-learning keras deep-learning conv-neural-network


【解决方案1】:

查看 Keras documentation 的卷积层。对于 2D 卷积,输入形状应为 (batch, channels, rows, cols)。这意味着您需要将(channels, rows, cols) 传递给您的Input 层。据我所知,实际上不需要重塑层。

您的图片尺寸是多少?我假设你想传递图像,因为你使用 2D 卷积,但它看起来更像是你试图传递向量。

您的损失是 MSE,这很好,但您的指标是准确性。为什么?

【讨论】:

  • 已更改我的代码以反映您建议的更改,但我仍然收到相同的错误。不过,我会更新我的问题中的代码!我正在使用生成器来生成滑动窗口,这就是我使用 2D 卷积的原因。
【解决方案2】:

将我们的输入层设置为

input_layer = Input((1, 1000, 597))

或者如果频道设置为最后一个

input_layer = Input((1000, 597, 1))

并确保您的生成器生成 x_train 形状的数据

(batch_size, 1, 1000, 597)

(batch_size, 1000, 597, 1)

【讨论】:

    【解决方案3】:

    conv2D 层默认有 data_format = "channels_last" 如果你想使用形状为 (1, 1000, 597) 的图像,那么你必须设置 data_format = "channels_first" 或将输入的暗淡更改为 (1000, 597, 1)

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 2020-06-25
      • 2021-07-25
      • 2021-12-03
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多