ownstyledu / Translate-to-Recognize-Networks

CVPR 2019 Translate-to-Recognize Networks for RGB-D Scene Recognition
89 stars 12 forks source link

How to train the fusion model? #3

Closed CongFang closed 5 years ago

CongFang commented 5 years ago

您好,您的工作非常棒,感谢分享代码。 在使用train_fusion.py 训练fusion model 的时候,发现fusion.py中的total_epoch没有定义,在将其设置为100后,模型可以开始训练啦,但是结果很差,而且learning rate一直都是负的:

########## Class Acc Report ########## acc bathroom: 0.000 acc bedroom: 0.000 acc classroom: 100.000 acc computer_room: 0.000 acc conference_room: 0.000 acc corridor: 0.000 acc dining_area: 0.000 acc dining_room: 0.000 acc discussion_area: 0.000 acc furniture_store: 0.000 acc home_office: 0.000 acc kitchen: 0.000 acc lab: 0.000 acc lecture_theatre: 0.000 acc library: 0.000 acc living_room: 0.000 acc office: 0.000 acc rest_space: 0.000 acc study_space: 0.000 ############################## mean_acc: [5.263157894736842] Mean Acc Epoch <18> * Prec@1 <5.263> End of iter 2196 / 100 Time Taken: 54.42968773841858 sec

default lr 0.0002 /////////learning rate = -0.0052375

在fusion model训练之前,已经用train.py分别训练了两个tregnets:trecg_AtoB_best.pth、trecg_BtoA_best.pth,并在resner_sunrgbd_config.py中设置了resume_path_A和resume_path_B。Mean Acc 分别是50.05和46.02,结果应该还算正常。

以下是user config:

GPU_IDS : 2,3 nTHREADS : 8 WORKERS : 8 MODEL : fusion ARCH : resnet18 PRETRAINED : place CONTENT_PRETRAINED : place NO_UPSAMPLE : False FIX_GRAD : False IN_CONC : False DATA_DIR_TRAIN : /home/cfang/Downloads/dataset/RGB-D/OFFICIAL_SUNRGBD/data_in_class/conc_data/train DATA_DIR_VAL : /home/cfang/Downloads/dataset/RGB-D/OFFICIAL_SUNRGBD/data_in_class/conc_data/val DATA_DIR_UNLABELED : /home/cfang/Downloads/dataset/nyud2/mix/conc_data/10k_conc_bak SAMPLE_MODEL_PATH : None CHECKPOINTS_DIR : ./checkpoints ROOT_DIR : /home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/ SUMMARY_DIR_ROOT : /home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/summary/ LOG_PATH : summary CONTENT_MODEL_PATH : /home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/resnet18_places365.pth.tar DATA_TYPE : pair WHICH_DIRECTION : AtoB NUM_CLASSES : 19 BATCH_SIZE : 40 LOAD_SIZE : 256 FINE_SIZE : 224 FLIP : True UNLABELED : False FIVE_CROP : False FAKE_DATA_RATE : 0.3 LR : 0.0002 WEIGHT_DECAY : 0.0001 MOMENTUM : 0.9 LR_POLICY : lambda PHASE : train RESUME : False RESUME_PATH : None RESUME_PATH_A : /home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/checkpoints/trecg/2019_09_11_10_59_55/trecg_BtoA_best.pth RESUME_PATH_B : /home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/checkpoints/trecg/2019_09_11_10_47_03/trecg_AtoB_best.pth NO_FC : True INIT_EPOCH : True START_EPOCH : 1 ROUND : 1 MANUAL_SEED : 8790 NITER : 20 NITER_DECAY : 80 NITER_TOTAL : 100 LOSS_TYPES : ['CLS', 'SEMANTIC'] EVALUATE : True USE_FAKE_DATA : False CLASS_WEIGHTS_TRAIN : None PRINT_FREQ : 100 NO_VIS : False CAL_LOSS : True SAVE_BEST : True INFERENCE : False ALPHA_CLS : 1 WHICH_CONTENT_NET : resnet18 CONTENT_LAYERS : 0,1,2,3,4 NITER_START_CONTENT : 1 NITER_END_CONTENT : 200 ALPHA_CONTENT : 10 NO_LSGAN : True NITER_START_GAN : 1 NITER_END_GAN : 200 ALPHA_GAN : 1 NITER_START_PIX2PIX : 1 NITER_END_PIX2PIX : 200 ALPHA_PIX2PIX : 5 parse : <bound method DefaultConfig.parse of <config.default_config.DefaultConfig object at 0x7f5a832f25c0>> device_ids: 2 fusion

请教下哪里设置得不对,万分感谢!🙏

ownstyledu commented 5 years ago

你好,多谢关注。 1)LR的问题应该是这样,我在后面的重构的时候更新LR的step由epoch改成了train_iters(参见fusion.py的代码),对单模态的训练初始值大约是 NITER : 1600,NITER_DECAY : 6400,NITER_TOTAL : 8000。使用这样的参数应该就不会出现负的LR的问题, 抱歉造成的不便,后面我会把传参的关键词修改一下。 2)融合效果不对的问题,我觉得很有可能是在load 两个trecgnet model的时候的,在选择是否当时保存的model是dataparalled环境下的那个bool参数没设置好导致的,即keep_kw_module那个参数的设置(因为大家在train 单模态网络的时候是否使用多GPU是不确定的,所以增加了这个参数)。可以通过debug的方式看看model load完之后weight有没有更新,或者直观的方式是看看两个model生成的image是否在加载后就能正常生成。

CongFang commented 5 years ago

谢谢。 1)关于第一个LR的问题已经解决。 2)按照您的说法,将fusion.py中: super().load_checkpoint(net=self.net_rgb, checkpoint_path=checkpoint_path_A, keep_kw_module=False) super().load_checkpoint(net=self.net_depth, checkpoint_path=checkpoint_path_B, keep_kw_module=False) keep_kw_module= False均改为True后,报错:

Traceback (most recent call last): File "train_fusion.py", line 72, in model = create_model(cfg, writer) File "/home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/model/models.py", line 10, in create_model model = Fusion(cfg, writer) File "/home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/model/fusion.py", line 35, in init super().load_checkpoint(net=self.net_rgb, checkpoint_path=checkpoint_path_A, keep_kw_module=True) File "/home/cfang/works/RGBD/Translate-to-Recognize-Networks-master/model/base_model.py", line 228, in load_checkpoint assert (len(states_ckp) > 0) AssertionError

应该是模型没有load成功。 所以还是改回keep_kw_module=False,目前train_fusion训练到epoch93,mean acc=51.607,比单模型提高得很少。(前阶段训练的两个trecgnet model都没有采用数据AUG)

所以我的新问题是参数:direction = 'AtoB' # AtoB: RGB->Depth

是否对fusion训练有影响?谢谢。

ownstyledu commented 5 years ago

Fusion已经不需要direction这个参数了,代码显式对两个direction的网络进行融合,因为我们没有在融合机制上面做设计,而是直接fix住了encoder,希望可以更好地反映我们学到的特征表达能力(很多融合的工作的最好结果其实都是进一步联合finetune得到的),所以我们最后最好的结果是用的两个加了aug之后的单模态网络,并且在fusion的时候也继续使用aug数据来train classifier的。 另:fusion的训练应该不需要这么多轮迭代,因为fix住encoder只是需要train一个分类器,我记得我们当时30个epoch左右就差不多到了最好结果了

CongFang commented 5 years ago

请问在fusion的时候要使用aug数据train分类器,如何设置参数呢? 我的理解是设置use_fake = True,但是sample_path这个参数(# path of saved TrecgNet model for generating fake images)只能设置一个TrecgNet model,所以训练的时候到底是使用单独使用generated RGB data,或generated depth data,还是两者都有呢?如果使用两种模态的生成数据的话,是不是应该有两个单独设置生成模型path的参数?

ownstyledu commented 5 years ago

你可能看到是之前版本的代码,现在版本的fusion.py里面对于fake_data是使用self.sample_model_AtoB和self.sample_model_BtoA来进行的~

CongFang commented 5 years ago

哦,看明白啦,生成fake_data加载的是resume_path_A和resume_path_B路径中的weights,所以sample_path这个参数对于使用fake_data进行fusion是不起作用的。