DANN域对抗训练完整指南目标域免标签迁移【免费下载链接】DANNpytorch implementation of Domain-Adversarial Training of Neural Networks项目地址: https://gitcode.com/gh_mirrors/da/DANNDANN是域对抗神经网络的PyTorch实现解决无监督域适应问题源域MNIST灰度数字有标签目标域mnist_m彩色数字没有标签靠对抗训练让模型不借助目标域标签就能直接分类。整体流程就三步克隆仓库、摆好数据集、一条命令跑训练每轮结束都输出两个域的分类准确率报告。 配好Python 2.7环境与mnist_m数据集环境要求两个Python 2.7 和 PyTorch 1.0pip install torch1.0。没有GPU也能跑但要把训练入口里的 cuda True 改成 False否则CPU机器直接崩溃。先克隆仓库git clone https://gitcode.com/gh_mirrors/da/DANN cd DANN再配数据。MNIST源域由torchvision自动下载不用管。mnist_m目标域数据集需要自行获取下载地址见README然后解压进dataset目录cd dataset mkdir mnist_m cd mnist_m tar -zxvf mnist_m.tar.gz解压后确认 dataset/mnist_m 下有 mnist_m_train/、mnist_m_test/ 目录和对应的labels txt文件结构错了后面一定报错。▶ 跑通第一次训练并核对输出注意必须在train目录内启动脚本因为数据、模型路径都写成 ../dataset 这种相对路径。cd train python main.py输出形如epoch: 0, [iter: 1 / all 469], err_s_label: 1.97, err_s_domain: 0.69, err_t_domain: 0.72每轮结束会把模型存成 models/mnist_mnistm_model_epoch_轮数.pth并打印两个数据集的准确率。判断跑成功的三条线err_s_label源域分类损失从2.3左右整体下滑mnist_m准确率明显高于10%10类随机猜的底线跑满100轮目标域准确率收敛到九成上下。 看懂双分支对抗结构与梯度反转网络分三部分特征提取器两个卷积层、类别分类器输出10类、域分类器只分2类源域还是目标域。同一份特征同时喂给后两个分支训练目标是类别分类器认得源域数据域分类器却被逼着分不清特征来自哪个域。梯度反转层怎么做到的核心在 models/functions.py 里的ReverseLayerF。它正向传播时原样放行数据反向传播时把梯度符号取反并乘以强度系数alpha。效果是域分类器照常想认出域但它回传的梯度被反转特征提取器反而被推着去学出骗过域分类器的特征——这就是域无关特征的来源。alpha为什么随训练增长alpha由训练进度p算出走一条从0升到1的S曲线。训练前期强度弱让分类器先学会分对类别后期强度高才全力对齐两个域。两个目标分时段发力不会互相打架。 调参数并盯住收敛趋势参数都集中在 train/main.py 顶部参数默认值调整建议lr1e-3损失震荡不降就减半到5e-4batch_size128显存紧张减半到64充裕可上256n_epoch100目标域准确率走平后再停别早停image_size28保持28改尺寸需同步网络和测试脚本alpha调度随进度递增目标域精度早期就停滞可放缓增速两个容易踩的细节源域、目标域各有一套归一化的mean/std别换错否则损失从开头就飙高每轮结束都会做一次完整测试评估耗时明显。只关心损失曲线时把循环末尾的两行test调用注释掉。 按现象自查训练问题启动即报FileNotFoundError找不到mnist_m_train_labels.txt原因数据集没解压或层级摆错。 处理核对dataset/mnist_m下train目录与labels文件是否齐全缺了就按前面步骤重新解压。SyntaxError: Missing parentheses in call to print原因用了Python 3跑代码是2.7语法print语句、xrange。 处理换2.7环境用python2.7 main.py启动。CUDA out of memory或无GPU机器直接崩溃原因cuda True写死了。 处理改成False用CPU跑有GPU则先降batch_size。目标域准确率全程压在10%附近原因轮数不够或数据路径错误导致标签全读成同一个值。 处理先核对labels txt行数与图片数量一致再拉长训练。 改代码适配你自己的领域换数据集目标域加载逻辑在 GetLoader它只认一个图片目录加一个列表txt每行图片名标签源域把main.py里的datasets.MNIST换成同类加载器即可。改网络结构在models/model.py调卷积层和全连接维度改完务必同步5044这个展平维度否则全连接层对不上。多域适应域分类器目前只输出2类改成N类输出、给每个域配一个域标签就能扩展到多域场景。下一步建议先按官方配置完整跑满100轮并记下目标域准确率再用你手头的数据集替换目标域验证一遍整套流程。【免费下载链接】DANNpytorch implementation of Domain-Adversarial Training of Neural Networks项目地址: https://gitcode.com/gh_mirrors/da/DANN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考