Closed hurryup186 closed 7 months ago
你好~,do_train_stage1的目的是冻住CLIP并学习到一些文本描述,这些文本向量作为模型的参数保存在模型中了,你可以在model/make_model_clip中看到PromptLearner这个类。do_train_stage2首先解冻CLIP,并利用do_train_stage1的文本向量作为语义信息监督做Loss_i2tce。
您好,非常感谢您的解答! 1、我大概明白了您提出的工作原理,但可能我找的不够仔细,没有发现在stage2中具体哪个位置哪里如何会使用stage1中文本向量作为模型的参数保存在模型,不清楚是否会load stage1 所保存的模型呢?如果有相关,那应该是我看的不够仔细造成的,能否请你帮忙指下,具体是在哪里呢?
2、另外根据您之前上传的代码复现,发现在stage1 训练中会打印相关训练信息,但发现相关指数都很低,不清楚这是否是我哪里复现的不正确造成的呢? print( "Performance[ALL]: Rank-1: {:.2%} | Rank-5: {:.2%} | Rank-10: {:.2%}| Rank-20: {:.2%}| mAP: {:.2%}| mINP: {:.2%}".format( cmc[0], cmc[4], cmc[9], cmc[19], mAP, mINP))
1、保存的文本向量你可以理解为模型的参数,先初始化文本向量,然后stage1损失优化后这些向量作为参数属于模型的一部分,不需要手动保存。stage2用的模型是stage1训练之后的模型,同属于一个py文件里面,model用的是同一个,不需要重新load。 2、由于stage1训练中冻结了CLIP模型(只是通过训练得到文本向量),因此这部分的performers效果很低是正常的,这就类似于一个CLIP没有经过微调训练就拿来测试。stage2中我们解冻了CLIP,这一阶段才算训练了模型。
你可以去看一下PromptLearner这个类,或者去看一下CoOp的相关代码解释,对你应该有所帮助。
谢谢您的指导,我先去看看相关的代码和论文
do_train_stage1(args, unlabel_dataset, model, optimizer_1stage, scheduler_1stage)以及 do_train_stage2(args, unlabel_dataset, model, optimizer_2stage, scheduler_2stage, loss_func_rgb, loss_func_ir),想请作者解惑一下,根据两组训练中,第一组do_train_stage1的返回值是一个保存的模型,第二组do_train_stage2最终的保存是训练完成的模型,但我们没有找到第二组和第一组衔接的地方,不太理解stage1和stage2的关系,不明白第二组的工作是以第一组的那些作为基础,还请您抽空帮忙解答一下