卷积操作
卷积核与局部区域逐元素相乘求和,在空间位置生成特征图。
学习目标
- 一个 2×2 核扫描 3×3 图像
- padding=1 是否总能保持空间尺寸?
- 说明:构造图像的固定响应只验证局部运算,不代表这个核能识别真实图像类别。
为什么需要这个概念
二维卷积层用可学习的局部核扫描输入空间,每个输出位置是覆盖窗口内的加权和。PyTorch Conv2d 实际执行互相关,核不会像严格数学卷积那样先翻转。
学习前需要掌握
背景与问题
图像相邻像素的关系通常比任意两点更紧密。把整幅图像展平成全连接输入会忽略这种结构,并为每个位置分别学习大量参数;卷积用局部连接与权重共享表达这个先验。
概念定义
二维卷积层用可学习的局部核扫描输入空间,每个输出位置是覆盖窗口内的加权和。PyTorch Conv2d 实际执行互相关,核不会像严格数学卷积那样先翻转。
直观理解
同一把检测尺在图像各处使用,能让一个边缘检测器同时响应左上角和右下角的相似图案。
核心原理
普通 Conv2d 的核形状为输出通道数、输入通道数、核高、核宽。一个输出通道不是只看某一个输入通道,而是把所有输入通道对应的局部加权和相加,再加该输出通道的偏置。groups 卷积会改变这种连接关系。
stride 决定窗口移动步长,padding 决定边界是否补值,dilation 决定核采样点之间的间隔。有效核大小为 D×(K−1)+1,应代入尺寸公式;步长大于 1 时会减少空间采样密度。
权重共享使参数量与图像宽高无关,但激活内存和计算量仍随空间面积增长。边界填充、下采样以及输入平移都可能改变输出,因此不能把平移等变误说成任意平移下输出完全不变。
数学表达
核心公式
二维卷积层用可学习的局部核扫描输入空间,每个输出位置是覆盖窗口内的加权和。PyTorch Conv2d 实际执行互相关,核不会像严格数学卷积那样先翻转。
变量含义
K核大小S步幅P填充D空洞率
计算步骤
- 1左上窗口计算 1−5=-4。
- 2水平和垂直各移动一步,重复相同核计算。
代码对应位置
示例 1一个 2×2 核扫描 3×3 图像的最小验证:使用完整构造输入核对一个 2×2 核扫描 3×3 图像,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
K | 核大小 |
S | 步幅 |
P | 填充 |
D | 空洞率 |
完整数值示例
一个 2×2 核扫描 3×3 图像
已知条件
- 图像逐行为 1,2,3;4,5,6;7,8,9
- 核为第一行 (1,0)、第二行 (0,-1),无偏置、无 padding
计算步骤
- 左上窗口计算 1−5=-4。
- 水平和垂直各移动一步,重复相同核计算。
计算结果
输出形状为 (1,1,2,2),四个位置均为 -4。
处理前后对比
- 构造图像的固定响应只验证局部运算,不代表这个核能识别真实图像类别。
一个 2×2 核扫描 3×3 图像
左上输出比较的是窗口左上与右下两个点;右上窗口比较 2 和 6,仍为 -4。这里没有翻转核,因此符号对应 PyTorch 的互相关约定。
若增加一个输入通道,就必须同时增加该输出通道的另一片核,并把两通道贡献相加。若 stride 改为 2,本例只保留一个窗口,信息与输出大小都会改变。
计算与实现步骤
- 左上窗口计算 1−5=-4。
- 水平和垂直各移动一步,重复相同核计算。
代码实现
示例 1
一个 2×2 核扫描 3×3 图像的最小验证
example_01.py用途:使用完整构造输入核对一个 2×2 核扫描 3×3 图像,输出只表示本例计算。
import torch
from torch import nn
conv = nn.Conv2d(1, 1, 2, bias=False)
with torch.no_grad():
conv.weight.copy_(torch.tensor([[[[1., 0.], [0., -1.]]]]))
x = torch.arange(1., 10.).reshape(1, 1, 3, 3)
y = conv(x)
print(tuple(y.shape))
print(y.detach().flatten().tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对一个 2×2 核扫描 3×3 图像,输出只表示本例计算。
y- 目标标签或连续目标值。
Step 1 · 1–9 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
from torch import nn
conv = nn.Conv2d(1, 1, 2, bias=False)
with torch.no_grad():
conv.weight.copy_(torch.tensor([[[[1., 0.], [0., -1.]]]]))
x = torch.arange(1., 10.).reshape(1, 1, 3, 3)
y = conv(x)
print(tuple(y.shape))
print(y.detach().flatten().tolist())预期输出或运行结果
(1, 1, 2, 2) [-4.0, -4.0, -4.0, -4.0]
常见错误 · 4 条
- 把 NHWC 当 NCHW
- 公式忘 dilation
- 核通道理解成二维
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- 图像局部特征提取
- 手算卷积输出与边界行为
常见错误
- 把 NHWC 当 NCHW
- 公式忘 dilation
- 核通道理解成二维
常见问题
padding=1 是否总能保持空间尺寸?
不能。对 3×3、stride=1、dilation=1 的核可以保持;核大小、步长和膨胀率改变后必须重新代入尺寸公式。
这个示例能说明什么边界?
构造图像的固定响应只验证局部运算,不代表这个核能识别真实图像类别。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。