DANN 无监督域适应教程从零跑通 PyTorch 域对抗训练【免费下载链接】DANNpytorch implementation of Domain-Adversarial Training of Neural Networks项目地址: https://gitcode.com/gh_mirrors/da/DANNDANN 是一个基于 PyTorch 1.0 实现的无监督领域自适应domain adaptation训练框架它不需要目标域的任何标签就能把源域上学到的分类能力迁移到新分布的数据上。本教程以官方的 MNIST 到 mnist_m 迁移示例为线索带你先看懂原理再完成环境配置、数据集准备和首次训练。跑通全流程只需要三条命令克隆、解压、运行。 DANN 原理 3 分钟看懂梯度反转层如何实现无监督域适应先看问题你有一个带标签的源域MNIST 线条手写数字还有一个目标域mnist_m彩色手写数字照片两者分布不一致而目标域没有标签没法用常规监督方式直接训练。DANN 的解法是域对抗训练在网络里加一个域分类器让它猜测特征来自源域还是目标域同时用梯度反转层让特征提取器欺骗这个分类器——分类器越分不出来源特征就越接近与域无关。梯度反转层实现在 models/functions.py正向传播时特征原样通过、数据不被改动反向传播时取负梯度再乘以强度 α。这就像记账付款时金额照实记一笔正向不变月底对账时却把这笔从收入改记到支出反向翻号数字没变影响方向反了。α 不是常数它随训练进度 p 按 S 曲线从接近 0 逐渐升到 2即域适应压力前期轻、后期强。结构上整体是双分支特征提取器两层卷积加批归一化与池化的输出一路送进类别分类器10 个数字类别另一路经梯度反转层送进域分类器源/目标 2 类三路损失相加后一起反向传播。 从零跑通 DANN环境准备与 mnist_m 数据集配置准备环境Python 2.7 加 PyTorch 1.0可选 CUDA 加速。代码使用了 xrange、print 语句等 Python 2 语法Python 3 无法运行。克隆仓库然后进入 DANN 目录git clone https://gitcode.com/gh_mirrors/da/DANN配置数据集源域 MNIST 会被代码自动下载无需操作目标域 mnist_m 需按 README 中的地址手动下载放入 dataset 目录后在 mnist_m 子目录中解压cd dataset mkdir mnist_m cd mnist_m tar -zxvf mnist_m.tar.gz解压后该目录内应包含 mnist_m_train、mnist_m_test 两个子目录和 mnist_m_train_labels.txt、mnist_m_test_labels.txt 两个标签文件。 4. 运行训练cd train python main.py控制台每个 batch 会打印 err_s_label源域分类损失与 err_s_domain、err_t_domain两项域分类损失每轮结束模型保存为 models 下的 mnist_mnistm_model_epoch_N.pth并评估两个数据集的准确率随时可检查进度或从存档断点续训。️ 关键参数怎么调学习率、批次与训练轮数调参建议可调项集中在 train/main.py 顶部参数默认值调整建议学习率Adam 优化器1e-3损失震荡时降到 5e-4收敛过慢可试 2e-3批次大小 batch size128显存紧张时降到 64显存充裕可升到 256 提速训练轮数 n_epoch100目标域准确率仍在上升则延长到 150~200提前平台期可减到 50α 域适应强度0→2 随进度调度由 S 曲线公式自动计算一般无需改想加压或减压可调公式中的指数系数 -10 出错时先查这里Python 版本与数据集配置现象可能原因解决办法启动即报 SyntaxError指向 xrange 或 print用了 Python 3 运行项目仅支持 2.7换 Python 2.7 加 PyTorch 1.0 环境重跑抛出 FileNotFoundError / IOErrormnist_m 未放在 dataset/mnist_m或标签文件缺失检查两个数据集子目录与两份 labels txt 是否齐全训练明显偏慢未使用 CUDA或数据读取线程不足用 GPU 环境训练适当调整 DataLoader 的 num_workers 改造成你的场景数据、结构与多领域自定义数据集改动 dataset/data_loader.py 中目标域的读取逻辑。GetLoader 从文本列表里读取每张图片的相对路径与标签你只需按同样格式准备图片与列表文件源域也可以在 main.py 中换成任意带标签数据集。调整网络层特征提取器与两个分类器都定义在 models/model.py可增删卷积层与全连接层。注意类别分类器输入是 50×4×4若改动特征层输出尺寸需同步修改全连接层的输入维度。扩展到多领域当前域分类器输出 2 类只区分源与目标。要支持 K 个领域把它的最后一层改为 K 类为每个领域分配独立标签并在同一训练循环中并入各领域数据即可。最快的上手路径是先跑通这个 MNIST 到 mnist_m 的示例看 train/main.py 确认超参设置读 models/functions.py 弄清梯度反转层的工作原理之后换成自己的数据时从数据加载部分入手修改即可。【免费下载链接】DANNpytorch implementation of Domain-Adversarial Training of Neural Networks项目地址: https://gitcode.com/gh_mirrors/da/DANN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考