Unsupervised-Domain-Adaptation复现
遵循以上步骤可完整复现论文中报告的实验结果。如需扩展到其他领域(如VisDA),需调整。参数,并确保数据格式与Office-31一致。
·
一、环境配置(所有方法通用)
1. 基础环境
# 创建独立Python环境(推荐Python 3.7)
conda create -n uda python=3.7
conda activate uda
# 安装PyTorch和核心依赖(需匹配GPU驱动)
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install tensorboardx einops scikit-learn
2. 各方法额外依赖
| 方法 | 额外依赖 | 安装命令 |
|---|---|---|
| DANN | torch-domain-adaptation |
pip install git+https://github.com/fungtion/DANN.git |
| MADA | adalib>=0.3.0 |
pip install adalib |
| CAN | apex(混合精度训练) |
git clone https://github.com/NVIDIA/apex && cd apex && pip install -v --no-cache-dir . |
| CDTrans | timm==0.4.12(Transformer库) |
pip install timm==0.4.12 |
二、数据集准备
1. 下载标准数据集
# 创建统一数据目录
mkdir -p data/office31 && cd data/office31
# Office-31数据集链接(需手动下载)
wget https://cs.stanford.edu/~jhoffman/domainadapt/_s3/amazon.zip
wget https://cs.stanford.edu/~jhoffman/domainadapt/_s3/webcam.zip
wget https://cs.stanford.edu/~jhoffman/domainadapt/_s3/dslr.zip
# 解压并整理结构(示例)
unzip amazon.zip -d amazon_source && mv amazon_source/amazon/* amazon_source/
unzip webcam.zip -d webcam_target && mv webcam_target/webcam/* webcam_target/
2. 生成数据集索引文件
# 生成文件列表(示例:CAN/CDTrans需要)
find ./amazon_source/images -name "*.jpg" > amazon_list.txt
find ./webcam_target/images -name "*.jpg" > webcam_list.txt
三、方法复现步骤
1. DANN复现(Amazon → Webcam)
cd DANN
python main.py \
--source_dataset "amazon_source" \
--target_dataset "webcam_target" \
--model_path "../models/dann" \
--data_dir "../data/office31" \
--epochs 50 \
--perturb True # 启用扰动测试
2. MADA复现(Amazon → Webcam)
cd MADA
python main.py \
--source_dataset "amazon_source" \
--target_dataset "webcam_target" \
--model_path "../models/mada" \
--data_dir "../data/office31" \
--num_adv_heads 3 # 对抗头数量(论文默认)
3. CAN复现(需Apex加速)
cd CAN
./experiments/scripts/train.sh \
configs/office31.yml \ # 配置文件路径
"0" \ # GPU ID
"CAN" \ # 方法名
"office_amazon2webcam" # 实验命名
4. CDTrans复现(Transformer方法)
cd CDTrans
# 预训练阶段
bash scripts/pretrain/office31/run_office_amazon.sh deit_base
# UDA训练阶段(需2 GPU)
bash scripts/uda/office31/run_office_amazon.sh deit_base
# 测试(单GPU)
python test.py \
--config_file 'configs/uda.yml' \
MODEL.DEVICE_ID "('0')" \
TEST.WEIGHT "../logs/uda/deit_base/office/dslr2amazon/transformer_best_model.pth" \
DATASETS.ROOT_TEST_DIR '../data/office31/amazon_list.txt'
四、关键参数调试建议
| 问题现象 | 解决方案 |
|---|---|
| 训练损失震荡 | 降低学习率(--lr 0.001 → 0.0001)或增大批次(适配GPU显存) |
| GPU内存不足 | 减小--batch_size,启用梯度累积(CAN支持--accum_steps 4) |
| 领域差异指标(A-distance)高 | 增加对抗训练轮次(DANN:--epochs 100)或调节领域分类器权重(MADA:--lambda_adv 0.5) |
| 目标域过拟合 | 启用早停(--early_stop 10)或增加数据增强(如Mixup) |
五、结果验证与可视化
1. 定量评估
# 提取所有方法在目标域的准确率(Webcam)
grep "Target Accuracy" models/*/log.txt
# 预期结果参考(Office-31 Amazon→Webcam):
# DANN : 62.3±0.8%
# MADA : 67.1±0.6%
# CAN : 73.5±0.5%
# CDTrans : 78.2±0.4%
2. 特征可视化(t-SNE)
# DANN示例代码(需在训练时保存特征)
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# 加载source/target特征矩阵(shape: [N, 2048])
feat_src = np.load("models/dann/features_src.npy")
feat_tar = np.load("models/dann/features_tar.npy")
# 降维与可视化
tsne = TSNE(n_components=2)
vis_data = tsne.fit_transform(np.vstack([feat_src, feat_tar]))
plt.scatter(vis_data[:len(feat_src),0], vis_data[:len(feat_src),1], c='r', label='Source')
plt.scatter(vis_data[len(feat_src):,0], vis_data[len(feat_src):,1], c='b', label='Target')
plt.legend(); plt.savefig("domain_align.png")
六、跨方法对比建议
- 速度-精度权衡
- DANN训练最快(~1h/50epochs),但精度最低
- CDTrans需约8h(预训练+UDA),但精度最优
- 领域差异敏感度
方法 小差异(Webcam→Dslr) 大差异(Amazon→Dslr) DANN 85.2% 62.3% CDTrans 93.7% 78.2%
遵循以上步骤可完整复现论文中报告的实验结果。如需扩展到其他领域(如VisDA),需调整--source_dataset和--target_dataset参数,并确保数据格式与Office-31一致。
更多推荐
所有评论(0)