{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.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/db561b709f8242a987ffb6c13e8e8b75.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.md","pages":[{"id":"reading-opening","title":"2 · 同一表示，改变标签预算或读出 · 实现代码","unit":"2 · 同一表示，改变标签预算或读出 · 实现代码","unitId":"notebook-blocks/db561b709f8242a987ffb6c13e8e8b75","chapter":"course","number":1}],"aliases":[{"oldId":"b-8cc8532b4ee01dc8c72458c4","targetId":"b-8cc8532b4ee01dc8c72458c4","page":"reading-opening","operation":"move","beforeSHA256":"7d57f9e628741b07c2704a32d4b4c2e5ca44d512d696e3562c18003cb33df7d1","afterSHA256":"7d57f9e628741b07c2704a32d4b4c2e5ca44d512d696e3562c18003cb33df7d1","reason":"Same source body in authored semantic page"},{"oldId":"b-293372622cc02210bf57a8e8","targetId":"b-293372622cc02210bf57a8e8","page":"reading-opening","operation":"move","beforeSHA256":"81338f25f39dd5801bb6808ebdcfc727c562a63acbff22e12e36b5041d146987","afterSHA256":"81338f25f39dd5801bb6808ebdcfc727c562a63acbff22e12e36b5041d146987","reason":"Same source body in authored semantic page"},{"oldId":"b-0794821abc068c02ac92a2bd","targetId":"b-0794821abc068c02ac92a2bd","page":"reading-opening","operation":"move","beforeSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","afterSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","reason":"Same source body in authored semantic page"},{"oldId":"b-d27f4030581951358c88f23c","targetId":"b-d27f4030581951358c88f23c","page":"reading-opening","operation":"move","beforeSHA256":"75bc3d13109b5a891b82a4daefd668c001abde4ddf12e5ad4e20e6fe674663c6","afterSHA256":"75bc3d13109b5a891b82a4daefd668c001abde4ddf12e5ad4e20e6fe674663c6","reason":"Same source body in authored semantic page"},{"oldId":"b-6238137943bd6ea8cb274af0","targetId":"b-6238137943bd6ea8cb274af0","page":"reading-opening","operation":"move","beforeSHA256":"f4c210b6af827fd3ff6cb156f62c98b852b98d098d24ec103aa09b6aa3ba9ebd","afterSHA256":"f4c210b6af827fd3ff6cb156f62c98b852b98d098d24ec103aa09b6aa3ba9ebd","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-8cc8532b4ee01dc8c72458c4","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.html#b-8cc8532b4ee01dc8c72458c4","content":"[LAB 01 · 固定表示：标签预算与读出](/course/notebooks/4dd8605ed9904820919ea9e13d9e7d7c.html)","sha256":"7d57f9e628741b07c2704a32d4b4c2e5ca44d512d696e3562c18003cb33df7d1","chapter":{"id":"course","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"unit":{"id":"notebook-blocks/db561b709f8242a987ffb6c13e8e8b75","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"page":{"id":"reading-opening","title":"2 · 同一表示，改变标签预算或读出 · 实现代码","number":1},"sectionTitle":"2 · 同一表示，改变标签预算或读出 · 实现代码","currentQuestion":"2 · 同一表示，改变标签预算或读出 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-293372622cc02210bf57a8e8","prerequisites":[],"relatedBlocks":[]},{"id":"b-293372622cc02210bf57a8e8","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.html#b-293372622cc02210bf57a8e8","content":"# 2 · 同一表示，改变标签预算或读出 · 实现代码","sha256":"81338f25f39dd5801bb6808ebdcfc727c562a63acbff22e12e36b5041d146987","chapter":{"id":"course","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"unit":{"id":"notebook-blocks/db561b709f8242a987ffb6c13e8e8b75","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"page":{"id":"reading-opening","title":"2 · 同一表示，改变标签预算或读出 · 实现代码","number":1},"sectionTitle":"2 · 同一表示，改变标签预算或读出 · 实现代码","currentQuestion":"2 · 同一表示，改变标签预算或读出 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-8cc8532b4ee01dc8c72458c4","nextBlock":"b-0794821abc068c02ac92a2bd","prerequisites":[{"id":"b-8cc8532b4ee01dc8c72458c4","url":"#b-8cc8532b4ee01dc8c72458c4","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-0794821abc068c02ac92a2bd","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.html#b-0794821abc068c02ac92a2bd","content":"按问题继续","sha256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","chapter":{"id":"course","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"unit":{"id":"notebook-blocks/db561b709f8242a987ffb6c13e8e8b75","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"page":{"id":"reading-opening","title":"2 · 同一表示，改变标签预算或读出 · 实现代码","number":1},"sectionTitle":"2 · 同一表示，改变标签预算或读出 · 实现代码","currentQuestion":"2 · 同一表示，改变标签预算或读出 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-293372622cc02210bf57a8e8","nextBlock":"b-d27f4030581951358c88f23c","prerequisites":[{"id":"b-293372622cc02210bf57a8e8","url":"#b-293372622cc02210bf57a8e8","role":"section-title"},{"id":"b-8cc8532b4ee01dc8c72458c4","url":"#b-8cc8532b4ee01dc8c72458c4","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-d27f4030581951358c88f23c","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.html#b-d27f4030581951358c88f23c","content":"固定CNN与缓存特征、标签预算、kNN/linear和独立评价","sha256":"75bc3d13109b5a891b82a4daefd668c001abde4ddf12e5ad4e20e6fe674663c6","chapter":{"id":"course","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"unit":{"id":"notebook-blocks/db561b709f8242a987ffb6c13e8e8b75","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"page":{"id":"reading-opening","title":"2 · 同一表示，改变标签预算或读出 · 实现代码","number":1},"sectionTitle":"2 · 同一表示，改变标签预算或读出 · 实现代码","currentQuestion":"2 · 同一表示，改变标签预算或读出 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-0794821abc068c02ac92a2bd","nextBlock":"b-6238137943bd6ea8cb274af0","prerequisites":[{"id":"b-293372622cc02210bf57a8e8","url":"#b-293372622cc02210bf57a8e8","role":"section-title"},{"id":"b-8cc8532b4ee01dc8c72458c4","url":"#b-8cc8532b4ee01dc8c72458c4","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-6238137943bd6ea8cb274af0","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/db561b709f8242a987ffb6c13e8e8b75.html#b-6238137943bd6ea8cb274af0","content":"```\ndef make_source_cnn():\n    return nn.Sequential(OrderedDict([\n      ('conv1',nn.Conv2d(1,8,3,padding=1)),('relu1',nn.ReLU()),('pool1',nn.MaxPool2d(2)),\n      ('conv2',nn.Conv2d(8,16,3,padding=1)),('relu2',nn.ReLU()),('pool2',nn.MaxPool2d(2)),\n      ('flatten',nn.Flatten()),('hidden',nn.Linear(784,32)),('relu3',nn.ReLU()),('logits',nn.Linear(32,10))]))\nmodel=make_source_cnn()\nmodel.load_state_dict(torch.load(ROOT/'assets/cnn-plain-state.pt',map_location='cpu',weights_only=True))\nassert sum(p.numel() for p in model.parameters())==26698\nmodel.eval()\nfor param in model.parameters(): param.requires_grad_(False)\nbefore={k:v.detach().clone() for k,v in model.state_dict().items()}\nencoder=nn.Sequential(OrderedDict(list(model.named_children())[:-1]))\nwith torch.no_grad(): raw_features=encoder(x).numpy()\nfeatures=raw_features/np.maximum(np.linalg.norm(raw_features,axis=1,keepdims=True),1e-12)\nassert features.shape==(640,32)\nassert all(torch.equal(v,before[k]) for k,v in model.state_dict().items())\nnp.savez_compressed(OUT/'frozen-features.npz',features=features,raw_features=raw_features,sample_ids=sample_ids,split=split)\nprint('Frozen features:',features.shape,'; all parameters unchanged.')\n\nLABEL_BUDGETS=[32,64,128,256]\nK=5\nC=10.0\nrecords=[]; fitted={}\nfor budget in LABEL_BUDGETS:\n    labeled=train[:budget]\n    # Identical labeled sample identities for both readouts at this budget.\n    methods={'kNN':KNeighborsClassifier(n_neighbors=K,weights='uniform',metric='euclidean'),\n             'linear':LogisticRegression(C=C,max_iter=2000,solver='lbfgs',random_state=20260918)}\n    for method,readout in methods.items():\n        readout.fit(features[labeled],y[labeled])\n        fitted[(method,budget)]=readout\n        records.append({'method':method,'budget':budget,'labeled_ids':sample_ids[labeled].tolist(),\n                        'train_accuracy':float(readout.score(features[labeled],y[labeled])),\n                        'validation_accuracy':float(readout.score(features[val],y[val]))})\n# The methods and hyperparameters are now locked. Held-out labels enter evaluation only.\nfor record in records:\n    pred=fitted[(record['method'],record['budget'])].predict(features[heldout])\n    record['heldout_accuracy']=float(accuracy_score(y[heldout],pred))\n    record['heldout_predictions']=pred.tolist()\n    record['heldout_errors']=int((pred!=y[heldout]).sum())\nassert all(torch.equal(v,before[k]) for k,v in model.state_dict().items())\nreadout_results={'evidence':'actual local CPU run','protocol':{'target_task':'digit >= 5','shift_right':2,\n 'feature':'last 32-dimensional ReLU, then per-sample L2 normalization','label_budgets':LABEL_BUDGETS,\n 'k':K,'C':C,'tuning':'none; fixed before evaluation','seed':20260918,'encoder_sha256':provenance['source_checkpoint_sha256']},\n 'records':records,'limitations':['one fixed split; no seed-sweep uncertainty','not a supervised-vs-SSL comparison','MNIST source training differs from natural-image pretraining']}\n(OUT/'readout-results.json').write_text(json.dumps(readout_results,indent=2))\nprint('method | labels | train | validation | heldout | heldout errors / 256')\nfor r in records: print(r['method'],r['budget'],*[round(r[k],4) for k in ['train_accuracy','validation_accuracy','heldout_accuracy']],r['heldout_errors'])\nfig,axes=plt.subplots(1,2,figsize=(10,3.8),sharey=True)\nfor method,color in [('kNN',BLUE),('linear',GREEN)]:\n    rows=[r for r in records if r['method']==method]\n    for ax,metric in zip(axes,['validation_accuracy','heldout_accuracy']):\n        ax.plot([r['budget'] for r in rows],[r[metric] for r in rows],marker='o',color=color,label=method)\nfor ax,title in zip(axes,['Validation (128 images)','Held-out evaluation (256 images)']):\n    ax.set(xlabel='Labeled training images',ylabel='Binary accuracy',ylim=(0,1.01),title=title,xticks=LABEL_BUDGETS);ax.legend();ax.grid(alpha=.18)\nsavefig('03-readout-budget.png')\n```","sha256":"f4c210b6af827fd3ff6cb156f62c98b852b98d098d24ec103aa09b6aa3ba9ebd","chapter":{"id":"course","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"unit":{"id":"notebook-blocks/db561b709f8242a987ffb6c13e8e8b75","title":"2 · 同一表示，改变标签预算或读出 · 实现代码"},"page":{"id":"reading-opening","title":"2 · 同一表示，改变标签预算或读出 · 实现代码","number":1},"sectionTitle":"2 · 同一表示，改变标签预算或读出 · 实现代码","currentQuestion":"2 · 同一表示，改变标签预算或读出 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-d27f4030581951358c88f23c","nextBlock":null,"prerequisites":[{"id":"b-293372622cc02210bf57a8e8","url":"#b-293372622cc02210bf57a8e8","role":"section-title"},{"id":"b-8cc8532b4ee01dc8c72458c4","url":"#b-8cc8532b4ee01dc8c72458c4","role":"problem-context"}],"relatedBlocks":[]}]}
