{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.md","pages":[{"id":"reading-opening","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","unit":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","unitId":"notebook-blocks/ef7e95916f594784b1269ebf22f89911","chapter":"course","number":1}],"aliases":[{"oldId":"b-300b342bd0a5ee230770ba6c","targetId":"b-300b342bd0a5ee230770ba6c","page":"reading-opening","operation":"move","beforeSHA256":"926fc2429c1a5c837765e5152b3b61fda31c10537785a439d49dec46e82a8536","afterSHA256":"926fc2429c1a5c837765e5152b3b61fda31c10537785a439d49dec46e82a8536","reason":"Same source body in authored semantic page"},{"oldId":"b-ac46e9a97c7f3d6e8d271ca1","targetId":"b-ac46e9a97c7f3d6e8d271ca1","page":"reading-opening","operation":"move","beforeSHA256":"dbe246a29fe103f7054d5584081541dd20bb1145a65e9eafb8632a907832f41c","afterSHA256":"dbe246a29fe103f7054d5584081541dd20bb1145a65e9eafb8632a907832f41c","reason":"Same source body in authored semantic page"},{"oldId":"b-c50dbda424fb661ed86a874e","targetId":"b-c50dbda424fb661ed86a874e","page":"reading-opening","operation":"move","beforeSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","afterSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","reason":"Same source body in authored semantic page"},{"oldId":"b-d3062bee3b0d69afb2821d70","targetId":"b-d3062bee3b0d69afb2821d70","page":"reading-opening","operation":"move","beforeSHA256":"5790b0afb52508f0174b1bc581f7847035a51c5c2a46e5c821bcd9d5d61bcbb0","afterSHA256":"5790b0afb52508f0174b1bc581f7847035a51c5c2a46e5c821bcd9d5d61bcbb0","reason":"Same source body in authored semantic page"},{"oldId":"b-eea4d029d80517aeff6e1108","targetId":"b-eea4d029d80517aeff6e1108","page":"reading-opening","operation":"move","beforeSHA256":"36c815acc00c365f774968586f380e1fed0fcacf2b8ed3f268abf3b2845d3299","afterSHA256":"36c815acc00c365f774968586f380e1fed0fcacf2b8ed3f268abf3b2845d3299","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-300b342bd0a5ee230770ba6c","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html#b-300b342bd0a5ee230770ba6c","content":"[LAB 14 · 图像问答：视觉条件与问题先验](/course/notebooks/11d9f74871544a77b42024a9fe06b81a.html)","sha256":"926fc2429c1a5c837765e5152b3b61fda31c10537785a439d49dec46e82a8536","chapter":{"id":"course","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"unit":{"id":"notebook-blocks/ef7e95916f594784b1269ebf22f89911","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"page":{"id":"reading-opening","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","number":1},"sectionTitle":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","currentQuestion":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-ac46e9a97c7f3d6e8d271ca1","prerequisites":[],"relatedBlocks":[]},{"id":"b-ac46e9a97c7f3d6e8d271ca1","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html#b-ac46e9a97c7f3d6e8d271ca1","content":"# 2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","sha256":"dbe246a29fe103f7054d5584081541dd20bb1145a65e9eafb8632a907832f41c","chapter":{"id":"course","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"unit":{"id":"notebook-blocks/ef7e95916f594784b1269ebf22f89911","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"page":{"id":"reading-opening","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","number":1},"sectionTitle":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","currentQuestion":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-300b342bd0a5ee230770ba6c","nextBlock":"b-c50dbda424fb661ed86a874e","prerequisites":[{"id":"b-300b342bd0a5ee230770ba6c","url":"#b-300b342bd0a5ee230770ba6c","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-c50dbda424fb661ed86a874e","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html#b-c50dbda424fb661ed86a874e","content":"按问题继续","sha256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","chapter":{"id":"course","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"unit":{"id":"notebook-blocks/ef7e95916f594784b1269ebf22f89911","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"page":{"id":"reading-opening","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","number":1},"sectionTitle":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","currentQuestion":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-ac46e9a97c7f3d6e8d271ca1","nextBlock":"b-d3062bee3b0d69afb2821d70","prerequisites":[{"id":"b-ac46e9a97c7f3d6e8d271ca1","url":"#b-ac46e9a97c7f3d6e8d271ca1","role":"section-title"},{"id":"b-300b342bd0a5ee230770ba6c","url":"#b-300b342bd0a5ee230770ba6c","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-d3062bee3b0d69afb2821d70","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html#b-d3062bee3b0d69afb2821d70","content":"RGB+问题输入、question-only对照、同图换问与同问换图","sha256":"5790b0afb52508f0174b1bc581f7847035a51c5c2a46e5c821bcd9d5d61bcbb0","chapter":{"id":"course","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"unit":{"id":"notebook-blocks/ef7e95916f594784b1269ebf22f89911","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"page":{"id":"reading-opening","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","number":1},"sectionTitle":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","currentQuestion":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-c50dbda424fb661ed86a874e","nextBlock":"b-eea4d029d80517aeff6e1108","prerequisites":[{"id":"b-ac46e9a97c7f3d6e8d271ca1","url":"#b-ac46e9a97c7f3d6e8d271ca1","role":"section-title"},{"id":"b-300b342bd0a5ee230770ba6c","url":"#b-300b342bd0a5ee230770ba6c","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-eea4d029d80517aeff6e1108","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/ef7e95916f594784b1269ebf22f89911.html#b-eea4d029d80517aeff6e1108","content":"```\ndef draw_scene(count,left_color,right_shape,rng):\n    img=Image.new('RGB',(40,32),(244,242,236));d=ImageDraw.Draw(img)\n    slots=[10] if count==1 else [10,30]\n    for j,cx in enumerate(slots):\n        cy=16+int(rng.integers(-3,4));r=int(rng.integers(4,7));cx+=int(rng.integers(-1,2))\n        color=left_color if j==0 else str(rng.choice(list(COLORS)))\n        shape=right_shape if j==len(slots)-1 else str(rng.choice(['square','circle']))\n        box=(cx-r,cy-r,cx+r,cy+r)\n        if shape=='square':d.rectangle(box,fill=COLORS[color])\n        else:d.ellipse(box,fill=COLORS[color])\n    arr=np.array(img,dtype=np.float32)/255\n    return np.clip(arr+rng.normal(0,.014,arr.shape),0,1).astype(np.float32)\n\ndef make_vqa(n,seed,biased):\n    rng=np.random.default_rng(seed);images=[];answers=[];meta=[]\n    # Training has a 75% red prior. Test covers all 12 condition combinations equally.\n    combos=[(c,col,sh) for c in [1,2] for col in COLORS for sh in ['square','circle']]\n    for i in range(n):\n        if biased:\n            count=int(rng.choice([1,2]));color=str(rng.choice(list(COLORS),p=[.75,.125,.125]));shape=str(rng.choice(['square','circle']))\n        else:count,color,shape=combos[i%len(combos)]\n        images.append(draw_scene(count,color,shape,rng))\n        answers.append([A['one' if count==1 else 'two'],A[color],A[shape]])\n        meta.append({'count':count,'left_color':color,'right_shape':shape})\n    return torch.tensor(np.stack(images)).permute(0,3,1,2),torch.tensor(answers),meta\nXtr,Ytr,train_meta=make_vqa(720,14031,True)\nXte,Yte,test_meta=make_vqa(180,14032,False)\ntrain_hashes={hashlib.sha256(x.numpy().tobytes()).hexdigest() for x in Xtr}\nassert not train_hashes.intersection(hashlib.sha256(x.numpy().tobytes()).hexdigest() for x in Xte)\n# Metadata remains only in this data/label construction and plot captions.\n# model.forward receives tensors (pixels, question_id), never these dictionaries.\nnp.savez_compressed(OUT/'lab14-data.npz',train_images=Xtr.numpy(),train_answers=Ytr.numpy(),test_images=Xte.numpy(),test_answers=Yte.numpy())\nprint('train/test image counts:',len(Xtr),len(Xte),'pairs:',Ytr.numel(),Yte.numel())\nprint('train left-color prior:',{c:sum(m['left_color']==c for m in train_meta)/len(train_meta) for c in COLORS})\nprint('test left-color prior:',{c:sum(m['left_color']==c for m in test_meta)/len(test_meta) for c in COLORS})\n```","sha256":"36c815acc00c365f774968586f380e1fed0fcacf2b8ed3f268abf3b2845d3299","chapter":{"id":"course","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"unit":{"id":"notebook-blocks/ef7e95916f594784b1269ebf22f89911","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码"},"page":{"id":"reading-opening","title":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","number":1},"sectionTitle":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","currentQuestion":"2. 先按图像切分，避免同一图的不同问题泄漏 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-d3062bee3b0d69afb2821d70","nextBlock":null,"prerequisites":[{"id":"b-ac46e9a97c7f3d6e8d271ca1","url":"#b-ac46e9a97c7f3d6e8d271ca1","role":"section-title"},{"id":"b-300b342bd0a5ee230770ba6c","url":"#b-300b342bd0a5ee230770ba6c","role":"problem-context"}],"relatedBlocks":[]}]}
