You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Conv1D的信号处理U-Net结构构建及训练故障排查求助

问题描述

尝试用TensorFlow2构建适用于信号处理场景的类U-Net自编码器,模型可正常编译,但查看模型摘要时仅显示2层,执行训练代码时抛出维度不兼容错误:

ValueError: Input 0 of layer "conv1d_77" is incompatible with the layer: expected min_ndim=3, found ndim=2. Full shape received: (None, None)

原模型结构代码

def build_unet(input_shape, n_filters_list = [16, 32]):
    inputs = Input(shape=input_shape)
    print("in", inputs)
    contraction = {}
    for f in n_filters_list:
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
        x = Dropout(0.1)(x)
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(x)
        contraction[f'conv{f}'] = x
        x = MaxPooling1D(pool_size=4,strides=2)(x)
        print("enc", x)
        inputs = x

    c5 = Conv1D(160, 5, activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
    c5 = Dropout(0.2)(c5)
    c5 = Conv1D(160, 5, activation='relu', kernel_initializer='he_normal', padding='same')(c5)
    print("c5",c5)
    inputs = c5
    print(inputs)
    for i,f in zip([0,0],reversed(n_filters_list)):
        x = Conv1DTranspose(f, 4 + i, 2)(inputs)
        print("dec",x)
        x = concatenate([x, contraction[f'conv{f}']])
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(x)
        x = Dropout(0.2)(x)
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(x)
        inputs = x

    outputs = Conv1D(filters=1, kernel_size=3, activation="tanh", padding="same")(inputs)
    print("out",outputs)

    return Model(inputs=inputs, outputs=outputs)

编译与训练代码

model = build_unet(input_shape=(3490,1))
model.compile(optimizer="Adam", loss='mean_squared_error')

history = model.fit(training_generator,
                validation_data=validation_generator,
                epochs=100)
错误原因分析
  1. 模型输入层绑定错误:代码中inputs变量在收缩、扩张路径的循环中被不断覆盖,最终return Model(inputs=inputs, outputs=outputs)里的inputs是扩张路径最后一层的输出,而非最初定义的输入层Input(shape=input_shape)。这导致Keras无法正确追踪完整的数据流,模型摘要异常,训练时输入维度完全不匹配。
  2. 潜在的特征图维度不匹配:扩张路径中Conv1DTranspose未设置padding='same',可能导致输出特征图长度与收缩路径保存的特征图长度不一致,后续concatenate操作会触发维度错误。
修复方案

1. 保存初始输入层

将最初的输入层用独立变量存储,构建Model时使用该变量作为模型输入。

2. 调整Conv1DTranspose参数保证维度匹配

添加padding='same'确保扩张层输出特征图长度与对应收缩层一致,避免拼接时的维度冲突。

修改后的完整代码:

def build_unet(input_shape, n_filters_list = [16, 32]):
    original_inputs = Input(shape=input_shape)  # 保存初始输入层
    inputs = original_inputs
    print("in", inputs)
    contraction = {}
    for f in n_filters_list:
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
        x = Dropout(0.1)(x)
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(x)
        contraction[f'conv{f}'] = x
        x = MaxPooling1D(pool_size=4, strides=2)(x)
        print("enc", x)
        inputs = x

    c5 = Conv1D(160, 5, activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
    c5 = Dropout(0.2)(c5)
    c5 = Conv1D(160, 5, activation='relu', kernel_initializer='he_normal', padding='same')(c5)
    print("c5",c5)
    inputs = c5
    print(inputs)
    for i,f in zip([0,0], reversed(n_filters_list)):
        # 添加padding='same'保证输出长度与收缩层匹配
        x = Conv1DTranspose(f, 4 + i, 2, padding='same')(inputs)
        print("dec",x)
        x = concatenate([x, contraction[f'conv{f}']])
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(x)
        x = Dropout(0.2)(x)
        x = Conv1D(f, 5, activation='relu', kernel_initializer='he_normal', padding='same')(x)
        inputs = x

    outputs = Conv1D(filters=1, kernel_size=3, activation="tanh", padding="same")(inputs)
    print("out",outputs)

    # 使用初始输入层构建完整模型
    return Model(inputs=original_inputs, outputs=outputs)

验证修复效果

  1. 重新编译模型后,执行model.summary()可显示完整的网络层结构。
  2. 训练时输入维度将匹配,不会再抛出ndim=2的错误。若仍存在维度问题,可打印收缩层与扩张层的特征图形状,微调Conv1DTranspose的kernel_size或strides参数确保长度一致。

内容的提问来源于stack exchange,提问作者SorawitC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:50:26