{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3",
   "language": "python"
  },
  "language_info": {
   "name": "python"
  },
  "deepnote": {
   "projectId": "c0b185e7-d7e3-48b6-a605-8f1acdfe243c",
   "notebookId": "dd878c8afff04515a1eeca56ba434170",
   "name": "LAB 08 · 从真实响应到遮挡对照"
  },
  "title": "LAB 08 · 从真实响应到遮挡对照"
 },
 "cells": [
  {
   "cell_type": "markdown",
   "id": "99f8dcb338604858a1d2ff2b2e4e5ace",
   "metadata": {
    "deepnote_block_type": "text-cell-h1",
    "deepnote_block_id": "99f8dcb338604858a1d2ff2b2e4e5ace",
    "html_anchor": "cell-1"
   },
   "source": "# LAB 08 · 从真实响应到遮挡对照"
  },
  {
   "cell_type": "markdown",
   "id": "a10bafc6f534452a882fd1e6ecca03a9",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "a10bafc6f534452a882fd1e6ecca03a9",
    "html_anchor": "cell-2",
    "deepnote": {
     "block_id": "a10bafc6f534452a882fd1e6ecca03a9"
    }
   },
   "source": [
    "[返回第二讲 · 真实响应与遮挡对照](https://codingai-lec02.pages.dev/#/features-are-learned-responses/0) · [第二讲导读与学习材料](https://codingai-lec02.pages.dev/course/guide.html) · [问卷作业 ↗](https://tally.so/r/VLroVv)（右键在新标签页打开）。\n",
    "\n",
    "**先看见响应，再检验改变输入会发生什么。** 本册复用第二讲同一台26,698参数CNN，观察MNIST test 0/1/2（标签7/2/1），不重新训练。\n",
    "\n",
    "| 今天的条件 | 可以直接做什么 | 看哪里 |\n",
    "| --- | --- | --- |\n",
    "| 只读材料，尚无运行文件 | 比较第2节三张输入同一通道，再解释第3节遮挡A/B | 已保存真实图、色标、改变像素数与logit |\n",
    "| 已有匹配模型与MNIST测试文件 | 从准备代码依次运行至第1节，再选第2或3节 | 核对模型SHA-256与本次打印结果 |\n",
    "| 想做一个单变量干预 | 第3节只改 `FILL: 0→0.5` | 背景B是否仍不改输入，以及A/B的实际扰动量 |\n",
    "\n",
    "**课堂先预测：** 同样的5×5遮挡面积是否等于相同的输入变化？先看历史A/B对照，再预测把填充值改为0.5时，背景B还能不能保持原logit。\n",
    "\n",
    "返回课件：[两层响应](https://codingai-lec02.pages.dev/#/features-are-learned-responses/1) → [同一通道](https://codingai-lec02.pages.dev/course/reference/observing-learned-hierarchy.html) → [遮挡对照](https://codingai-lec02.pages.dev/course/reference/occlusion-needs-a-control.html)。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17909a2421a342cabdd920d813a04b85",
   "metadata": {
    "deepnote_block_type": "text-cell-h2",
    "deepnote_block_id": "17909a2421a342cabdd920d813a04b85",
    "html_anchor": "cell-3"
   },
   "source": [
    "## 准备：本实验的固定材料"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e906f8ebea6d42ceb66182d506af778a",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "e906f8ebea6d42ceb66182d506af778a",
    "html_anchor": "cell-4",
    "deepnote": {
     "block_id": "e906f8ebea6d42ceb66182d506af778a"
    }
   },
   "source": [
    "**阅读保存图无需运行准备代码。** 若要复算，先在项目根目录准备以下三个文件；它们是文件依赖，不是另一Notebook的内存：\n",
    "\n",
    "| 文件 | 用途 |\n",
    "| --- | --- |\n",
    "| `results/cnn-plain-state.pt` | 第二讲小CNN的已训练权重 |\n",
    "| `data/t10k-images-idx3-ubyte.gz` | 官方MNIST测试图像 |\n",
    "| `data/t10k-labels-idx1-ubyte.gz` | 对应测试标签 |\n",
    "\n",
    "可下载[课件缓存包](https://codingai-lec02.pages.dev/course/materials/legacy-lab-data.zip)，把其中 `data/` 与 `results/` 按原目录解压到项目根目录，不要多套一层文件夹。运行需要 `numpy matplotlib torch`。\n",
    "\n",
    "**最小顺序：** 导入 → 检查文件/MD5并计算模型哈希 → 构建CNN并加载权重 → 第1节固定三图前向 → 第2节换通道或第3节遮挡。第3节不依赖第2节的绘图，但依赖第1节的 `inputs / measured`。\n",
    "\n",
    "代码打印 `课件同一检查点: True/False`；它不会因哈希不同自动中止。显示 `False` 时先检查文件来源：若是自己重训的权重，可观察但须记录为新模型，不能把新值覆盖成课件旧观测。没有文件时可继续读保存图，不必临时重训。"
   ]
  },
  {
   "cell_type": "code",
   "id": "ae4fd9251afe4ffc80bbaf8ee4cb26f8",
   "metadata": {
    "deepnote_block_type": "code",
    "deepnote_block_id": "ae4fd9251afe4ffc80bbaf8ee4cb26f8",
    "html_anchor": "cell-5"
   },
   "source": [
    "import copy, gzip, hashlib, io, json, os, time\n",
    "from pathlib import Path\n",
    "from collections import OrderedDict\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.patches import Rectangle\n",
    "import torch\n",
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "torch.set_num_threads(2)\n",
    "torch.manual_seed(20260917)\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "5079db82584c4861b8f074364c412cf2",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "5079db82584c4861b8f074364c412cf2",
    "html_anchor": "cell-6",
    "deepnote": {
     "block_id": "5079db82584c4861b8f074364c412cf2"
    }
   },
   "source": [
    "**文件错误怎样定位。** `missing` 会列出当前找不到的相对路径；MD5不匹配表示测试文件身份不符；`load_state_dict`形状不匹配常表示放入了另一结构的模型。先检查目录与文件来源，不修改校验值来让代码通过。"
   ]
  },
  {
   "cell_type": "code",
   "id": "a73ff2f02eaa45ee9eec643811cfd56a",
   "metadata": {
    "deepnote_block_type": "code",
    "deepnote_block_id": "a73ff2f02eaa45ee9eec643811cfd56a",
    "html_anchor": "cell-7"
   },
   "source": [
    "MODEL_PATH=Path('results/cnn-plain-state.pt')\n",
    "TEST_FILES={\n",
    " 't10k-images-idx3-ubyte.gz':'9fb629c4189551a2d022fa330f9573f3',\n",
    " 't10k-labels-idx1-ubyte.gz':'ec29112dd5afa0611ce80d1b7f02629c'}\n",
    "missing=[str(p) for p in [MODEL_PATH,*[Path('data')/n for n in TEST_FILES]] if not p.is_file()]\n",
    "if missing:\n",
    "    raise RuntimeError('请先按 LAB 02 默认流程产生这些项目文件，再返回本页：'+', '.join(missing))\n",
    "asset_bytes={'cnn-plain-state.pt':MODEL_PATH.read_bytes()}\n",
    "for name,md5 in TEST_FILES.items():\n",
    "    raw=(Path('data')/name).read_bytes()\n",
    "    assert hashlib.md5(raw).hexdigest()==md5, 'MNIST 文件不匹配：'+name\n",
    "    asset_bytes[name]=raw\n",
    "model_sha256=hashlib.sha256(asset_bytes['cnn-plain-state.pt']).hexdigest()\n",
    "COURSE_MODEL_SHA256='ba8b738cc67d4ec3cd83d75a5dbe8a70ec548377335ba0abaaa7c23cd14eeba3'\n",
    "print('课件同一检查点:',model_sha256==COURSE_MODEL_SHA256)\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "831f6fe1f2aa4074986375c55965af5e",
   "metadata": {
    "deepnote_block_type": "code",
    "deepnote_block_id": "831f6fe1f2aa4074986375c55965af5e",
    "html_anchor": "cell-8"
   },
   "source": [
    "source_state=torch.load(io.BytesIO(asset_bytes['cnn-plain-state.pt']),map_location='cpu',weights_only=True)\n",
    "def make_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))]))\n",
    "source_model=make_cnn();source_model.load_state_dict(source_state);source_model.eval()\n",
    "assert sum(p.numel() for p in source_model.parameters())==26698\n",
    "print('已读取项目内的 26698 参数 CNN；PyTorch',torch.__version__)\n",
    "print('当前模型 SHA-256:',model_sha256)\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "20f6c34e95e142d9b833c00f298b969f",
   "metadata": {
    "deepnote_block_type": "text-cell-h2",
    "deepnote_block_id": "20f6c34e95e142d9b833c00f298b969f",
    "html_anchor": "cell-9"
   },
   "source": [
    "## 1. 用项目中的模型，观察三个固定数字"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a8ad323c0814abf86b7b07667a0e5f3",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "7a8ad323c0814abf86b7b07667a0e5f3",
    "html_anchor": "cell-10"
   },
   "source": [
    "**先预测**：同一个通道面对 7、2、1，会有哪些共同响应？本节从项目文件做真实前向，不重新训练。模型 SHA-256 与课件相同，才是同一模型；自己重训后应保存新的身份与结果。\n",
    "\n",
    "L1 是 Conv1→ReLU 后、Pool1 前，8×28×28；L2 是 Conv2→ReLU 后、Pool2 前，16×14×14。下一节只改变观察的层和通道。"
   ]
  },
  {
   "cell_type": "code",
   "id": "a174fb58c9a049628be6d07e45d17c41",
   "metadata": {
    "deepnote_block_type": "code",
    "deepnote_block_id": "a174fb58c9a049628be6d07e45d17c41",
    "html_anchor": "cell-11"
   },
   "source": [
    "raw_images=gzip.decompress(asset_bytes['t10k-images-idx3-ubyte.gz'])\n",
    "raw_labels=gzip.decompress(asset_bytes['t10k-labels-idx1-ubyte.gz'])\n",
    "images=np.frombuffer(raw_images,dtype=np.uint8,offset=16).reshape(10000,1,28,28)[:3].copy()\n",
    "labels=np.frombuffer(raw_labels,dtype=np.uint8,offset=8)[:3].copy()\n",
    "assert labels.tolist()==[7,2,1]\n",
    "inputs=torch.tensor(images,dtype=torch.float32)/255\n",
    "with torch.no_grad():\n",
    "    relu1=source_model.relu1(source_model.conv1(inputs))\n",
    "    relu2=source_model.relu2(source_model.conv2(source_model.pool1(relu1)))\n",
    "    logits=source_model(inputs)\n",
    "measured={'inputs':inputs.numpy(),'labels':labels,'test_indices':np.arange(3),\n",
    "          'relu1':relu1.numpy(),'relu2':relu2.numpy(),'logits':logits.numpy()}\n",
    "response_manifest={'color':{'layers':{\n",
    " 'relu1':{'max':max(float(relu1.max()),1e-12)},\n",
    " 'relu2':{'max':max(float(relu2.max()),1e-12)}}}}\n",
    "print('固定 test 序号:',measured['test_indices'].tolist(),'真实标签:',labels.tolist())\n",
    "print('模型预测:',logits.argmax(1).tolist())\n",
    "print('本次同层统一色标:',response_manifest['color']['layers'])\n",
    "print('模型 SHA-256:',model_sha256)\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "a41db38b980247f59f421b5ac0132626",
   "metadata": {
    "deepnote_block_type": "text-cell-h2",
    "deepnote_block_id": "a41db38b980247f59f421b5ac0132626",
    "html_anchor": "cell-12"
   },
   "source": [
    "## 2. 先找共同现象，再核对位置"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a74259745af04c03baae6de75a4c7c0a",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "a74259745af04c03baae6de75a4c7c0a",
    "html_anchor": "cell-13"
   },
   "source": [
    "**同一个通道，面对 7、2、1 会在哪里响应？** 先沿同一列从输入看到响应，再横向比较三列的共同现象。\n",
    "\n",
    "![三个真实MNIST输入、同一CNN第二层第0通道响应及理论输入支持范围](data:image/webp;base64,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)\n",
    "\n",
    "*已保存的真实参考：官方 test 序号 0/1/2，标签 7/2/1；课件检查点 `ba8b738c…14eeba3`，relu2/c0。输入为 28×28、灰度范围 0–1；响应为 14×14，三图统一色标 0–8.802（来自同层三输入、全部通道）。金框上方为理论输入支持范围，下方为最大响应单元，坐标从 0 编号。图来自此前本地前向计算。*\n",
    "\n",
    "**先指出一种共同现象：** 三个输入都能激活此通道，峰值却不在相同坐标。能否因此把它命名为“数字 7 检测器”？为什么还不够？\n",
    "\n",
    "**只改一次：** 保持 `LAYER='relu2'`，把 `CHANNEL=0` 改成 1。先预测响应位置是否相同，再运行。随后可单独换层；L1 参考范围约 0–2.363，L2 约 0–8.802，层间颜色深浅不能直接比较。使用自己重训的模型时，代码会打印本次哈希并重新统计同层色标。"
   ]
  },
  {
   "cell_type": "code",
   "id": "5bc75d6027254dc0a555c45c041abc07",
   "metadata": {
    "deepnote_block_type": "code",
    "deepnote_block_id": "5bc75d6027254dc0a555c45c041abc07",
    "html_anchor": "cell-14"
   },
   "source": [
    "LAYER='relu2'   # relu1 / relu2\n",
    "CHANNEL=0      # L1: 0..7; L2: 0..15\n",
    "assert LAYER in ('relu1','relu2')\n",
    "activation={'relu1':relu1.numpy(),'relu2':relu2.numpy()}[LAYER]\n",
    "assert 0<=CHANNEL<activation.shape[1]\n",
    "vmax=response_manifest['color']['layers'][LAYER]['max']\n",
    "def support(row,col,layer):\n",
    "    size,jump,offset=(3,1,-1) if layer=='relu1' else (8,2,-3)\n",
    "    top,left=row*jump+offset,col*jump+offset\n",
    "    return max(0,top),max(0,left),min(28,top+size),min(28,left+size)\n",
    "def peak_summary(a):\n",
    "    a=np.asarray(a)\n",
    "    assert a.ndim==2 and np.isfinite(a).all()\n",
    "    peak=float(a.max())\n",
    "    ties=np.argwhere(a==peak)\n",
    "    # These are post-ReLU responses. Zero has no meaningful positive hotspot.\n",
    "    if peak<=0:\n",
    "        return {'peak':peak,'peak_row_col':None,'tied_maxima':len(ties),'has_positive_response':False}\n",
    "    row,col=map(int,ties[0])\n",
    "    return {'peak':peak,'peak_row_col':[row,col],'tied_maxima':len(ties),'has_positive_response':True}\n",
    "fig,axes=plt.subplots(2,3,figsize=(10,6),layout='constrained')\n",
    "observations=[]\n",
    "for j in range(3):\n",
    "    a=activation[j,CHANNEL];summary=peak_summary(a)\n",
    "    axes[0,j].imshow(measured['inputs'][j,0],cmap='gray',vmin=0,vmax=1)\n",
    "    axes[0,j].set_title(f\"test {j}: label {measured['labels'][j]}\")\n",
    "    im=axes[1,j].imshow(a,cmap='Blues',vmin=0,vmax=vmax,interpolation='nearest')\n",
    "    if summary['has_positive_response']:\n",
    "        row,col=summary['peak_row_col']\n",
    "        top,left,bottom,right=support(row,col,LAYER)\n",
    "        axes[0,j].add_patch(Rectangle((left-.5,top-.5),right-left,bottom-top,fill=False,color='#FDB515',lw=2))\n",
    "        axes[1,j].add_patch(Rectangle((col-.5,row-.5),1,1,fill=False,color='#FDB515',lw=2))\n",
    "        axes[1,j].set_title(f'{LAYER}/c{CHANNEL}'+chr(10)+f'peak ({row},{col}) = {summary[\"peak\"]:.3f}; ties={summary[\"tied_maxima\"]}')\n",
    "        summary['support']=[top,left,bottom,right]\n",
    "    else:\n",
    "        axes[1,j].set_title(f'{LAYER}/c{CHANNEL}'+chr(10)+'no positive response; no hotspot')\n",
    "        summary['support']=None\n",
    "    observations.append({'test_index':j,**summary})\n",
    "fig.colorbar(im,ax=axes.ravel().tolist(),shrink=.7,label='response (same layer scale)')\n",
    "plt.show()\n",
    "print(json.dumps(observations,ensure_ascii=False,indent=2))\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "80fa11c9e9ae40f9b236488f20d27e7d",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "80fa11c9e9ae40f9b236488f20d27e7d",
    "html_anchor": "cell-15"
   },
   "source": [
    "**解释**：最大处只是当前输入的一处响应高点。三个例子不足以命名稳定语义；理论支持范围也不说明每个像素都在此时产生影响。L1 c0 与 L2 c0 是两个不同通道，并非同一个 filter 穿过两层。\n",
    "\n",
    "**继续一步**：换一个通道，保持色标不变。代码同时记录峰值与并列最大位置数量；正响应并列时只为定位而选行优先的第一个，并明确报告 ties。若响应全为 0，坐标与支持区为 `None`，不画响应框或输入框，不能把首个数组位置解读成热点。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b68e5ea98ff5441b9523f9ad8aefbe80",
   "metadata": {
    "deepnote_block_type": "text-cell-h2",
    "deepnote_block_id": "b68e5ea98ff5441b9523f9ad8aefbe80",
    "html_anchor": "cell-16"
   },
   "source": [
    "## 3. 同样大小的遮挡，怎样成为可解释的比较？"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5cd9d36481d43519dbe6cbe659f3541",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "c5cd9d36481d43519dbe6cbe659f3541",
    "html_anchor": "cell-17",
    "deepnote": {
     "block_id": "c5cd9d36481d43519dbe6cbe659f3541"
    }
   },
   "source": [
    "**从“哪里响应”继续到“改变输入后，输出怎样变化”。** 固定第 0 个输入、目标类别 7、该类 logit、5×5 框与填充值 0；只把框放到两个位置。\n",
    "\n",
    "![真实数字7原图与笔画遮挡A和零变化背景对照B](data:image/webp;base64,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)\n",
    "\n",
    "*同一课件检查点的本地测量：原始 logit=14.3833；A 左上角 (行19,列10)，实际改变 16 像素，logit=13.9187；B 位于 (0,0)，改变 0 像素，logit 不变。灰度范围 0–1；两框虽同为 5×5，扰动强度不同。*\n",
    "\n",
    "**先解释：** B 为什么看起来放了框，却没有真正改变输入？它是无像素改变的负对照，不是扰动强度匹配的对照。\n",
    "\n",
    "**只改一次：** 将 `FILL` 改为 .5，保持位置、尺寸、模型与目标不变。先预测 B 还会不会保持原分数，再运行并比较“改变像素数”和“绝对改变量之和”。遮挡自身也可能引入异常输入；分数下降不足以证明某块区域是必要或充分原因。这里的判断限定于同一模型与指定输入，不直接外推为所有物体的因果解释。\n",
    "\n",
    "![同一CNN和数字7的保存遮挡对照：同为5乘5框，A改16像素而B改0像素，对应不同logit变化](https://codingai-lec02.pages.dev/course/visuals/deepnote-final/lab08-occlusion-control.png)\n",
    "\n",
    "[打开矢量图](https://codingai-lec02.pages.dev/course/visuals/deepnote-final/lab08-occlusion-control.svg)\n",
    "\n",
    "**先分两列记录。** “遮挡框面积”描述操作范围，“改变像素数／绝对改变量”描述实际干预。把 `FILL` 改为0.5后，只能从新前向得到新的logit，图中的历史数值不随参数自动更新。"
   ]
  },
  {
   "cell_type": "code",
   "id": "4adf380cf26f4fe78bb70390e4e74590",
   "metadata": {
    "deepnote_block_type": "code",
    "deepnote_block_id": "4adf380cf26f4fe78bb70390e4e74590",
    "html_anchor": "cell-18"
   },
   "source": [
    "SAMPLE=0\n",
    "TARGET=int(measured['labels'][SAMPLE])\n",
    "PATCH_SIZE=5\n",
    "FILL=0.0\n",
    "PATCH_A=(19,10)\n",
    "PATCH_B=(0,0)\n",
    "assert 0<=SAMPLE<3 and 0<=TARGET<10 and 0<PATCH_SIZE<=28\n",
    "def occlude(x,corner):\n",
    "    row,col=corner\n",
    "    assert 0<=row<=28-PATCH_SIZE and 0<=col<=28-PATCH_SIZE\n",
    "    z=x.clone();z[:,:,row:row+PATCH_SIZE,col:col+PATCH_SIZE]=FILL\n",
    "    return z\n",
    "original=inputs[SAMPLE:SAMPLE+1]\n",
    "variants=torch.cat([original,occlude(original,PATCH_A),occlude(original,PATCH_B)])\n",
    "with torch.no_grad():\n",
    "    scores=source_model(variants)[:,TARGET].numpy()\n",
    "fig,axes=plt.subplots(1,3,figsize=(9,3))\n",
    "change=(variants-original).abs()\n",
    "changed_pixels=(change>0).flatten(1).sum(1).tolist()\n",
    "absolute_change=change.flatten(1).sum(1).tolist()\n",
    "for j,(ax,x,score,name) in enumerate(zip(axes,variants[:,0],scores,['original','patch A','patch B'])):\n",
    "    ax.imshow(x,cmap='gray',vmin=0,vmax=1)\n",
    "    if j:\n",
    "        row,col=(PATCH_A,PATCH_B)[j-1]\n",
    "        ax.add_patch(Rectangle((col-.5,row-.5),PATCH_SIZE,PATCH_SIZE,fill=False,color='#FDB515',lw=2))\n",
    "    ax.set_title(f'{name}: logit={score:.3f}'+chr(10)+f'{changed_pixels[j]} changed pixels');ax.axis('off')\n",
    "plt.show()\n",
    "occlusion_result={'sample':SAMPLE,'target':TARGET,'score':'target logit','patch_size':PATCH_SIZE,'fill':FILL,\n",
    "                  'patch_A':PATCH_A,'patch_B':PATCH_B,'scores':scores.tolist(),\n",
    "                  'changed_pixels':changed_pixels,'absolute_pixel_change_sum':absolute_change,\n",
    "                  'original_minus_A':float(scores[0]-scores[1]),'original_minus_B':float(scores[0]-scores[2])}\n",
    "print(json.dumps(occlusion_result,ensure_ascii=False,indent=2))\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "5428c0b097d9437fa766a31ba08a53f3",
   "metadata": {
    "deepnote_block_type": "text-cell-h2",
    "deepnote_block_id": "5428c0b097d9437fa766a31ba08a53f3",
    "html_anchor": "cell-19"
   },
   "source": [
    "## 4. 把观察变成下一项检验"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68209ba387f844978bc4629ac5946504",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "68209ba387f844978bc4629ac5946504",
    "html_anchor": "cell-20",
    "deepnote": {
     "block_id": "68209ba387f844978bc4629ac5946504"
    }
   },
   "source": [
    "| 只改变一项 | 运行前先写 | 输出后核对 | 接下来怎样追问 |\n",
    "| --- | --- | --- | --- |\n",
    "| 固定层，换通道 | 哪些输入可能共同激活 | 同一色标下的位置、峰值与并列最大数 | 增加事先选定的输入，检验共同现象 |\n",
    "| 固定位置与框大小，改填充值 | 背景B会不会仍是零扰动 | 改变像素数、绝对改变量、目标logit差 | 把扰动强度与位置分别控制 |\n",
    "\n",
    "给同伴讲清一个结果：**我只改了什么 → 哪个读数变化 → 支持了哪个判断 → 哪个结论还不能推出。** 不需要为完成表格而重跑整套训练。\n",
    "\n",
    "历史10,000张测试图的9533/8464正确数来自LAB02原图／右移实验；本册的三个固定输入不能用来重新报告总体准确率。\n",
    "\n",
    "[响应材料与来源清单](https://codingai-lec02.pages.dev/responses-v8/manifest.json) · [第二讲 CLS05 · 观察与迁移](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/c0b185e7-d7e3-48b6-a605-8f1acdfe243c/notebook/a9c291b4c33b49d2aa7737b6215853d6?utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_content=a9c291b4c33b49d2aa7737b6215853d6&utm_term=get_notebook) · [第二讲导读](https://codingai-lec02.pages.dev/course/guide.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be63f693a9ca422ab6b553f6b6ce2756",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "be63f693a9ca422ab6b553f6b6ce2756",
    "html_anchor": "cell-21"
   },
   "source": [
    "**返回课堂导读** · [返回幻灯片](https://codingai-lec02.pages.dev/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91fe7128336a499eb0911954203ed4c3",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "91fe7128336a499eb0911954203ed4c3",
    "html_anchor": "cell-22"
   },
   "source": [
    "运行本节代码生成你的图表，再对照运行前的预测。记录本次模型、参数和观察结果；不同模型的结果不要混写成课件的既有实验。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "019477543e714198bf084e6fd5755ca2",
   "metadata": {
    "deepnote_block_type": "markdown",
    "deepnote_block_id": "019477543e714198bf084e6fd5755ca2",
    "html_anchor": "cell-23"
   },
   "source": [
    "**本册计算边界**：先按同一色标比较真实通道，再用遮挡对照检查指定输出。全零响应检查只验证显示规则；遮挡分数来自本册加载的模型。两种检验不相互替代。"
   ]
  }
 ]
}