OFA-Sys / Chinese-CLIP

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

相同的文本词,使用encode_text产出的结果不一样 #232

Open m3n78amv2 opened 8 months ago

m3n78amv2 commented 8 months ago

我是使用源码安装的cn_clip,然后执行了下面代码

import cn_clip.clip as clip
import torch
import cn_clip
from cn_clip.clip import load_from_name, available_models

# 加载clip模型
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"device: {device}")
model, preprocess_clip = load_from_name("ViT-L-14", device=device, download_root=os.path.dirname(os.path.realpath(__file__)) + "/../assets")

print(f"使用的device: {device}")
print(f"加载clip模型完毕")

for x in range(10):
    text_tokens = cn_clip.clip.tokenize(["侧空翻"]).to(device)
    with torch.no_grad():
        text_features = model.encode_text(text_tokens)
        text_features /= text_features.norm(dim=-1, keepdim=True)
    print(f"{text_features[0][:5]}") # 只输出前五个以方便显示

10次调用模型生成embedding,结果都不一样 image

调试进去看model.encode_text方法,发现387行的self.bert跑出来的结果每次都不一样 image

应该怎么调整参数来保证相同的text产生相同的embedding

jiarenyf commented 7 months ago

模型忘记设置evel()了吧。。。

m3n78amv2 commented 7 months ago

模型忘记设置evel()了吧。。。

是的, 调试到内部时候发现是有一层dropout的问题,eval之后就固定了