直接看例子
import torch.nn as nn
conv = nn.Conv2d(3, 64, kernel_size=3)
print(conv.weight.shape) # [64, 3, 3, 3]
这4个数字分别是什么?
记忆方法:出入高宽
[64, 3, 3, 3]
↓ ↓ ↓ ↓
出 入 高 宽
- 出:输出通道数
- 入:输入通道数
- 高:卷积核高度
- 宽:卷积核宽度
生活化理解
把卷积操作想象成"照片滤镜工厂":
nn.Conv2d(3, 64, 3) # 一个滤镜工厂
- 工厂里有64个不同的滤镜
- 每个滤镜都能处理彩色照片(3通道RGB)
- 每个滤镜都是3×3大小
所以权重就是:64个滤镜,每个都是3×3×3的立体结构。
多个例子
# 黑白照片处理
Conv2d(1, 16, 5) → [16, 1, 5, 5]
# 彩色照片处理
Conv2d(3, 64, 3) → [64, 3, 3, 3]
# 深层特征处理
Conv2d(64, 128, 1) → [128, 64, 1, 1]
看出规律了吗?第一个数字永远是输出通道数,第二个数字永远是输入通道数。
为什么要这样?
处理RGB图片时:
- 输入有3层(红绿蓝)
- 每个卷积核必须同时处理这3层
- 要输出64个特征,就需要64个卷积核
- 每个卷积核的形状:[输入层数, 高, 宽] = [3, 3, 3]
- 总权重形状:[卷积核个数, 输入层数, 高, 宽] = [64, 3, 3, 3]
验证公式
Conv2d(输入通道, 输出通道, 核大小)
权重形状 = [输出通道, 输入通道, 核高, 核宽]
验证:
Conv2d(3, 64, 3) → [64, 3, 3, 3] ✓
Conv2d(1, 32, 5) → [32, 1, 5, 5] ✓
Conv2d(16, 8, (2,4)) → [8, 16, 2, 4] ✓
记住这一点
Conv2D的权重形状就是:[几个滤镜, 输入几层, 滤镜多高, 滤镜多宽]
用"出入高宽"四个字记忆,基本不会错。