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

乳腺癌CNN分类:如何替换现有DenseNet代码训练自定义模型?

乳腺癌分类模型问题解析与自定义模型替换方案

一、原代码逻辑拆解

这段代码是基于预训练模型的迁移学习实现,核心是用DenseNet121提取图像特征,再通过全连接层完成二分类:

# 加载预训练DenseNet121,不含顶层分类器,用ImageNet数据集的权重初始化
in_model = tf.keras.applications.DenseNet121(input_shape=(224,224,3),
                                               include_top=False,
                                               weights='imagenet',classes = 2)
# 冻结预训练模型的所有层,仅训练后续添加的全连接层
in_model.trainable = False
# 定义输入层,对应224×224的3通道图像
inputs = tf.keras.Input(shape=(224,224,3))
# 输入传入预训练模型,得到特征图
x = in_model(inputs)
# 将特征图展平为一维向量
flat = Flatten()(x)
# 添加两个大尺寸全连接层,用ReLU激活
dense_1 = Dense(4096,activation = 'relu')(flat)
dense_2 = Dense(4096,activation = 'relu')(dense_1)
# 输出二分类结果,用softmax激活
prediction = Dense(2,activation = 'softmax')(dense_2)
# 组装完整模型
in_pred = Model(inputs = inputs,outputs = prediction)

二、训练效果差的可能原因

  • 预训练层完全冻结:DenseNet121是在通用图像数据集上训练的,和乳腺癌医学图像特征差异大,仅训练顶层全连接层无法充分学习任务专属特征
  • 全连接层参数冗余:4096神经元的层参数过多,若你的数据集规模较小,极易出现过拟合
  • 缺少正则化机制:未加入Dropout、L2正则等,模型泛化能力弱
  • 预处理不匹配:预训练模型要求输入符合ImageNet的预处理规则(如像素归一化范围、通道顺序),若你的预处理未对齐,会严重影响特征提取效果

三、替换为自定义模型的方法

只需将原代码中预训练模型部分替换为你的自定义模型结构,保持输入层和输出分类层的逻辑即可:

示例:自定义简单CNN模型替换

# 自定义特征提取模型(替换原in_model)
def custom_cnn(input_shape):
    inputs = tf.keras.Input(shape=input_shape)
    # 自定义卷积池化层堆叠
    x = tf.keras.layers.Conv2D(32, (3,3), activation='relu', padding='same')(inputs)
    x = tf.keras.layers.MaxPooling2D((2,2))(x)
    x = tf.keras.layers.Conv2D(64, (3,3), activation='relu', padding='same')(x)
    x = tf.keras.layers.MaxPooling2D((2,2))(x)
    x = tf.keras.layers.Conv2D(128, (3,3), activation='relu', padding='same')(x)
    x = tf.keras.layers.MaxPooling2D((2,2))(x)
    return tf.keras.Model(inputs=inputs, outputs=x)

# 初始化自定义模型
custom_model = custom_cnn(input_shape=(224,224,3))
# 自定义模型默认全层可训练,无需冻结(如需部分冻结可自行设置对应层trainable属性)

# 组装完整分类模型(逻辑与原代码一致,仅替换特征提取模块)
inputs = tf.keras.Input(shape=(224,224,3))
x = custom_model(inputs)
flat = tf.keras.layers.Flatten()(x)
# 缩小全连接层规模,添加正则化提升泛化
dense_1 = tf.keras.layers.Dense(256, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01))(flat)
dense_1 = tf.keras.layers.Dropout(0.5)(dense_1)
prediction = tf.keras.layers.Dense(2, activation='softmax')(dense_1)
custom_pred = tf.keras.Model(inputs=inputs, outputs=prediction)

替换步骤总结

  1. 删除原代码中in_model = tf.keras.applications.DenseNet121(...)及in_model.trainable = False两行,替换为你的自定义模型定义
  2. 保留输入层inputs = tf.keras.Input(...),将输入传入自定义模型得到特征输出
  3. 后续全连接层可根据数据集规模调整神经元数量,添加Dropout、L2正则等优化泛化能力
  4. 最后按原代码逻辑组装完整模型即可

四、额外优化建议

  • 检查数据集预处理:确保图像尺寸为224×224,像素值完成正确归一化(如匹配ImageNet的[0,1]或[-1,1]范围)
  • 尝试微调预训练模型:将in_model.trainable = False改为True,设置仅训练顶层若干层,或逐步解冻训练,效果可能优于纯自定义模型
  • 调整损失与优化器:二分类任务可改用loss='binary_crossentropy',配合Adam优化器并设置较小学习率(如1e-5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:05:18