这本材料用于第二讲 B 段的观察与干预:固定已训练 CNN,先描述响应在哪里,再用匹配的遮挡对照检查指定分数怎样变化。阅读保存图无需重新训练。
先读第 1–2 节,再做一个检查:到 LAB 08 · 从真实响应到遮挡对照 固定一个输入与目标类别,比较同尺寸遮挡。记录原图、遮挡位置、同一目标分数与差值;最后解释观察支持了什么。
当前对象名称中的“迁移”保留。第 3 节通往第三讲的独立材料:第二讲不把迁移实验混进响应图的证据链。册末参考进一步区分理论感受野、梯度敏感性与有限遮挡,按讨论需要阅读。
1. 同一个通道,面对不同数字在哪里响应?
课件与图解:真实响应里,哪些位置和通道不同? · 同一通道的完整参考
先横着读。 固定第一层 c0,依次看数字 7、2、1:较强响应分别出现在哪里?先写一条共同现象,再找一个不完全相同的地方。

图中金色小方框只标该响应图的峰值地址。L1 c0 与 L2 c0 编号相同,却是不同层的不同通道;不能把纵向两格当成同一个 filter 的成长过程,也不能根据三例就把它命名为“数字7检测器”。
把“在哪里”落实成坐标。 坐标均为左上原点、零基 (行,列),并列最大值取行优先的第一个:
| 固定输入 | L1 c0 峰值;(行,列) | L2 c0 峰值;(行,列) |
|---|---|---|
| test 0:7 | 2.2682;(24,12) | 4.1919;(11,6) |
| test 1:2 | 2.2885;(18,9) | 4.8896;(10,8) |
| test 2:1 | 1.9922;(19,13) | 3.4817;(10,6) |
L1 的位置 (r,c) 最多读取原图从 (r−1,c−1) 开始的 3×3 范围;L2 则从 (2r−3,2c−3) 开始,范围 8×8。超出图像部分来自补零。于是 test 0 两个峰值的理论支持区分别为 [23,11,26,14] 与 [19,9,27,17],次序为 [top,left,bottom,right],下边、右边不包含。支持范围说明结构允许依赖哪些位置,不意味着每个像素当前都实际贡献,更不是因果解释。
读图条件。 同一既有未增强 CNN,官方 test 0/1/2 在查看响应前固定,标签依次为 7/2/1;输入 uint8/255,范围 [0,1]。L1 为 ReLU 后、pool1 前 8×28×28;L2 为 ReLU 后、pool2 前 16×14×14。每层跨三个输入的所有通道统一 Blues 色标:L1 [0,2.3630995750427246],L2 [0,8.801921844482422],nearest 显示。层内可比颜色,跨层不可直接比深浅。三例恰好预测正确也不构成代表性性能评价。
先预测与核对:先写观察句,再手算 test 0 的两个支持区。LAB 08 可以换层、换通道,复用检查点重新前向核对;无需重新训练。接着问:如果改变响应较高的区域,指定类别分数一定会变吗?
本图直接重排已保存的 responses-v8/full-values.npz,无生成响应值;模型身份与来源见本册末尾及响应清单。
2. 遮挡后分数变化,需要怎样的对照?
按需参考:遮住自行车后分数变化,还要和什么比较?
先把两个问题分开:响应图告诉我们哪里亮,遮挡对照检验替换某区域后指定分数怎样变。不能从“亮”直接跳到“这个区域决定分类”。

读图后先预测:如果两处遮挡都让目标分数下降,能否只凭下降把其中一处叫作目标概念?先写出还需要比较什么,再看下面的实验设计。
遮挡对照页 换到自行车分类情境,展示尚未运行的实验设计。固定模型和目标类别,记录原图的同一类别分数;用相同面积、相同填充值的块,分别遮住自行车、墙面和其他背景,比较各自的分数差。三处结果都保持待测,情境图上的遮挡不是已经得到的模型解释。
| 保持条件 | 改变条件 | 要记录 |
|---|---|---|
| 模型、预处理、目标类别 | 遮挡位置 | 原分数与各次遮挡后的同一分数 |
| 遮挡面积、填充方式 | 自行车/墙面/其他背景 | 对照间分数差 |
不要遮挡后改读“新的最高类别分数”,否则比较对象已经变化。一次下降描述的是该替换干预下指定输出的变化;区域大小、填充值与输入分布改变都可能影响结论。第一轮先固定条件,之后再逐项检查稳健性,不能从一张遮挡图推出网络完整的因果理解。
先预测与核对:在纸上写一个最小对照方案,圈出目标类别、面积和填充三项;预测对象区与背景区可能出现的两种结果,不补造数值。随后在 LAB 08 · 从真实响应到遮挡对照 对内置数字样本执行同尺寸遮挡对照,实际记录一个固定目标分数的变化。这是数字模型上的可运行练习,不是自行车分类器的结果;不要把上一节的理论支持框直接改名为遮挡证据。完成干预检查后,回到第二讲的结构问题:局部测量怎样通过层叠和连接形成整体判断?跨任务使用这些表示的独立问题归第三讲。
3. 跨讲入口:迁移部分已归第三讲
已训练表示能否帮助新的任务,是第三讲的开场问题;有监督学到的表示也可以迁移,自监督只是另一条学习途径。
- 第三讲 CLS 01 · 从可迁移权重到可比较的表示:沿冻结骨干、只训练读出和更多参数更新,读清“复用什么、改什么”。
- 第三讲 LAB 09 · 用验证结果选择迁移范围:用独立数字二分类实验选择更新范围,保留验证选择与最终测试的分工。
- 第三讲导读:查看现有材料与后续空间、时间及多模态内容。
这些材料中的模型、数据和任务按各自实验说明读取,不把本册三张 MNIST 响应图直接当作迁移性能证据。完成本册观察/干预后,也可以先返回第二讲结构与成本主线。
把本段主线连起来
请把观察与干预分别写成一个完整句子:我固定了什么对象,改变了什么条件,观察了什么结果,这能支持什么、还不能说明什么。响应峰值不是类别专用性,理论支持区不是因果贡献,遮挡差值需要匹配的负对照。
本课响应的来源记录:teaching/labs-v2/results/cnn-plain-state.pt,未增强 CNN,最小干净验证交叉熵选择 epoch 6;SHA-256 为 ba8b738cc67d4ec3cd83d75a5dbe8a70ec548377335ba0abaaa7c23cd14eeba3。两层响应页/同通道响应页 的补图仅做前向,没有重新训练;不声称逐像素复现缺失的旧 small-cnn-state.pt 位图。完整测试原图 9533/10000、右移 2px 8464/10000 与既有记录一致。输入文件校验、全部通道和色标见响应清单。
完整前向与干预到 LAB08。迁移评价到第三讲,第二讲继续检查连接和运算成本。
课堂核对:先预测,再运行
下面只读取内嵌的已保存 c0 摘录,核对理论支持区坐标与层内色标。它不重新推理、训练或生成性能数字。先独立算 test 0 的两个支持框,再运行核对;真实前向和遮挡到 LAB08。
查看代码 · 单元 13
# 以下records是已保存的实测摘录;本代码核对坐标,不重新前向或训练。
from math import isclose
records = [{'test_index': 0, 'label': 7, 'layer': 'relu1', 'peak': 2.2682111263275146, 'row_col': [24, 12], 'rf': [23, 11, 26, 14]}, {'test_index': 0, 'label': 7, 'layer': 'relu2', 'peak': 4.19194221496582, 'row_col': [11, 6], 'rf': [19, 9, 27, 17]}, {'test_index': 1, 'label': 2, 'layer': 'relu1', 'peak': 2.288503408432007, 'row_col': [18, 9], 'rf': [17, 8, 20, 11]}, {'test_index': 1, 'label': 2, 'layer': 'relu2', 'peak': 4.889586448669434, 'row_col': [10, 8], 'rf': [17, 13, 25, 21]}, {'test_index': 2, 'label': 1, 'layer': 'relu1', 'peak': 1.9921979904174805, 'row_col': [19, 13], 'rf': [18, 12, 21, 15]}, {'test_index': 2, 'label': 1, 'layer': 'relu2', 'peak': 3.4817421436309814, 'row_col': [10, 6], 'rf': [17, 9, 25, 17]}]
color_max = {'relu1': 2.3630995750427246, 'relu2': 8.801921844482422}
def support_box(layer, row, col):
if layer == 'relu1':
top, left, size = row-1, col-1, 3
elif layer == 'relu2':
top, left, size = 2*row-3, 2*col-3, 8
else:
raise ValueError(layer)
return [top, left, top+size, left+size] # bottom/right不包含
for rec in records:
row, col = rec['row_col']
box = support_box(rec['layer'], row, col)
assert box == rec['rf']
assert 0 <= rec['peak'] <= color_max[rec['layer']]
print('test', rec['test_index'], rec['layer'], 'c0峰值位置=', (row, col), '理论支持=', box)
# 边界位置:超出28x28部分来自padding;裁切后的实际像素范围可能更小。
raw = support_box('relu2', 0, 0)
clipped = [max(0, raw[0]), max(0, raw[1]), min(28, raw[2]), min(28, raw[3])]
assert raw == [-3, -3, 5, 5] and clipped == [0, 0, 5, 5]
print('构造的边界地址:', raw, '可见输入像素:', clipped)
print('支持范围由结构计算;它不是遮挡结果,也不是因果归因。')
记录三件事:一条从图中观察到的共同现象;一条不能由三例推出的结论;一个同面积、同填充的遮挡对照。请让 AI 实现你提出的一个改动,再核对模型、输入、shape 和输出身份,最后解释它是否支持预测。
参考:响应、理论依赖与有限遮挡是三种问题
最强响应样本问的是某个单元偏好什么输入;反演问的是哪些输入仍能产生相近表示,帮助观察保留的信息;遮挡问的是替换某个输入区域后,指定输出怎样改变。这些方法的优化目标、干预条件和可支持结论不同,一幅直观图不能把它们合并成“网络在想什么”。
Zeiler 与 Fergus 的架构诊断利用首层特征与重建观察发现局部测量、采样可能存在问题,再调整核大小与 stride,并用训练及识别结果检验。因为不只改动一个因素,这不能被讲成只改变 stride 的单因素消融。
设计遮挡实验时,先固定模型及版本、输入预处理、目标类别与目标分数,再固定遮挡面积、填充方式和位置选择。比较目标区域与匹配面积的背景区域,并检查填充自身是否产生强烈分布外信号。主讲自行车遮挡页提出的是实验问题,没有已测出的分数可供引用。
若用已有 LAB 02 的 CNN,应该选择它确实接受的灰度数字输入;不能把未提供的自行车分类模型假装成已经可运行。本节任务是让实验对象与结论对齐。
先判断:遮住一个区域后猫的概率下降,能否说该区域就是“猫概念所在的位置”?
核对提示:不能。概率还依赖其他类别分数,遮挡可能引入异常纹理,网络也可能利用相关背景。至少比较 logits 与概率、匹配面积对照及多张样本,再界定观察范围。
来源与继续阅读
理论感受野由计算路径决定:哪些输入位置存在通往该输出的路径。有效影响则通过梯度、扰动或其他分析测量:在当前输入、参数与测量定义下,哪些位置影响更强。理论范围大,不保证网络有效使用了全部范围,也不保证理解了物体语义。
最小检查可以固定一个输出标量,对输入求梯度,再展示绝对梯度的空间分布;这描述局部敏感性。遮挡是有限幅度干预,结果不必与梯度完全一致。改变输入、目标输出或训练参数,分布也可能变化。
如果梯度为零,应先排查饱和或 ReLU 门、选错目标与是否开启梯度记录,不能直接宣布某区域永远无用。把结构范围、局部导数和干预变化并排记录,比只给一张热图更有解释力。
先判断:一个位置有计算路径,但当前梯度是零,二者矛盾吗?
核对提示:不矛盾。路径表示结构上的可能性;局部梯度还取决于当前权重、输入与激活状态。有限干预也可能跨越激活边界。
来源与继续阅读
查看代码 · 单元 18
# 合成可核对示例:对照设计,不是自行车模型的真实测量。
# 固定分类分数 s=3*object_signal + background_signal。
base={'object_signal':1.,'background_signal':1.}
def score(values): return 3*values['object_signal']+values['background_signal']
object_mask=dict(base,object_signal=0.)
background_mask=dict(base,background_signal=0.)
print('基准 / 对象干预 / 背景干预:',score(base),score(object_mask),score(background_mask))
assert [score(base),score(object_mask),score(background_mask)]==[4.,1.,3.]
# 正式图像实验还需匹配面积、填充、模型与样本;本式没有模拟这些条件。
plan={'model_version':'填写固定模型与权重版本',
'target':'填写类别及 logit/probability',
'preprocessing':'填写图像尺寸、归一化等',
'occlusion':'填写面积、位置、填充规则',
'control':'填写匹配面积的背景对照',
'records':'记录原图、干预图、分数与差值'}
for field,value in plan.items():print(field,':',value)
课程导航
在 Deepnote 返回 CLS 00 · 第二讲导读。静态课件链接返回对应主题;需保留原 Slides 停点时,请在新标签页打开材料。