{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.md","pages":[{"id":"reading-opening","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","unit":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","unitId":"notebook-blocks/07786a60d0614351a320e5da4ea0ef2d","chapter":"course","number":1}],"aliases":[{"oldId":"b-cbd5f6b1f6aa95d7435e1110","targetId":"b-cbd5f6b1f6aa95d7435e1110","page":"reading-opening","operation":"move","beforeSHA256":"b097cc692a4f43c3eeba08ce9c2e73c631f1bad298a5fb1dec9efa967315dac3","afterSHA256":"b097cc692a4f43c3eeba08ce9c2e73c631f1bad298a5fb1dec9efa967315dac3","reason":"Same source body in authored semantic page"},{"oldId":"b-8bf17caa99e027863126b101","targetId":"b-8bf17caa99e027863126b101","page":"reading-opening","operation":"move","beforeSHA256":"1fe9649cb1238a253aac8aeaca48f08d4d07262dc370d64d561814fa4a212110","afterSHA256":"1fe9649cb1238a253aac8aeaca48f08d4d07262dc370d64d561814fa4a212110","reason":"Same source body in authored semantic page"},{"oldId":"b-4513279886b60abbfd9a0688","targetId":"b-4513279886b60abbfd9a0688","page":"reading-opening","operation":"move","beforeSHA256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","afterSHA256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","reason":"Same source body in authored semantic page"},{"oldId":"b-156d02038780cceaf0fab7d0","targetId":"b-156d02038780cceaf0fab7d0","page":"reading-opening","operation":"move","beforeSHA256":"90e8ba62b9af4bedd5be3a2559568519f4df7a42b13048f81039496efd45dea2","afterSHA256":"90e8ba62b9af4bedd5be3a2559568519f4df7a42b13048f81039496efd45dea2","reason":"Same source body in authored semantic page"},{"oldId":"b-bdb3517b976f07126f8e52f4","targetId":"b-bdb3517b976f07126f8e52f4","page":"reading-opening","operation":"move","beforeSHA256":"230d2735d75681058289c5ed8cba5733565164e34ad5d90cb2ee8331665da334","afterSHA256":"230d2735d75681058289c5ed8cba5733565164e34ad5d90cb2ee8331665da334","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-cbd5f6b1f6aa95d7435e1110","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html#b-cbd5f6b1f6aa95d7435e1110","content":"[LAB 04 · CLIP：候选、提示与关系检验](/course/notebooks/0ba963931ddf4866b507b210d93a43bf.html)","sha256":"b097cc692a4f43c3eeba08ce9c2e73c631f1bad298a5fb1dec9efa967315dac3","chapter":{"id":"course","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"unit":{"id":"notebook-blocks/07786a60d0614351a320e5da4ea0ef2d","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"page":{"id":"reading-opening","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","number":1},"sectionTitle":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","currentQuestion":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-8bf17caa99e027863126b101","prerequisites":[],"relatedBlocks":[]},{"id":"b-8bf17caa99e027863126b101","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html#b-8bf17caa99e027863126b101","content":"# 3 · 可选：固定模型，重算四个候选条件 · 实现代码","sha256":"1fe9649cb1238a253aac8aeaca48f08d4d07262dc370d64d561814fa4a212110","chapter":{"id":"course","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"unit":{"id":"notebook-blocks/07786a60d0614351a320e5da4ea0ef2d","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"page":{"id":"reading-opening","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","number":1},"sectionTitle":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","currentQuestion":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-cbd5f6b1f6aa95d7435e1110","nextBlock":"b-4513279886b60abbfd9a0688","prerequisites":[{"id":"b-cbd5f6b1f6aa95d7435e1110","url":"#b-cbd5f6b1f6aa95d7435e1110","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-4513279886b60abbfd9a0688","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html#b-4513279886b60abbfd9a0688","content":"主线阅读与优先实验","sha256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","chapter":{"id":"course","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"unit":{"id":"notebook-blocks/07786a60d0614351a320e5da4ea0ef2d","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"page":{"id":"reading-opening","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","number":1},"sectionTitle":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","currentQuestion":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-8bf17caa99e027863126b101","nextBlock":"b-156d02038780cceaf0fab7d0","prerequisites":[{"id":"b-8bf17caa99e027863126b101","url":"#b-8bf17caa99e027863126b101","role":"section-title"},{"id":"b-cbd5f6b1f6aa95d7435e1110","url":"#b-cbd5f6b1f6aa95d7435e1110","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-156d02038780cceaf0fab7d0","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html#b-156d02038780cceaf0fab7d0","content":"真实CLIP输入/权重/分数、候选改动、四条件规则与独立关系推理","sha256":"90e8ba62b9af4bedd5be3a2559568519f4df7a42b13048f81039496efd45dea2","chapter":{"id":"course","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"unit":{"id":"notebook-blocks/07786a60d0614351a320e5da4ea0ef2d","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"page":{"id":"reading-opening","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","number":1},"sectionTitle":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","currentQuestion":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-4513279886b60abbfd9a0688","nextBlock":"b-bdb3517b976f07126f8e52f4","prerequisites":[{"id":"b-8bf17caa99e027863126b101","url":"#b-8bf17caa99e027863126b101","role":"section-title"},{"id":"b-cbd5f6b1f6aa95d7435e1110","url":"#b-cbd5f6b1f6aa95d7435e1110","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-bdb3517b976f07126f8e52f4","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/07786a60d0614351a320e5da4ea0ef2d.html#b-bdb3517b976f07126f8e52f4","content":"```\nRUN_CLIP=False  # 已下载固定权重后改 True；默认只核对准备与预处理。\nif RUN_CLIP:\n    from transformers import CLIPModel, CLIPProcessor, CLIPImageProcessor, AutoTokenizer\n    from PIL import Image\n    REVISION='3d74acf9a28c67741b2f4f2ea7635f0aaf6f0268'\n    local=ROOT/'.model-cache'/REVISION\n    assert (local/'pytorch_model.bin').exists(), '先运行 python fetch_clip.py；本单元不伪造相似度。'\n    assert sha_file(local/'pytorch_model.bin')==provenance['model_sha256'], '权重 SHA-256 不匹配，停止。'\n    clip_model=CLIPModel.from_pretrained(local,local_files_only=True).eval()\n    # Make the teacher run's slow image processing + fast tokenizer explicit.\n    # A shared use_fast=False would also change the tokenizer; keep each choice separate.\n    clip_processor=CLIPProcessor(\n        image_processor=CLIPImageProcessor.from_pretrained(local,local_files_only=True),\n        tokenizer=AutoTokenizer.from_pretrained(local,local_files_only=True,use_fast=True))\n    for parameter in clip_model.parameters():parameter.requires_grad_(False)\n    photo=Image.open(ROOT/'assets/chelsea-cat.png').convert('RGB')\n    image_inputs=clip_processor(images=photo,return_tensors='pt')\n    arms={\n      'A_base':(['cat','dog','horse'],'a photo of a {}.'),\n      'B_expand_only':(['cat','dog','horse','tiger','fox'],'a photo of a {}.'),\n      'C_prompt_only':(['cat','dog','horse'],'a cropped photo of a {}.'),\n      'D_remove_cat':(['dog','horse','tiger','fox'],'a photo of a {}.')}\n    clip_records={}\n    with torch.no_grad():\n        image_feature=clip_model.get_image_features(**image_inputs)\n        image_feature=image_feature/image_feature.norm(dim=-1,keepdim=True)\n        scale=float(clip_model.logit_scale.exp())\n        for arm,(names,template) in arms.items():\n            prompts=[template.format(name) for name in names]\n            text_inputs=clip_processor(text=prompts,return_tensors='pt',padding=True)\n            text_features=clip_model.get_text_features(**text_inputs)\n            text_features=text_features/text_features.norm(dim=-1,keepdim=True)\n            cosine=(image_feature@text_features.T).squeeze(0)\n            probabilities=(cosine*scale).softmax(-1)\n            clip_records[arm]={'candidate_names':names,'prompts':prompts,'cosine':cosine.tolist(),\n              'softmax':probabilities.tolist(),'top1':names[int(cosine.argmax())]}\n    assert np.allclose(clip_records['A_base']['cosine'],clip_records['B_expand_only']['cosine'][:3],atol=2e-6)\n    clip_result={'status':'actually run locally on CPU','model_repo':'openai/clip-vit-base-patch32','revision':REVISION,\n      'model_sha256':sha_file(local/'pytorch_model.bin'),'image_sha256':sha_file(ROOT/'assets/chelsea-cat.png'),\n      'image_source':'scikit-image v0.25.2 chelsea.png; Stefan van der Walt; CC0','logit_scale':scale,\n      'arms':clip_records,'limitations':['one image; no dataset-level accuracy estimate','relative candidate scores are not open-set certainty']}\n    (OUT/'clip-results.json').write_text(json.dumps(clip_result,indent=2))\n    fig,axes=plt.subplots(1,3,figsize=(12,3.8));axes[0].imshow(photo);axes[0].axis('off');axes[0].set_title('Same real photograph in all arms')\n    for arm,color in [('A_base',BLUE),('B_expand_only',GOLD)]:\n        rr=clip_records[arm]; loc=np.arange(len(rr['candidate_names']))\n        axes[1].plot(loc,rr['cosine'],marker='o',label=arm,color=color)\n        axes[2].plot(loc,rr['softmax'],marker='o',label=arm,color=color)\n    for ax,title in zip(axes[1:],['Shared cosine remains fixed','Relative softmax changes']):\n        ax.set(xticks=range(5),xticklabels=arms['B_expand_only'][0],title=title);ax.legend(fontsize=8);ax.grid(alpha=.18)\n    axes[1].set_ylabel('Cosine similarity');axes[2].set_ylabel('Softmax over chosen candidates')\n    savefig('05-clip-candidates.png')\n    print('Actual checkpoint SHA-256:',clip_result['model_sha256'])\n    print('arm | top1 | candidate : cosine / softmax')\n    for arm,r in clip_records.items():\n        print(arm,r['top1'],[(name,round(co,4),round(pr,4)) for name,co,pr in zip(r['candidate_names'],r['cosine'],r['softmax'])])\nelse:\n    print('CLIP 未运行：请不要将空结果写成真实相似度。')\n```","sha256":"230d2735d75681058289c5ed8cba5733565164e34ad5d90cb2ee8331665da334","chapter":{"id":"course","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"unit":{"id":"notebook-blocks/07786a60d0614351a320e5da4ea0ef2d","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码"},"page":{"id":"reading-opening","title":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","number":1},"sectionTitle":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","currentQuestion":"3 · 可选：固定模型，重算四个候选条件 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-156d02038780cceaf0fab7d0","nextBlock":null,"prerequisites":[{"id":"b-8bf17caa99e027863126b101","url":"#b-8bf17caa99e027863126b101","role":"section-title"},{"id":"b-cbd5f6b1f6aa95d7435e1110","url":"#b-cbd5f6b1f6aa95d7435e1110","role":"problem-context"}],"relatedBlocks":[]}]}
