{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"两个目标，两个分母 · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.md","pages":[{"id":"reading-opening","title":"两个目标，两个分母 · 实现代码","unit":"两个目标，两个分母 · 实现代码","unitId":"notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676","chapter":"course","number":1}],"aliases":[{"oldId":"b-3784215f7d11cd2f9ee42f91","targetId":"b-3784215f7d11cd2f9ee42f91","page":"reading-opening","operation":"move","beforeSHA256":"4730e90285e279b2564c179018b9df76aafd9db5dd2729f0f687ac380af591ed","afterSHA256":"4730e90285e279b2564c179018b9df76aafd9db5dd2729f0f687ac380af591ed","reason":"Same source body in authored semantic page"},{"oldId":"b-44357ed5ef1ae9cbe4bd8fbb","targetId":"b-44357ed5ef1ae9cbe4bd8fbb","page":"reading-opening","operation":"move","beforeSHA256":"02a8d79c32c7961fe52c271210724159424b2c431bc791668f4cc931fa123513","afterSHA256":"02a8d79c32c7961fe52c271210724159424b2c431bc791668f4cc931fa123513","reason":"Same source body in authored semantic page"},{"oldId":"b-43e009df5942866e366fd441","targetId":"b-43e009df5942866e366fd441","page":"reading-opening","operation":"move","beforeSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","afterSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","reason":"Same source body in authored semantic page"},{"oldId":"b-94bf9bdb74d659b1227226d7","targetId":"b-94bf9bdb74d659b1227226d7","page":"reading-opening","operation":"move","beforeSHA256":"0f845ef31b98ed8c96f689fea3088b0a7482be32b2d5510c83f9fcbb05da4c9d","afterSHA256":"0f845ef31b98ed8c96f689fea3088b0a7482be32b2d5510c83f9fcbb05da4c9d","reason":"Same source body in authored semantic page"},{"oldId":"b-b9199552e9a0ed9571d9a60b","targetId":"b-b9199552e9a0ed9571d9a60b","page":"reading-opening","operation":"move","beforeSHA256":"fd7dacba87183ce44a34a20bde3f9f02f7f919850e060c6febd9cfde7935a1ef","afterSHA256":"fd7dacba87183ce44a34a20bde3f9f02f7f919850e060c6febd9cfde7935a1ef","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-3784215f7d11cd2f9ee42f91","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html#b-3784215f7d11cd2f9ee42f91","content":"[LAB 08 · 图像重建：遮挡损失与表示评价](/course/notebooks/b5ba27f2c5ba4ec0922208a7d5dc80a4.html)","sha256":"4730e90285e279b2564c179018b9df76aafd9db5dd2729f0f687ac380af591ed","chapter":{"id":"course","title":"两个目标，两个分母 · 实现代码"},"unit":{"id":"notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676","title":"两个目标，两个分母 · 实现代码"},"page":{"id":"reading-opening","title":"两个目标，两个分母 · 实现代码","number":1},"sectionTitle":"两个目标，两个分母 · 实现代码","currentQuestion":"两个目标，两个分母 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-44357ed5ef1ae9cbe4bd8fbb","prerequisites":[],"relatedBlocks":[]},{"id":"b-44357ed5ef1ae9cbe4bd8fbb","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html#b-44357ed5ef1ae9cbe4bd8fbb","content":"# 两个目标，两个分母 · 实现代码","sha256":"02a8d79c32c7961fe52c271210724159424b2c431bc791668f4cc931fa123513","chapter":{"id":"course","title":"两个目标，两个分母 · 实现代码"},"unit":{"id":"notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676","title":"两个目标，两个分母 · 实现代码"},"page":{"id":"reading-opening","title":"两个目标，两个分母 · 实现代码","number":1},"sectionTitle":"两个目标，两个分母 · 实现代码","currentQuestion":"两个目标，两个分母 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-3784215f7d11cd2f9ee42f91","nextBlock":"b-43e009df5942866e366fd441","prerequisites":[{"id":"b-3784215f7d11cd2f9ee42f91","url":"#b-3784215f7d11cd2f9ee42f91","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-43e009df5942866e366fd441","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html#b-43e009df5942866e366fd441","content":"按问题继续","sha256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","chapter":{"id":"course","title":"两个目标，两个分母 · 实现代码"},"unit":{"id":"notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676","title":"两个目标，两个分母 · 实现代码"},"page":{"id":"reading-opening","title":"两个目标，两个分母 · 实现代码","number":1},"sectionTitle":"两个目标，两个分母 · 实现代码","currentQuestion":"两个目标，两个分母 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-44357ed5ef1ae9cbe4bd8fbb","nextBlock":"b-94bf9bdb74d659b1227226d7","prerequisites":[{"id":"b-44357ed5ef1ae9cbe4bd8fbb","url":"#b-44357ed5ef1ae9cbe4bd8fbb","role":"section-title"},{"id":"b-3784215f7d11cd2f9ee42f91","url":"#b-3784215f7d11cd2f9ee42f91","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-94bf9bdb74d659b1227226d7","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html#b-94bf9bdb74d659b1227226d7","content":"索引恢复、去噪/遮挡ConvAE训练、PCA基线、独立冻结评价","sha256":"0f845ef31b98ed8c96f689fea3088b0a7482be32b2d5510c83f9fcbb05da4c9d","chapter":{"id":"course","title":"两个目标，两个分母 · 实现代码"},"unit":{"id":"notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676","title":"两个目标，两个分母 · 实现代码"},"page":{"id":"reading-opening","title":"两个目标，两个分母 · 实现代码","number":1},"sectionTitle":"两个目标，两个分母 · 实现代码","currentQuestion":"两个目标，两个分母 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-43e009df5942866e366fd441","nextBlock":"b-b9199552e9a0ed9571d9a60b","prerequisites":[{"id":"b-44357ed5ef1ae9cbe4bd8fbb","url":"#b-44357ed5ef1ae9cbe4bd8fbb","role":"section-title"},{"id":"b-3784215f7d11cd2f9ee42f91","url":"#b-3784215f7d11cd2f9ee42f91","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-b9199552e9a0ed9571d9a60b","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676.html#b-b9199552e9a0ed9571d9a60b","content":"```\ndef train_ae(x,train,kind,epochs=40):\n    torch.manual_seed(SEED+(kind=='masked'))\n    model=ConvAE(2 if kind=='masked' else 1);initial=copy.deepcopy(model)\n    opt=torch.optim.Adam(model.parameters(),lr=.003);history=[]\n    before=next(model.encoder.parameters()).detach().clone()\n    for epoch in range(epochs):\n        model.train();losses=[]\n        for ids in torch.as_tensor(train)[torch.randperm(len(train))].split(64):\n            clean=x[ids]\n            if kind=='denoise':\n                pred,_=model(noise_corrupt(clean));loss=F.mse_loss(pred,clean)\n            else:\n                mask=patch_mask(len(ids),.5)\n                inp=torch.cat([clean*(1-mask),mask],dim=1)\n                pred,_=model(inp);loss=(((pred-clean)**2)*mask).sum()/mask.sum()\n            opt.zero_grad();loss.backward();opt.step();losses.append(float(loss.detach()))\n        history.append(float(np.mean(losses)))\n    delta=float((next(model.encoder.parameters()).detach()-before).norm());assert delta>0\n    return model,initial,history,delta\n\ndef frozen_probe(model,x,y,train,test,masked=False):\n    model.eval()\n    with torch.no_grad():\n        # Clean image readout; mask channel zero. No reconstruction targets at inference.\n        inp=torch.cat([x,torch.zeros_like(x)],1) if masked else x\n        h=model(inp)[1]\n        a=F.normalize(h,dim=1).numpy()\n    probe=KNeighborsClassifier(n_neighbors=5,metric='cosine').fit(a[train],y[train])\n    return float(probe.score(a[test],y[test]))\n\ndef mask_index_warmup():\n    rng=np.random.default_rng(7);tokens=np.arange(16);shuffle=rng.permutation(16)\n    restore=np.argsort(shuffle);keep=shuffle[:4]\n    shuffled=np.concatenate([tokens[keep],np.full(12,-1)])\n    restored=shuffled[restore]\n    assert np.array_equal(restored[keep],tokens[keep]);assert (restored==-1).sum()==12\n    proxy=[]\n    for visible in ([0,3,9,14],[0,5,10,15,3,6,9,12]):\n        mask=np.ones(16,bool);mask[visible]=False\n        pred=np.full(16,tokens[visible].mean())\n        proxy.append({'visible':len(visible),'masked':int(mask.sum()),'constant_predictor_masked_mse':float(((pred[mask]-tokens[mask])**2).mean())})\n    return {'shuffle':shuffle.tolist(),'ids_restore':restore.tolist(),'restored':restored.tolist(),'constant_proxy':proxy}\n```","sha256":"fd7dacba87183ce44a34a20bde3f9f02f7f919850e060c6febd9cfde7935a1ef","chapter":{"id":"course","title":"两个目标，两个分母 · 实现代码"},"unit":{"id":"notebook-blocks/e8bd60f8abd5443a9b5b04756ca65676","title":"两个目标，两个分母 · 实现代码"},"page":{"id":"reading-opening","title":"两个目标，两个分母 · 实现代码","number":1},"sectionTitle":"两个目标，两个分母 · 实现代码","currentQuestion":"两个目标，两个分母 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-94bf9bdb74d659b1227226d7","nextBlock":null,"prerequisites":[{"id":"b-44357ed5ef1ae9cbe4bd8fbb","url":"#b-44357ed5ef1ae9cbe4bd8fbb","role":"section-title"},{"id":"b-3784215f7d11cd2f9ee42f91","url":"#b-3784215f7d11cd2f9ee42f91","role":"problem-context"}],"relatedBlocks":[]}]}
