OFA-Sys / Chinese-CLIP

Chinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation.
MIT License
4.38k stars 453 forks source link

关于ACC和R@5的问题 #297

Open EasonTuT opened 5 months ago

EasonTuT commented 5 months ago

验证集和训练集的ACC都达到了80+,但是在测试集和验证集中R@5评分只有18分和9分,请问是什么问题呢?应该如何解决呢

ChesonHuang commented 5 months ago

给下你的valid_texts.jsonl中的2-3条数据看看,我之前遇到这样的问题是,在json里面,一个文本只对应了少部分数据,但实际一个文本应该对应所有数据。例如,在验证集中,如果你的一个文本,对应了 5 个图片,那么这5个图片都要放在image_ids里面,你可以看实现逻辑:即 ground_truth_ids里面的数据少了,所以导致recall分数低 image

EasonTuT commented 5 months ago

@ChesonHuang 我get到你的意思,但是我用的数据集中一张图片只对应一个image_ids,train、valid和test都是如此,而在fitfune过程中ACC是显示80多的,我用R@1计算出来更低只有0.几分,下面是我的训练记录和对应的json情况。 这是微调记录:

image

下面是valid的json: image 下面是train的json: image 我不知道什么原因导致如此ACC和R@间的分数相差如此之大

keminze commented 5 months ago

验证集和训练集的ACC都达到了80+,但是在测试集和验证集中R@5分只有18分和9分,请问是什么问题呢?应该如何解决呢?

请问你的参数设在是怎样的

EasonTuT commented 5 months ago

@ChesonHuang @keminze image 这是我运行脚本得出来的召回分数 是用微调后的权重的

EasonTuT commented 5 months ago

@keminze image

timecoderr commented 5 months ago

@ChesonHuang @keminze image 这是我运行脚本得出来的召回分数 是用微调后的权重的

你好,我遇到了同样的问题,请问您发现错误 解决了吗? 感谢!

ChesonHuang commented 5 months ago

@ChesonHuang @keminze image 这是我运行脚本得出来的召回分数 是用微调后的权重的

你好,我遇到了同样的问题,请问您发现错误 解决了吗? 感谢!

建议你在 cn_clip/eval/evaluation.py 或 cn_clip/eval/evaluation_tr.py, 打印下 ground_truth_ids 和 top10_pred_ids 看看,或许它可以告诉真相

hkxxxxx commented 5 months ago

Snipaste_2024-04-21_18-46-40 dan'qi'shi但其实我输出后也就是这样,应该没问题吧,因为他标签都是一对一的

ChesonHuang commented 5 months ago

Snipaste_2024-04-21_18-46-40 dan'qi'shi但其实我输出后也就是这样,应该没问题吧,因为他标签都是一对一的

有问题的,你的图片id是: 140010041888, 但你模型预测的top10里面没有这个图片id,所以r@x都是0;说明你训练的模型预测不准确

update: 还有一种可能是,输入的图片必须存在valid数据集对应文本的image_ids里面,但140010041888这个图片并没有在image_ids中

hkxxxxx commented 5 months ago

嗯,应该是模型训练的问题,查140010041888上面是有的,不然他就会报错了

keminze commented 5 months ago

@ChesonHuang @keminze image 这是我运行脚本得出来的召回分数 是用微调后的权重的

你的训练集和验证集的文本处理方式是一样的吗

hkxxxxx commented 5 months ago

是一样的,我一起处理的

hkxxxxx commented 5 months ago

所以他这个Acc到底是怎么计算的?是什么的准确率?Acc和R@N之间有必然的联系吗

hellomuyi commented 1 month ago

这个应该是这样的,训练的时候,那些acc指标都是在一个batch内做召回,因为候选池比较小所以指标数值很大。训练完后那个evaluation.py是在全量测试集中做recall@k的召回,自然指标降了