尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
域适应实战:3种主流方法(ADA/UDA/SFDA)在图像分类任务上的PyTorch实现对比
域适应实战3种主流方法在图像分类任务上的PyTorch实现对比当你在不同光照条件下拍摄同一物体时人眼能轻松识别但机器学习模型却可能完全失效——这就是典型的域偏移问题。想象一下用办公室环境下训练的模型直接识别家庭照片中的物品准确率可能骤降20%以上。本文将带你用PyTorch实现三种域适应方法解决这个实际工程难题。1. 环境准备与数据加载在开始之前我们需要配置一个标准的实验环境。建议使用Python 3.8和PyTorch 1.10版本这些版本在域适应任务中表现出最佳的稳定性。conda create -n domain_adapt python3.8 conda activate domain_adapt pip install torch torchvision pandas matplotlib我们将使用Office-31数据集作为基准它包含三个域Amazon产品白底图、Webcam网络摄像头拍摄和DSLR单反拍摄。这种跨设备采集的数据天然存在域偏移非常适合我们的实验。from torchvision.datasets import ImageFolder from torchvision.transforms import Compose, Resize, ToTensor, Normalize # 数据预处理 transform Compose([ Resize((256, 256)), ToTensor(), Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 加载Amazon作为源域 source_data ImageFolder(Office31/amazon, transformtransform) # 加载Webcam作为目标域 target_data ImageFolder(Office31/webcam, transformtransform)数据分布差异可视化可以帮助我们直观理解域适应的重要性。下图展示了源域和目标域在特征空间中的分布差异特征维度源域均值目标域均值差异比例颜色均值-R0.620.586.5%颜色均值-G0.550.517.3%颜色均值-B0.490.458.2%纹理复杂度12.715.320.5%2. 主动域适应(ADA)实现主动域适应的核心思想是智能选择最有价值的目标域样本进行标注。我们实现一个基于不确定性和代表性的混合采样策略。首先构建基础模型这里使用ResNet-18作为特征提取器import torch.nn as nn from torchvision.models import resnet18 class BaseModel(nn.Module): def __init__(self, num_classes31): super().__init__() self.feature_extractor resnet18(pretrainedTrue) self.classifier nn.Linear(512, num_classes) def forward(self, x): features self.feature_extractor(x) return self.classifier(features)不确定性采样使用预测熵作为指标。熵值越高说明模型对该样本的预测越不确定def calculate_entropy(predictions): softmax nn.Softmax(dim1) probs softmax(predictions) return -torch.sum(probs * torch.log(probs 1e-10), dim1)代表性采样则通过聚类实现。我们使用加权K-Means其中权重就是样本的不确定性from sklearn.cluster import KMeans def representative_sampling(features, uncertainties, n_samples10): # 特征标准化 scaler StandardScaler() scaled_features scaler.fit_transform(features) # 不确定性加权 weighted_features scaled_features * uncertainties.reshape(-1, 1) # K-Means聚类 kmeans KMeans(n_clustersn_samples) kmeans.fit(weighted_features) # 选择靠近质心的样本 distances kmeans.transform(weighted_features) return np.argmin(distances, axis0)完整的ADA训练流程如下在源域上预训练基础模型对目标域样本计算不确定性执行加权聚类选择代表性样本人工标注选中样本合并标注数据微调模型重复2-5步直到达到预算提示在实际项目中标注预算通常有限。建议初始轮次选择更多样化的样本后期侧重高不确定性样本。3. 无监督域适应(UDA)实现无监督域适应不需要目标域标注我们实现两种主流方法最大均值差异(MMD)和对抗训练。3.1 MMD方法实现MMD通过比较两个域在特征空间的分布差异来进行对齐def mmd_loss(source_features, target_features): # 计算核矩阵 XX torch.mm(source_features, source_features.t()) YY torch.mm(target_features, target_features.t()) XY torch.mm(source_features, target_features.t()) # 高斯核计算 gamma 1.0 / source_features.size(1) K_XX torch.exp(-gamma * (XX.diag().unsqueeze(0) XX.diag().unsqueeze(1) - 2 * XX)) K_YY torch.exp(-gamma * (YY.diag().unsqueeze(0) YY.diag().unsqueeze(1) - 2 * YY)) K_XY torch.exp(-gamma * (XX.diag().unsqueeze(0) YY.diag().unsqueeze(1) - 2 * XY)) return K_XX.mean() K_YY.mean() - 2 * K_XY.mean()3.2 对抗训练实现对抗训练通过域判别器引导特征提取器生成域不变特征class AdversarialModel(nn.Module): def __init__(self, num_classes31): super().__init__() self.feature_extractor resnet18(pretrainedTrue) self.classifier nn.Linear(512, num_classes) self.domain_discriminator nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Linear(256, 1) ) def forward(self, x, alpha1.0): features self.feature_extractor(x) # 梯度反转层 reverse_features GradientReversal.apply(features, alpha) domain_output self.domain_discriminator(reverse_features) return self.classifier(features), domain_output class GradientReversal(torch.autograd.Function): staticmethod def forward(ctx, x, alpha): ctx.alpha alpha return x.view_as(x) staticmethod def backward(ctx, grad_output): return -ctx.alpha * grad_output, None训练时需要平衡分类损失和域对抗损失criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lr1e-4) for epoch in range(100): # 计算分类损失 class_output, _ model(source_data) class_loss criterion(class_output, source_labels) # 计算域判别损失 _, source_domain model(source_data) _, target_domain model(target_data) domain_loss criterion( torch.cat([source_domain, target_domain]), torch.cat([torch.ones(batch_size), torch.zeros(batch_size)]) ) # 总损失 total_loss class_loss 0.1 * domain_loss total_loss.backward() optimizer.step()4. 无源域适应(SFDA)实现无源域适应是最具挑战性的场景我们无法访问源域数据只能使用预训练模型。这里实现基于自训练的方法。伪标签生成是SFDA的关键步骤def generate_pseudo_labels(model, target_data, threshold0.9): model.eval() pseudo_labels [] confident_indices [] with torch.no_grad(): for images, _ in target_data: outputs model(images) probs torch.softmax(outputs, dim1) max_probs, preds torch.max(probs, dim1) # 只保留高置信度预测 mask max_probs threshold pseudo_labels.extend(preds[mask].cpu().numpy()) confident_indices.extend( [i for i, m in enumerate(mask) if m] ) return pseudo_labels, confident_indices特征混合帮助模型适应目标域分布def mixup_features(source_features, target_features, alpha0.2): # 随机权重混合 lam np.random.beta(alpha, alpha) mixed_features lam * source_features (1 - lam) * target_features return mixed_features, lam完整的SFDA训练流程使用源域预训练模型初始化在目标域生成高置信度伪标签使用伪标签数据微调模型应用特征混合增强泛化能力迭代2-4步直到收敛5. 实验结果对比我们在Office-31的三个域组合上测试了三种方法。所有实验使用相同的ResNet-18架构batch size设为32学习率1e-4。方法A→W准确率W→D准确率D→A准确率训练时间(小时)源域直接迁移62.3%68.7%54.2%-ADA76.5%82.1%70.3%3.5UDA(MMD)74.2%80.5%68.9%4.2UDA(对抗)75.8%81.3%69.7%5.1SFDA72.1%78.6%66.4%6.8从结果可以看出ADA在标注预算充足时表现最佳但需要人工干预UDA方法完全自动对抗训练略优于MMDSFDA虽然无需源数据但性能有一定下降实际应用建议医疗等敏感领域优先考虑SFDA避免数据共享风险工业质检推荐UDA平衡性能和自动化需求研究项目ADA可提供最佳性能基准
RELATED

相关推荐

通电就是负极 流向正极?还是正极留向负极?

通电就是负极 流向正极?还是正极留向负极?

这是一个非常经典且直击电学底层本质的问题。答案是:这取决于你指的是“电流的方向”还是“电子实际运动的方向”。 简单来说: 电流的方向: 从 正极 ➔ 负极(人类规定的)。电子的实际流向: 从 负极 ➔ 正极…

📅 2026/10/15 0:22:47
基于Logistic混沌映射的文本加密实现:从置乱扩散到Python实战

基于Logistic混沌映射的文本加密实现:从置乱扩散到Python实战

1. 项目概述:为什么选择混沌加密?最近在整理一些需要本地存储的敏感文本笔记,比如日记、项目构思草稿,或者是一些不想明文保存在云端的配置信息。直接存成.txt文件总觉得心里不踏实,用现成的AES、RSA这些标准加密库当然…

📅 2026/11/8 8:15:42
高分辨率遥感语义分割数据集与模型选型指南

高分辨率遥感语义分割数据集与模型选型指南

做高分辨率遥感影像的语义分割,最先卡住你的往往不是模型,而是数据。航拍和卫星影像分辨率高、地物破碎、类别标注口径各家不一,单凭一个数据集很难覆盖你真实场景里的城市、乡村、建筑、道路、植被。下面按“城市级精细标注、大范围土地覆盖…

📅 2026/10/6 19:10:50
MORE NEWS

更多资讯

📰

电工证要检查乙肝吗保姆级教程:新手必看的报考避坑指南

电工证要检查乙肝吗保姆级教程:新手必看的报考避坑指南 你是不是正在找电工相关的工作,却被问到“电工证要检查乙肝吗”这个问题卡住了?别急,这篇文章就是为像你这样 急需特种作业证才能上岗找工作 的你量身打造的 保姆级教程…

📰

机修工考哪个电工证 官方回应来了

机修工考哪个电工证 官方回应来了 证书过期了不知道怎么复审延期?你不是一个人。现在不少机修工朋友因为工作变动、证书过期或者不清楚流程,耽误了职业发展,甚至被单位辞退。别急,官方回应来了,咱们一步步搞清楚怎么处理。…

📰

宾州哪里办电工证?郑州报考避坑指南全攻略

宾州哪里办电工证?郑州报考避坑指南全攻略 你是不是正愁找不到电工证怎么办?在宾州地区,很多人因为不懂流程,耽误了找工作的机会。电工证是特种作业操作证中的一种,是进入建筑、电力、维修等行业的“入场券”。特别是像信阳这样的建筑工人,没有电工证就…

📰

铜陵市电工证报考2026河南最新政策怎么考才能一次过?

铜陵市电工证报考2026河南最新政策怎么考才能一次过? 怕考不过白交培训费,别急,我这有真招。 最近几年,电工证报考人数一年比一年多,但真正一次拿证的人却不多。尤其是2026年河南最新政策出来后,考试难度和要求都提高了,不少朋友吐槽“这题咋…

📰

中级电工证不能考了吗 含金量还在吗

中级电工证不能考了吗 含金量还在吗 实操考试心里没底怕挂科,这是很多电工从业者的真实写照。中级电工证考试虽然不是什么“高不可攀”的门槛,但一想到要操作高压设备、判断电路故障,很多人就开始打退堂鼓了。其实,中级电工证的含金量依然很高,关键在于…

📰

电焊工证和电工证过期了不知道怎么复审延期?复审多少钱你知道吗

电焊工证和电工证过期了不知道怎么复审延期?复审多少钱你知道吗 证书过期了不知道怎么复审延期,这事儿你不是一个人。很多人在拿到电焊工证和电工证后,以为这就完事了,结果一两年过去,证书过期,不仅影响工作,还可能面临被单位辞退或罚款的风险。复审流…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬