924973292 / TOP-ReID

【AAAI2024】TOP-ReID: Multi-spectral Object Re-Identification with Token Permutation
MIT License
52 stars 2 forks source link

Loss become nan after epoch 5 #1

Closed YPQ-XJTU closed 10 months ago

YPQ-XJTU commented 11 months ago

,作者你好,这个loss值为什么会变成nan呀,然后后续就没法训练了 2023-12-20 20:47:31,494 TOPReID.train INFO: Epoch[5] Iteration[220/467] Loss: 12.059, Acc: 0.090, Base Lr: 4.54e-03 2023-12-20 20:47:34,031 TOPReID.train INFO: Epoch[5] Iteration[230/467] Loss: 12.079, Acc: 0.091, Base Lr: 4.54e-03 2023-12-20 20:47:36,352 TOPReID.train INFO: Epoch[5] Iteration[240/467] Loss: 12.083, Acc: 0.094, Base Lr: 4.54e-03 2023-12-20 20:47:38,620 TOPReID.train INFO: Epoch[5] Iteration[250/467] Loss: 12.088, Acc: 0.093, Base Lr: 4.54e-03 2023-12-20 20:47:40,840 TOPReID.train INFO: Epoch[5] Iteration[260/467] Loss: 12.088, Acc: 0.094, Base Lr: 4.54e-03 2023-12-20 20:47:43,109 TOPReID.train INFO: Epoch[5] Iteration[270/467] Loss: 12.081, Acc: 0.097, Base Lr: 4.54e-03 2023-12-20 20:47:45,347 TOPReID.train INFO: Epoch[5] Iteration[280/467] Loss: 12.085, Acc: 0.097, Base Lr: 4.54e-03 2023-12-20 20:47:47,577 TOPReID.train INFO: Epoch[5] Iteration[290/467] Loss: 12.044, Acc: 0.101, Base Lr: 4.54e-03 2023-12-20 20:47:49,812 TOPReID.train INFO: Epoch[5] Iteration[300/467] Loss: 12.004, Acc: 0.105, Base Lr: 4.54e-03 2023-12-20 20:47:52,076 TOPReID.train INFO: Epoch[5] Iteration[310/467] Loss: 11.984, Acc: 0.107, Base Lr: 4.54e-03 2023-12-20 20:47:54,407 TOPReID.train INFO: Epoch[5] Iteration[320/467] Loss: 12.036, Acc: 0.105, Base Lr: 4.54e-03 2023-12-20 20:47:56,719 TOPReID.train INFO: Epoch[5] Iteration[330/467] Loss: 11.981, Acc: 0.110, Base Lr: 4.54e-03 2023-12-20 20:47:59,026 TOPReID.train INFO: Epoch[5] Iteration[340/467] Loss: 11.942, Acc: 0.112, Base Lr: 4.54e-03 2023-12-20 20:48:01,340 TOPReID.train INFO: Epoch[5] Iteration[350/467] Loss: 11.952, Acc: 0.113, Base Lr: 4.54e-03 2023-12-20 20:48:03,608 TOPReID.train INFO: Epoch[5] Iteration[360/467] Loss: 11.969, Acc: 0.114, Base Lr: 4.54e-03 2023-12-20 20:48:05,890 TOPReID.train INFO: Epoch[5] Iteration[370/467] Loss: 11.972, Acc: 0.115, Base Lr: 4.54e-03 2023-12-20 20:48:08,220 TOPReID.train INFO: Epoch[5] Iteration[380/467] Loss: 11.973, Acc: 0.117, Base Lr: 4.54e-03 2023-12-20 20:48:10,924 TOPReID.train INFO: Epoch[5] Iteration[390/467] Loss: nan, Acc: 0.119, Base Lr: 4.54e-03 2023-12-20 20:48:13,460 TOPReID.train INFO: Epoch[5] Iteration[400/467] Loss: nan, Acc: 0.118, Base Lr: 4.54e-03 2023-12-20 20:48:16,017 TOPReID.train INFO: Epoch[5] Iteration[410/467] Loss: nan, Acc: 0.117, Base Lr: 4.54e-03 2023-12-20 20:48:18,330 TOPReID.train INFO: Epoch[5] Iteration[420/467] Loss: nan, Acc: 0.116, Base Lr: 4.54e-03 2023-12-20 20:48:20,523 TOPReID.train INFO: Epoch[5] Iteration[430/467] Loss: nan, Acc: 0.114, Base Lr: 4.54e-03 2023-12-20 20:48:22,702 TOPReID.train INFO: Epoch[5] Iteration[440/467] Loss: nan, Acc: 0.113, Base Lr: 4.54e-03 2023-12-20 20:48:24,788 TOPReID.train INFO: Epoch[5] Iteration[450/467] Loss: nan, Acc: 0.113, Base Lr: 4.54e-03 2023-12-20 20:48:26,848 TOPReID.train INFO: Epoch[5] Iteration[460/467] Loss: nan, Acc: 0.111, Base Lr: 4.54e-03 2023-12-20 20:48:28,197 TOPReID.train INFO: Epoch 5 done. Time per batch: 0.232[s] Speed: 34.5[samples/s] The test feature is normalized => Computing DistMat with euclidean_distance 2023-12-20 20:48:36,559 TOPReID.train INFO: Validation Results - Epoch: 5 2023-12-20 20:48:36,559 TOPReID.train INFO: mAP: 2.9% 2023-12-20 20:48:36,559 TOPReID.train INFO: CMC curve, Rank-1 :0.4% 2023-12-20 20:48:36,559 TOPReID.train INFO: CMC curve, Rank-5 :2.9% 2023-12-20 20:48:36,559 TOPReID.train INFO: CMC curve, Rank-10 :5.3% 2023-12-20 20:48:42,327 TOPReID.train INFO: Best mAP: 2.9% 2023-12-20 20:48:42,327 TOPReID.train INFO: Best Rank-1: 0.4% 2023-12-20 20:48:42,327 TOPReID.train INFO: Best Rank-5: 2.9% 2023-12-20 20:48:42,327 TOPReID.train INFO: Best Rank-10: 5.3% 2023-12-20 20:48:45,848 TOPReID.train INFO: Epoch[6] Iteration[10/467] Loss: nan, Acc: 0.062, Base Lr: 5.44e-03 2023-12-20 20:48:48,229 TOPReID.train INFO: Epoch[6] Iteration[20/467] Loss: nan, Acc: 0.056, Base Lr: 5.44e-03 2023-12-20 20:48:50,266 TOPReID.train INFO: Epoch[6] Iteration[30/467] Loss: nan, Acc: 0.038, Base Lr: 5.44e-03 2023-12-20 20:48:52,340 TOPReID.train INFO: Epoch[6] Iteration[40/467] Loss: nan, Acc: 0.053, Base Lr: 5.44e-03 2023-12-20 20:48:54,402 TOPReID.train INFO: Epoch[6] Iteration[50/467] Loss: nan, Acc: 0.045, Base Lr: 5.44e-03 2023-12-20 20:48:56,483 TOPReID.train INFO: Epoch[6] Iteration[60/467] Loss: nan, Acc: 0.044, Base Lr: 5.44e-03 2023-12-20 20:48:58,516 TOPReID.train INFO: Epoch[6] Iteration[70/467] Loss: nan, Acc: 0.038, Base Lr: 5.44e-03 2023-12-20 20:49:00,559 TOPReID.train INFO: Epoch[6] Iteration[80/467] Loss: nan, Acc: 0.033, Base Lr: 5.44e-03 2023-12-20 20:49:02,623 TOPReID.train INFO: Epoch[6] Iteration[90/467] Loss: nan, Acc: 0.032, Base Lr: 5.44e-03

YPQ-XJTU commented 11 months ago

我的命令就是默认的,python train_net.py --config_file ./configs/RGBNT201/TOP-ReID.yml

924973292 commented 11 months ago

需要注意样本个数,您的iteration看起来较大,可以看我提供的训练样例,RGBNT201上的batch_size可能没有调整正确

YPQ-XJTU commented 11 months ago

这个训练结果和batch_size的关系很大吗?那我可能需要换个更好的显卡,显存不太够,您用的是单张显卡吗?我看默认的是单gpu训练

924973292 commented 11 months ago

需要注意,batch_size影响在这个领域内应该是较大的,因为通常我们涉及到使用 triplet loss的采样器,文中默认的配置是 batch_size 为128,其中包含8个ID,也就是每个ID一个批次会有16张图像进来,而triplet loss涉及到将同ID特征拉近,不同ID特征拉远的过程,如果您的batch_size过小,有可能导致训练崩溃,关于triplet 中采样的设置,我们基本follow了 TransReID中的设置。 我用的是两张A800,不过代码默认单卡,也可以多卡训练。

YPQ-XJTU commented 11 months ago

好的,感谢您的解答

924973292 commented 11 months ago

如果有其他问题,欢迎继续询问,也可以发我的个人邮件进行详细沟通,我在A800、A100等多台机器上复现过原始结果,如果显存不够,你可以尝试将batch_size调小,但是您的训练过程图中的 iteration[10/467] 总iter数字过大,正常来说应该是20左右,所以应该是采样器的配置不正确,您可以检查相关设置,也可以跟我提供的样例比对。

YPQ-XJTU commented 11 months ago

感谢您的解答,确实采样配置问题,目前训练一切正常和您提供的train.txt匹配,我的显卡是3090ti,batch_size设置为64可以正常运行,因为这个单卡训练也挺快的,所以暂时不用考虑多卡训练的问题了

one-salted-fish commented 11 months ago

需要注意,batch_size影响在这个领域内应该是较大的,因为通常我们涉及到使用 triplet loss的采样器,文中默认的配置是 batch_size 为128,其中包含8个ID,也就是每个ID一个批次会有16张图像进来,而triplet loss涉及到将同ID特征拉近,不同ID特征拉远的过程,如果您的batch_size过小,有可能导致训练崩溃,关于triplet 中采样的设置,我们基本follow了 TransReID中的设置。 我用的是两张A800,不过代码默认单卡,也可以多卡训练。

您好,因为之前的工作如IEEE设置的batch size只有8,而TOP-ReID设置为128,并且使用了ViT作为backbone,进行对比是不是太不公平了(捂脸哭 另,batch size128的时候,需要多少显存才能跑起来呢?

924973292 commented 11 months ago

1.对比公平问题: a.首先IEEE并没有使用triplet loss来对模型进行约束,而是通过提出的3M loss等约束来实现特征聚合,然而我们发现triplet loss对于多模态行人重识别这个任务,尤其是RGBNT201数据集上,是非常有效的,这个实际上在NeurIPS 2023 UniReps: UniCat: Crafting a Stronger Fusion Baseline for Multimodal Re-Identification 中也有表现(同样使用ViT作为骨干);

截屏2023-12-21 15 42 49

b.我在实验时为了对比公平,曾利用IEEE释放的原始代码,在同样设置下跑过实验,也就是batch_size为128,而结果没有较大波动,mAP基本围绕原始文章中3个点以内波动,因此我认为triplet loss的使用实际上很关键; c.事实上我们做的不仅是行人重识别,还有车辆重识别,您在论文中也可以看到,在RGBNT201上比较的模型基本都是CNN结构的,这个领域大家还没有太多尝试用ViT的,但是在车辆重识别RGBNT100、msvr310上已经有几篇文章采用了ViT的骨干,并且涉及到了 triplet loss的使用,因此为了统一对齐,我们采用了最终的实验设置; d.鉴于多模态行人领域没有使用ViT进行尝试,因此我们在文中表格列出了使用多种ViT-based 骨干的实验结果,来帮助大家研究; e.您可以查看我总结的多模态方法的仓库,里面有涉及到我说的文章;

截屏2023-12-21 16 06 37

2.显存设置:

截屏2023-12-21 15 40 53

如果还有疑问请继续指出!

one-salted-fish commented 11 months ago

感谢回复。在复现过程中,出现相同设置下两次训练结果不一致的问题(不可复现),我使用了两张卡基于nn.DataParallel进行训练。之前使用TransReID的时候,我曾经遇到过该问题,一段时间后莫名其妙的解决了(可以复现了),请问作者有没有遇到过该问题?

924973292 commented 11 months ago

遇到过,我觉得有可能是底层的环境中某部分被更改了,还有可能是,我关注到 num_workers的设置,可能对结果产生一定影响,这个我不确定具体的原理,可能是采样过程中,样本加载进来的顺序变了,但是我们的模型是一个批次一个批次处理数据的,一些和batch有关的模块可能会导致相同图片的特征不同,最终影响实验结果,这个有待讨论

截屏2023-12-21 16 35 58

经过长时间对该系统的训练与测试,我觉得主要问题出现在TransReID在训练时引入的混合精度训练,一些外来的模块中可能存在一些强制的数据类型转换,在大量的运算中会引入复杂的数值舍入,在每次的训练过程中,这些数值的微小变化会导致网络的训练产生较大的影响。

924973292 commented 11 months ago

为了使用单卡运行,你可以调整batch_size为64的同时,将number_instances调整为8,来确保相对稳定的训练过程,此时的显存占用小于24G

qsdsatom commented 11 months ago

您好,可以提供您在A100大卡和4090小卡上面训练的配置吗,我在这些机器上对RGBNT201和RGBNT100尝试了128和64的BatchSize,都不能出复现文中的结果,差异很大。 image

924973292 commented 11 months ago

同学您好,新年快乐🎉🎉🎉🎉 感谢您对我们工作的认真复现,您的结果看起来有些奇怪,有些同学已经跟我反馈bs_64,ni_8的结果,虽然有点波动,但是不像您的实验结果中差距这么大,我建议您认真检查一下配置文件,如果没有改动代码,需要注意的点可能如下: 1.是否正确加载预训练权重 2.是否在测试中选择了某种缺失模态测试 3.num_worker的影响 4.骨干网络可以替换为单个Transformer试试 5.TPM与CRM初始化的时候可以尝试去掉self.apply(self._init_weights) 如果还有问题可以发邮件跟我详细沟通!我刚在A800的新机器上进行了尝试,配置文件没有改变,num_worker设置为14,TPM与CRM去掉了self.apply(self._init_weights)来使用随机初始化(可选),以下是训练时的log,里面有配置信息: train_public_RGBNT201.txt

截屏2024-01-02 14 39 53

这里是可检验的权重文件 --> 链接: https://pan.baidu.com/s/1nJxrN5_dvokyR2v8o3G_Gg 提取码: 9cma 如果您觉得有用的话,可以给我的项目star一下,您也可以看下我总结的多模态重识别仓库,我会持续跟新最新内容😄😄😄😄

qsdsatom commented 11 months ago

新年快乐!感谢您的回复,更换了pytorch的版本后,RGBNT201上的精度正常了。 image

1024AILab commented 10 months ago

@qsdsatom 能请教下您的pytorch版本和GPU型号吗?我用单卡RTX 3090 batchsize为64训精度也不如A100。