{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"1 · 准备与固定输入 · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.md","pages":[{"id":"reading-opening","title":"1 · 准备与固定输入 · 实现代码","unit":"1 · 准备与固定输入 · 实现代码","unitId":"notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64","chapter":"course","number":1}],"aliases":[{"oldId":"b-ed0ffd57a5076e4ce0ff8ca3","targetId":"b-ed0ffd57a5076e4ce0ff8ca3","page":"reading-opening","operation":"move","beforeSHA256":"b3bb3626e5e17c0995867f42bedbcb72020e0decf77093d796851d5f10c78af6","afterSHA256":"b3bb3626e5e17c0995867f42bedbcb72020e0decf77093d796851d5f10c78af6","reason":"Same source body in authored semantic page"},{"oldId":"b-acd4bce8dbfb6a3069cdc832","targetId":"b-acd4bce8dbfb6a3069cdc832","page":"reading-opening","operation":"move","beforeSHA256":"830abac9f1efc929d2c34bad0604bb3c6217e5689fe07a266f4ea47996ccc282","afterSHA256":"830abac9f1efc929d2c34bad0604bb3c6217e5689fe07a266f4ea47996ccc282","reason":"Same source body in authored semantic page"},{"oldId":"b-ea0ce58f78b445b1de0efef6","targetId":"b-ea0ce58f78b445b1de0efef6","page":"reading-opening","operation":"move","beforeSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","afterSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","reason":"Same source body in authored semantic page"},{"oldId":"b-d2393a2f04d6aca51da98cf3","targetId":"b-d2393a2f04d6aca51da98cf3","page":"reading-opening","operation":"move","beforeSHA256":"74f0ef9a0e12c18b5c762e1998a58610fd064887211de86861e624d8f17a1e93","afterSHA256":"74f0ef9a0e12c18b5c762e1998a58610fd064887211de86861e624d8f17a1e93","reason":"Same source body in authored semantic page"},{"oldId":"b-0b7d8cc06acebaadb163e8ad","targetId":"b-0b7d8cc06acebaadb163e8ad","page":"reading-opening","operation":"move","beforeSHA256":"500df777638cd79849d07a4519b06a69550a8b60d73754112a36532a011d600d","afterSHA256":"500df777638cd79849d07a4519b06a69550a8b60d73754112a36532a011d600d","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-ed0ffd57a5076e4ce0ff8ca3","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html#b-ed0ffd57a5076e4ce0ff8ca3","content":"[LAB 05 · 像素 patch 词典：拟合与重建](/course/notebooks/de39b998077f44cca4b8407085547766.html)","sha256":"b3bb3626e5e17c0995867f42bedbcb72020e0decf77093d796851d5f10c78af6","chapter":{"id":"course","title":"1 · 准备与固定输入 · 实现代码"},"unit":{"id":"notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64","title":"1 · 准备与固定输入 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 准备与固定输入 · 实现代码","number":1},"sectionTitle":"1 · 准备与固定输入 · 实现代码","currentQuestion":"1 · 准备与固定输入 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-acd4bce8dbfb6a3069cdc832","prerequisites":[],"relatedBlocks":[]},{"id":"b-acd4bce8dbfb6a3069cdc832","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html#b-acd4bce8dbfb6a3069cdc832","content":"# 1 · 准备与固定输入 · 实现代码","sha256":"830abac9f1efc929d2c34bad0604bb3c6217e5689fe07a266f4ea47996ccc282","chapter":{"id":"course","title":"1 · 准备与固定输入 · 实现代码"},"unit":{"id":"notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64","title":"1 · 准备与固定输入 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 准备与固定输入 · 实现代码","number":1},"sectionTitle":"1 · 准备与固定输入 · 实现代码","currentQuestion":"1 · 准备与固定输入 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-ed0ffd57a5076e4ce0ff8ca3","nextBlock":"b-ea0ce58f78b445b1de0efef6","prerequisites":[{"id":"b-ed0ffd57a5076e4ce0ff8ca3","url":"#b-ed0ffd57a5076e4ce0ff8ca3","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-ea0ce58f78b445b1de0efef6","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html#b-ea0ce58f78b445b1de0efef6","content":"按问题继续","sha256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","chapter":{"id":"course","title":"1 · 准备与固定输入 · 实现代码"},"unit":{"id":"notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64","title":"1 · 准备与固定输入 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 准备与固定输入 · 实现代码","number":1},"sectionTitle":"1 · 准备与固定输入 · 实现代码","currentQuestion":"1 · 准备与固定输入 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-acd4bce8dbfb6a3069cdc832","nextBlock":"b-d2393a2f04d6aca51da98cf3","prerequisites":[{"id":"b-acd4bce8dbfb6a3069cdc832","url":"#b-acd4bce8dbfb6a3069cdc832","role":"section-title"},{"id":"b-ed0ffd57a5076e4ce0ff8ca3","url":"#b-ed0ffd57a5076e4ce0ff8ca3","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-d2393a2f04d6aca51da98cf3","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html#b-d2393a2f04d6aca51da98cf3","content":"真实MNIST patch的Lloyd拟合、词典中心、保留误差与历史输出","sha256":"74f0ef9a0e12c18b5c762e1998a58610fd064887211de86861e624d8f17a1e93","chapter":{"id":"course","title":"1 · 准备与固定输入 · 实现代码"},"unit":{"id":"notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64","title":"1 · 准备与固定输入 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 准备与固定输入 · 实现代码","number":1},"sectionTitle":"1 · 准备与固定输入 · 实现代码","currentQuestion":"1 · 准备与固定输入 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-ea0ce58f78b445b1de0efef6","nextBlock":"b-0b7d8cc06acebaadb163e8ad","prerequisites":[{"id":"b-acd4bce8dbfb6a3069cdc832","url":"#b-acd4bce8dbfb6a3069cdc832","role":"section-title"},{"id":"b-ed0ffd57a5076e4ce0ff8ca3","url":"#b-ed0ffd57a5076e4ce0ff8ca3","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-0b7d8cc06acebaadb163e8ad","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64.html#b-0b7d8cc06acebaadb163e8ad","content":"```\n# 当前项目中的独立材料：已存在则复用，缺失才从本讲原站准备。\nfrom pathlib import Path\nimport io, zipfile, urllib.request\n_base = Path.cwd()\n_folder = 'lab10-patch'\n_sentinel = 'assets/target.npz'\n_choices = [_base/_folder, _base/'lecture03-labs'/_folder, _base]\n_ready = next((p for p in _choices if (p/_sentinel).is_file()), None)\nif _ready is None:\n    _url = 'https://codingai-lec03.pages.dev/course/materials/' + _folder + '.zip'\n    _payload = urllib.request.urlopen(_url, timeout=60).read()\n    with zipfile.ZipFile(io.BytesIO(_payload)) as _archive:\n        _names = [i.filename for i in _archive.infolist() if not i.is_dir()]\n        _prefix = _folder + '/'\n        _prefixed = all(n.startswith(_prefix) for n in _names)\n        _destination = _base if _prefixed else _base/_folder\n        for _item in _archive.infolist():\n            _target = (_destination/_item.filename).resolve()\n            if not _target.is_relative_to(_destination.resolve()):\n                raise ValueError('材料包中有越界路径，停止解压。')\n            if _item.is_dir():\n                _target.mkdir(parents=True, exist_ok=True)\n            elif not _target.exists():\n                _target.parent.mkdir(parents=True, exist_ok=True)\n                _target.write_bytes(_archive.read(_item))\n    _ready = next((p for p in _choices if (p/_sentinel).is_file()), None)\nassert _ready is not None, '请将本讲完整材料包解压到当前项目的 ' + _folder + '/；保留文件结构。'\nLAB_ROOT = _ready\nprint('材料目录已就绪：', LAB_ROOT)\n\nimport json, hashlib, platform, sys\nfrom pathlib import Path\nimport numpy as np\nimport matplotlib.pyplot as plt\nROOT=LAB_ROOT\nif not (ROOT/'assets').is_dir() and (ROOT/'lab10-patch'/'assets').is_dir():ROOT=ROOT/'lab10-patch'\nassert (ROOT/'assets').is_dir(), '请解压本实验完整包，并在该目录或其父目录运行。'\nOUT=ROOT/'runs/current'; OUT.mkdir(parents=True,exist_ok=True)\nFIG=OUT/'figures'; FIG.mkdir(exist_ok=True)\nplt.rcParams.update({'figure.dpi':120,'font.size':10,'axes.spines.top':False,'axes.spines.right':False})\nBLUE,GOLD,GREEN,PURPLE='#002676','#E6A500','#00856A','#69458D'\ndef sha_file(path):return hashlib.sha256(Path(path).read_bytes()).hexdigest()\ndef savefig(name):\n    if not plt.gcf().get_constrained_layout():plt.tight_layout()\n    plt.savefig(FIG/name,dpi=140,bbox_inches='tight');plt.show()\n\nprovenance=json.loads((ROOT/'assets/provenance.json').read_text())\nassert sha_file(ROOT/'assets/target.npz')==provenance['target_asset_sha256']\nwith np.load(ROOT/'assets/target.npz',allow_pickle=False) as z:\n    images=z['images'];sample_ids=z['official_train_ids'];split=z['split']\n# digit_labels are in the source archive but deliberately never read here.\nassert len(set(sample_ids))==640\ntrain=np.flatnonzero(split==0);heldout=np.flatnonzero(split==2)\nassert not set(sample_ids[train])&set(sample_ids[heldout])\npartition=np.random.default_rng(20260908).permutation(60000)\nassert np.array_equal(sample_ids,partition[12000:12640])\nx=images.astype(np.float32)/255\nshifted=np.zeros_like(x);shifted[:,:,:,2:]=x[:,:,:,:-2];x=shifted\nassert x.shape==(640,1,28,28)\nprint('无标签 fit 输入：',len(train),'张；保留：',len(heldout),'张。没有导入 torch、加载 CNN 或读取类别标签。')\n\n```","sha256":"500df777638cd79849d07a4519b06a69550a8b60d73754112a36532a011d600d","chapter":{"id":"course","title":"1 · 准备与固定输入 · 实现代码"},"unit":{"id":"notebook-blocks/d9b6b1782dd5404895a80b24f6a87f64","title":"1 · 准备与固定输入 · 实现代码"},"page":{"id":"reading-opening","title":"1 · 准备与固定输入 · 实现代码","number":1},"sectionTitle":"1 · 准备与固定输入 · 实现代码","currentQuestion":"1 · 准备与固定输入 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-d2393a2f04d6aca51da98cf3","nextBlock":null,"prerequisites":[{"id":"b-acd4bce8dbfb6a3069cdc832","url":"#b-acd4bce8dbfb6a3069cdc832","role":"section-title"},{"id":"b-ed0ffd57a5076e4ce0ff8ca3","url":"#b-ed0ffd57a5076e4ce0ff8ca3","role":"problem-context"}],"relatedBlocks":[]}]}
