手写数字换个风格就认不出来?DANN 教你做领域自适应
手写数字换个风格就认不出来DANN 教你做领域自适应【免费下载链接】DANNpytorch implementation of Domain-Adversarial Training of Neural Networks项目地址: https://gitcode.com/gh_mirrors/da/DANN模型在 MNIST 上刷了很高的准确率换到同为手写数字、但画风不同的 MNIST_M 上就懵了——这正是领域自适应要解决的事源域有标签学得好目标域没标签也能用。DANNDomain-Adversarial Training of Neural Networks是这一思想的一个经典 PyTorch 实现全程不需要目标域的标签。 先把环境说清楚环境依赖 Python 2.7 和 PyTorch 1.0。代码里有xrange和老式print语句Python 3 会直接报错有 GPU 会默认用 CUDA速度明显更快。跑之前先 clone 下来git clone https://gitcode.com/gh_mirrors/da/DANN cd DANN然后准备数据集下载 mnist_m 压缩包放进dataset/下新建的mnist_m/目录并解压cd dataset/mnist_m tar -zxvf mnist_m.tar.gz源域 MNIST 不用操心train/main.py里设置了downloadTrue首次运行会自动拉取。 一句话原理让特征记不住数据来自哪里整个网络是双分支结构共享的特征提取器抽完特征后一份送给分类器认数字一份送给域判别器猜这张图来自哪个数据集。听起来像普通多任务关键在中间垫的那层——梯度反转层在 models/functions.py 里。它的前向传播原样返回输入反向传播时把梯度取负、再乘以一个强度系数 α。效果是域判别器照常训练但它的建议被反转后用来更新特征提取器——特征提取器被一步步逼着提取与来源无关、只与类别有关的特征。而 α 不是一成不变的train/main.py训练循环里用一条 logistic 曲线让 α 从 0 平滑升到 1前期专心学分类后期才全力抹平域差异。这个调度是领域自适应效果好坏的关键很多人复现时改坏的就是它。 跑通训练盯住三个损失环境就绪后执行cd train python main.py每个 epoch 结束都会把模型快照存进models/并自动对两个域各测一次方便随时核对精度。训练时盯控制台滚出的三个值就够了err_s_label源域分类损失稳定下降说明还在学认数字err_s_domain和err_t_domain两个域各自的判别损失趋于平缓说明特征域信息被抹得差不多。几个容易踩的坑两个域的归一化参数不一样是刻意的MNIST 是灰度统计MNIST_M 按 0.5 居中别手滑改成一致。cuda True写死在 main.py 顶部没有 GPU 记得关掉否则直接报错。学习率 1e-3、batch size 128、100 个 epoch 都是 main.py 开头的普通变量改动前先确认显存和训练时长。 换自己的数据要动哪三个文件数据集换成自己的改动集中在三处dataset/data_loader.py里的GetLoader决定怎么读图片和标签文件train/main.py里的路径、归一化参数、输入通道数models/model.py里第一层卷积的通道数要和数据对得上灰度 1 通道彩色 3 通道。框架目前只做了 MNIST → mnist_m 的一对一适应多域场景需要自己扩展域标签和分支结构。跑通之后试着调一下 α 的调度曲线或者把网络加深一层看看目标域精度怎么变。【免费下载链接】DANNpytorch implementation of Domain-Adversarial Training of Neural Networks项目地址: https://gitcode.com/gh_mirrors/da/DANN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考