thuml / Transfer-Learning-Library

Transfer Learning Library for Domain Adaptation, Task Adaptation, and Domain Generalization
http://transfer.thuml.ai
MIT License
3.39k stars 553 forks source link

实验结果差别大 #183

Closed anranbixin closed 1 year ago

anranbixin commented 1 year ago

作者您好,为什么我这边跑出来的source_only的结果和您的差别有点大呀,作者您是把最后的final_mode那一轮记录的结果作为最终的精确度的吗?还有作者在跑watercolor、comic等数据集集的时候,eg:-t采用的是WaterColor,--test采用的是WaterColorTest吗?如果您能够解答,我将非常感谢! Evaluating datasets_watercolor_train using 2007 metric. +---------+---------------------+ | AP | 0.0129179003324974 | | AP50 | 0.04594659669912493 | | AP75 | 0.00946969696969697 | | bicycle | 0.0 | | bird | 0.12804097311139565 | | car | 0.00989756025139803 | | cat | 0.0 | | dog | 0.13774104683195593 | | person | 0.0 | +---------+---------------------+ Evaluating datasets_watercolor_test using 2007 metric. +---------+----------------------+ | AP | 0.08883031642337483 | | AP50 | 0.2204288930733166 | | AP75 | 0.05140623869850683 | | bicycle | 0.0 | | bird | 0.11188811188811189 | | car | 0.007665184730952015 | | cat | 0.19342359767891684 | | dog | 0.18315018315018317 | | person | 0.8264462809917356 | +---------+----------------------+

anranbixin commented 1 year ago

很抱歉我这边可能使用数据集和您使用的数据集不一样(没有使用source_only.sh里面的执行语句,直接使用VOC07+12进行的实验),您采用的那个VOC2007Partial、VOC2012Partial是自己抽取出来的数据集吗?

thucbx99 commented 1 year ago

可以参考VOC2007Partial和VOC2012Partial的实现,这是因为目前的Domain Adaptation Object Detection主要考虑source和target类别相同的情况,这样VOC有20类,而WaterColor只有6类,因此需要把相同的挑出来

anranbixin commented 1 year ago

很感谢您的回答,但是我还有一个疑惑,我在运行的时候只使用--test watercolor_test和cov07_test作为测试集,实验就过就是我之前发的那个样子,但是我使用--test watercolor_test,cov07_test,comic_test的话就能够出正常的结果,那么在运行的时候单独每个数据集的运行实验结果会有偏差吗?(比如出现某个类别结果为0.0的情况)

thucbx99 commented 1 year ago

我觉得这不太科学哈哈,你确定其他的参数都是一样的吗。source only只是在source上训练而后在各个target上测试,因此测试A数据集不会对测试B数据集有影响

anranbixin commented 1 year ago

对呀,我也是这样想的,但是确实跑出来效果很奇怪,我用的指令是:(这个指令就是之前提到那个用的VOC2012,但是我看VOC2012和VOC2012Partial默认下载地址是一样的呀~) CUDA_VISIBLE_DEVICES=0 python source_only.py \ --config-file config/faster_rcnn_R_101_C4_voc.yaml \ -s VOC2007 datasets/VOC2007 VOC2012 datasets/VOC2012 -t WaterColor datasets/watercolor \ --test VOC2007Test datasets/VOC2007 WaterColorTest datasets/watercolor--finetune \ OUTPUT_DIR logs/source_only/faster_rcnn_R_101_C4/voc2clipart

实验结果: Evaluating datasets_watercolor_test using 2007 metric. +---------+----------------------+ | AP | 0.08883031642337483 | | AP50 | 0.2204288930733166 | | AP75 | 0.05140623869850683 | | bicycle | 0.0 | | bird | 0.11188811188811189 | | car | 0.007665184730952015 | | cat | 0.19342359767891684 | | dog | 0.18315018315018317 | | person | 0.8264462809917356 | +---------+----------------------+

还有一个问题想请教一下您,你们的source是做了resize的吗,如果我想用source_only做特征对齐是需要手动将两者的feature做resize的吗?(我这边两个的size是不一样的,我是手动做的resize feature,但是对齐效果没有加进去,对齐的损失nan了~)

thucbx99 commented 1 year ago

这里的命令应该是-s VOC2007Partial xxx/xxx VOC2012Partial xxx/xxx,不然就会用20类的VOC07和VOC12训练了,下载地址是一样的是因为比如VOC2007Partial是VOC2007的一个子集

thucbx99 commented 1 year ago

后面这一部分我有点没看懂,猜测是直接在检测中应用特征拉近的方法?这里的确会有特征维度的问题,具体的实现因方法而异,可以看一下D-Adapt的几个主要baseline比如SWDA, HTCN

anranbixin commented 1 year ago

感谢您的回答,有一个问题想请教一下,我在使用是source_only.py 想作为base line, 但是我在使用该项目中的对齐方式(advent和自己封装的对齐方式)的时候都出现了一个问题,就是损失不会怎么变(比如一开始损失为0.25,之后的迭代中就一直没什么变化),我们是通过losses.update(dann_losses)加入新的损失的。请问有什么见解吗? 我们的对齐测试是: discriminator = Discriminator(num_classes=1024) self.dann = DomainAdversarialEntropyLoss(discriminator)

loss_dann = 0.5 (self.dann(source_features['res4'], "source") + self.dann(target_features['res4'], "target")) losses.update({"loss_dann":loss_dann}) 此外,我们写了一个测试advent.py的方法: 迭代之后的数据结果也是不怎么变动的,请问是我们调用的方式不对吗? import sys import torch sys.path.append('/autodl-tmp/Transfer-Learning-Library/') from tllib.alignment.advent import DomainAdversarialEntropyLoss,Discriminator B, C, H, W=2, 19, 512, 512 discriminator = Discriminator(num_classes=C).cuda() y_s, y_t = torch.randn(B, C, H, W).cuda(), torch.randn(B, C, H, W).cuda() dann = DomainAdversarialEntropyLoss(discriminator).cuda() loss_dann = 0.5 (dann(y_s, "source") + dann(y_t, "target")) print("loss_dann:{}",loss_dann)

thucbx99 commented 1 year ago

你使用的是自己实现的代码还是库里自带的呀,如果是自己实现的可能需要检查一下domain discriminator这部分参数是否被更新或者学习率是否设置的太高