基于HAM10000数据集的深度学习模型双多分类输出及肤色偏差分析问询
解决方案:多输出深度学习模型实现肤色与癌症分类的独立预测
核心思路
直接使用多输出模型,让模型同时学习两个独立任务:癌症分类(7类多分类或恶性/良性二分类)和肤色分类(亮/暗二分类),彻底避免合并标签的歧义问题。训练完成后,通过对预测结果分组,就能生成按肤色拆分的癌症分类报告,或按癌症类型拆分的肤色预测表现。
1. 模型架构搭建(以Keras函数式API为例)
基于共享的特征提取 backbone(比如预训练的ResNet、EfficientNet),分叉出两个独立的输出分支:
- 分支1:负责癌症分类(7类用
softmax激活,二分类用sigmoid) - 分支2:负责肤色分类(二分类用
sigmoid激活)
from tensorflow.keras import layers, Model from tensorflow.keras.applications import ResNet50 # 共享特征提取 backbone(可根据需求冻结或微调) base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) x = base_model.output x = layers.GlobalAveragePooling2D()(x) # 癌症分类分支(示例为7类多分类,若用恶性/良性二分类则改为Dense(1, activation='sigmoid')) cancer_output = layers.Dense(7, activation='softmax', name='cancer_class')(x) # 肤色分类分支(亮/暗二分类) skin_tone_output = layers.Dense(1, activation='sigmoid', name='skin_tone')(x) # 定义多输出模型 model = Model(inputs=base_model.input, outputs=[cancer_output, skin_tone_output])
2. 模型编译与训练
为两个输出分支分别指定损失函数,编译后用包含双标签的数据集训练:
from tensorflow.keras.losses import CategoricalCrossentropy, BinaryCrossentropy # 编译模型,为每个输出指定损失和评估指标 model.compile(optimizer='adam', loss={'cancer_class': CategoricalCrossentropy(), 'skin_tone': BinaryCrossentropy()}, metrics={'cancer_class': 'accuracy', 'skin_tone': 'accuracy'}) # 训练模型,假设训练数据的标签为元组形式:(癌症标签数组, 肤色标签数组) # model.fit(train_images, (y_cancer_train, y_skin_tone_train), # validation_data=(val_images, (y_cancer_val, y_skin_tone_val)), # epochs=20, batch_size=32)
3. 生成按肤色拆分的分类报告
训练完成后,分别获取两个任务的预测结果,然后按肤色分组统计癌症分类的表现:
from sklearn.metrics import classification_report import numpy as np # 获取预测结果 y_cancer_pred, y_skin_tone_pred = model.predict(test_images) # 转换预测结果为类别 y_cancer_pred_class = np.argmax(y_cancer_pred, axis=1) # 7类多分类 y_skin_tone_pred_class = (y_skin_tone_pred > 0.5).astype(int).flatten() # 肤色二分类 # 生成浅色肤色样本的癌症分类报告(假设0代表浅色) light_mask = (y_skin_tone_test == 0) print("=== 浅色肤色样本的癌症分类报告 ===") print(classification_report(y_cancer_test[light_mask], y_cancer_pred_class[light_mask])) # 生成深色肤色样本的癌症分类报告(假设1代表深色) dark_mask = (y_skin_tone_test == 1) print("\n=== 深色肤色样本的癌症分类报告 ===") print(classification_report(y_cancer_test[dark_mask], y_cancer_pred_class[dark_mask])) # 针对特定癌症(如黑色素瘤)分析肤色分布的预测表现 # 假设黑色素瘤对应癌症标签的索引为0 melanoma_mask = (y_cancer_test == 0) print("\n=== 黑色素瘤样本的肤色分类报告 ===") print(classification_report(y_skin_tone_test[melanoma_mask], y_skin_tone_pred_class[melanoma_mask]))
关键优势
- 两个任务独立学习特征,完全避免合并标签导致的歧义(如0+1与1+0混淆)
- 可分别监控两个任务的训练精度,方便调试优化
- 灵活生成各类拆分报告,直接满足“分析肤色偏差对癌症预测影响”的需求
内容的提问来源于stack exchange,提问作者Dhruv Marwha
相关产品推荐
相关产品推荐

