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. 重要提示与技巧

  1. 关于权重 (Weights):

  2. Stride vs Dilation:

    • stride 是移动步长,跳过像素以减小尺寸。

    • dilation 是卷积核内部点之间的距离,增加感受野而不增加参数量。

  3. 计算性能:

    在某些平台上(如 NVIDIA GPU 使用 cuDNN),卷积实现会根据输入形状自动寻找最快算法。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐