如何在预训练MobileNetV3搭建的U-net模型顶部添加BN与Dropout额外层?
解决方案
核心逻辑
运行失败的核心原因是两个模型各自定义了独立的输入层,张量计算流没有正确串联。只需要将Model1的输出作为Model2的输入,替换掉Model2原本的独立输入层即可实现堆叠。
完整可运行代码
from tensorflow.keras.layers import Input, Conv2DTranspose, Concatenate, Conv2D, BatchNormalization, Dropout from tensorflow.keras.applications import MobileNetV3Large from tensorflow.keras.models import Model # 第一步:定义Model1 input_shape = (256,256,3) inputs = Input(input_shape) x = BatchNormalization()(inputs) x = Dropout(0.5)(x) model1 = Model(inputs, x) # 第二步:定义Model2,输入直接使用Model1的输出,不再新建独立Input层 mobilenet = MobileNetV3Large(include_top=False, weights="imagenet", input_tensor=model1.output) mobilenet.layers[89]._name = "relu_3" mobilenet.layers[196]._name = "relu_4" l4 = mobilenet.get_layer("relu_3").output b_layer = mobilenet.get_layer("relu_4").output up = Conv2DTranspose(256, (2, 2), strides=2, padding="same")(b_layer) up = Concatenate()([up, l4]) conv = Conv2D(256, (3, 3), activation='relu', padding="same")(up) conv = Conv2D(256, (3, 3), activation='relu', padding="same")(conv) outputs = Conv2D(1, 1, padding="same", activation="sigmoid")(conv) # 第三步:串联两个模型,指定整体输入为Model1的输入,输出为Model2的输出 combined_model = Model(inputs=model1.input, outputs=outputs) combined_model.summary()
注意事项
- 如果你已经提前训练好了Model2的权重,加载权重时需要跳过输入层相关的参数,避免形状不匹配报错
- MobileNetV3的预训练权重是基于ImageNet的归一化输入分布训练的,新增的BatchNormalization层初始阶段建议设置较小的学习率,避免破坏预训练特征的分布
- 推理阶段Dropout层会自动关闭,不需要额外手动调整
内容的提问来源于stack exchange,提问作者MSI
相关产品推荐
相关产品推荐

