神经网络-卷积
https://docs.pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d
1. 基本定义 (Definition)
Conv2d 是对由多个输入平面组成的输入信号进行 二维卷积 操作。
在最简单的情况下,对于输入大小为 $(N, C_{in}, H, W)$ 的层,输出大小为 $(N, C_{out}, H_{out}, W_{out})$ 的值可以表示为:

其中 $\star$ 是有效值的 互相关 (Cross-correlation) 运算。
2. 主要参数详解 (Parameters)
这是文档中最实用的部分,决定了你如何定义卷积层:
-
in_channels (int): 输入图像的通道数(例如:RGB 图像为 3,灰度图为 1)。
-
out_channels (int): 卷积产生的通道数(即卷积核的数量,决定了输出的深度)。
-
kernel_size (int or tuple): 卷积核的大小。如果是 3,则表示 $3 \times 3$;也可以是
(3, 5)。 -
stride (int or tuple, 可选): 卷积的步长,默认为 1。步长越大,输出特征图越小。
-
padding (int, tuple or str, 可选): 输入四周的填充。默认为 0(不填充)。填充可以保持特征图的大小或提取边缘信息。
-
dilation (int or tuple, 可选): 卷积核元素之间的间距(空洞卷积/膨胀卷积),用于扩大感受野。默认为 1。
-
groups (int, 可选): 从输入通道到输出通道的阻塞连接数。默认为 1。常用于深度可分离卷积(Depthwise Separable Convolution)。
-
bias (bool, 可选): 如果为
True(默认),则向输出添加可学习的偏置。 -
padding_mode (str, 可选): 填充模式,默认为
'zeros'(补零)。也支持'reflect'(反射)、'replicate'(复制)或'circular'(循环)。
3. 输入与输出的形状 (Shape)
这是在搭建网络时最容易出错的地方。
-
输入 (Input): $(N, C_{in}, H_{in}, W_{in})$
-
$N$: Batch size(批处理大小)
-
$C_{in}$: 输入通道数
-
$H_{in}$: 输入高度
-
$W_{in}$: 输入宽度
-
-
输出 (Output): $(N, C_{out}, H_{out}, W_{out})$

-
$H_{out}$ 和 $W_{out}$ 的计算公式如下:
-

import torch
import torch.nn as nn
# 定义卷积层:
# 输入通道3(RGB), 输出通道6, 卷积核大小5x5
m = nn.Conv2d(3, 6, 5)
# 假设输入一个 batch 为 2 的 32x32 RGB 图片
input = torch.randn(2, 3, 32, 32)
output = m(input)
print(output.shape)
# 输出结果将是 torch.Size([2, 6, 28, 28])
# 计算方法: 32 - 5 + 1 = 28
1. 定义卷积层:m = nn.Conv2d(3, 6, 5)
这一行代码是在告诉 PyTorch:“我要买一个过滤器(Filter/Kernel)”。
-
3(in_channels):输入图像有 3 个通道。这通常对应 RGB 彩色图片的红、绿、蓝。 -
6(out_channels):我想要 6 个不同的特征提取器。每个提取器都会生成一个全新的“特征图”。 -
5(kernel_size):每个过滤器的尺寸是 $5 \times 5$ 像素。
2. 准备输入数据:input = torch.randn(2, 3, 32, 32)
你可以把这看作是两张 $32 \times 32$ 的 RGB 照片:
-
2(Batch Size):一次处理 2 张图片。 -
3(Channels):每张图片有 3 个颜色通道(必须和上面定义的in_channels一致)。 -
32, 32(Height, Width):图片的尺寸。
3. 执行卷积:output = m(input)
当图片通过这个卷积层时,那 6 个 $5 \times 5$ 的卷积核会像“扫描仪”一样在图片上滑动。
-
为什么宽度/高度变成了 28?
因为卷积核有大小。当你把一个 $5 \times 5$ 的框放在 $32 \times 32$ 的格子上,且不使用填充(padding=0)时,这个框从左边缘滑动到右边缘,只能移动 $32 - 5 + 1 = 28$ 个位置。
-
计算公式:

4. 最终结果:torch.Size([2, 6, 28, 28])
-
2:还是那 2 张图片(Batch 大小不变)。 -
6:原本的 3 通道变成了 6 通道。这意味着我们从原始颜色中提取出了 6 种不同的抽象特征(比如边缘、线条、颜色斑点等)。 -
28, 28:特征图的尺寸。
5. 重要提示与技巧
-
关于权重 (Weights):

-
Stride vs Dilation:
-
stride是移动步长,跳过像素以减小尺寸。 -
dilation是卷积核内部点之间的距离,增加感受野而不增加参数量。
-
-
计算性能:
在某些平台上(如 NVIDIA GPU 使用 cuDNN),卷积实现会根据输入形状自动寻找最快算法。
更多推荐



所有评论(0)