先看现象。用 open_clip 2.26 加载 ViT-B-32,对 500 组图文对算 cosine 相似度,结果正样本和负样本都落在 0.19 到 0.24 之间,排序几乎随机,图片和文本都做过归一化。

这类报错背后常见的原因有几处,逐个排除就行。图像预处理没按模型卡做,均值方差对不上。也可能是文本只截断到 77 token,长描述后半段被丢掉。

不容易想到的是,相似度没有做 logit_scale 缩放,直接看 cosine。

还有一种情况,同批次里正负样本混算,阈值被整体拉平。

动手时先确认预处理参数与模型卡一致

python -c "import open_clip;m,_,p=open_clip.create_model_and_transforms('ViT-B-32',pretrained='openai');print(p)"

接着按 logit_scale 放大后再看分布

python -c "import torch;print(torch.exp(torch.tensor(100.0)))"

然后打印正负样本分数的分位数

python -c "import numpy as np;a=np.array([0.21,0.19,0.23]);print(np.percentile(a,[10,50,90]))"

末了用官方 demo 图验一次是否复现

python -c "print('run open_clip demo with cat.jpg')"

恢复的判定其实很直接。正样本平均分明显高于负样本,前 10 分位与后 10 分位拉开 0.05 以上,人工抽 20 组排序正确率超过八成。

CLIP 的 cosine 绝对值本来就不大,判断要看相对排序,直接拿 0.3 当阈值一定会误判。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189