nn.Conv2d 是 PyTorch 中用于实现二维卷积操作的类。它的数学计算原理基于卷积运算,通过对输入特征图(input feature map)和卷积核(kernel)进行滑动窗口计算,生成输出特征图(output feature map)。以下是 nn.Conv2d 的数学计算原理的详细说明:


1. 输入和输出

  • 输入:一个四维张量,形状为 (batch_size, in_channels, H, W),其中:

    • batch_size:批大小。

    • in_channels:输入特征图的通道数。

    • H 和 W:输入特征图的高度和宽度。

  • 卷积核:一个四维张量,形状为 (out_channels, in_channels, kernel_size, kernel_size),其中:

    • out_channels:输出特征图的通道数。

    • in_channels:输入特征图的通道数(与输入张量的 in_channels 一致)。

    • kernel_size:卷积核的大小(如 3x3)。

  • 输出:一个四维张量,形状为 (batch_size, out_channels, H_out, W_out),其中:

    • H_out 和 W_out:输出特征图的高度和宽度。


2. 卷积运算的数学公式

对于输入特征图 XX 和卷积核 KK,卷积运算的数学公式如下:

Yi,j,k=∑c=1Cin∑u=1Kh∑v=1KwXi,c,sh⋅(j−1)+u,sw⋅(k−1)+v⋅Kk,c,u,v+bkYi,j,k​=c=1∑Cin​​u=1∑Kh​​v=1∑Kw​​Xi,c,sh​⋅(j−1)+u,sw​⋅(k−1)+v​⋅Kk,c,u,v​+bk​

其中:

  • Yi,j,kYi,j,k​:输出特征图在第 ii 个样本、第 kk 个通道、位置 (j,k)(j,k) 的值。

  • XX:输入特征图。

  • KK:卷积核。

  • bkbk​:偏置项(可选)。

  • CinCin​:输入特征图的通道数。

  • KhKh​ 和 KwKw​:卷积核的高度和宽度。

  • shsh​ 和 swsw​:步幅(stride)的高度和宽度。


3. 关键参数

nn.Conv2d 的主要参数包括:

  • in_channels:输入特征图的通道数。

  • out_channels:输出特征图的通道数。

  • kernel_size:卷积核的大小(如 3 或 (3, 3))。

  • stride:卷积核的步幅(如 1 或 (1, 1))。

  • padding:输入特征图的填充大小(如 0 或 (1, 1))。

  • dilation:卷积核的膨胀率(默认为 1)。

  • groups:分组卷积的组数(默认为 1)。

  • bias:是否使用偏置项(默认为 True)。


4. 计算过程

4.1 滑动窗口
  • 卷积核在输入特征图上滑动,每次滑动一个步幅(stride)。

  • 在每个位置,卷积核与输入特征图的对应区域进行逐元素相乘并求和,得到一个输出值。

4.2 填充(Padding)
  • 如果设置了填充(padding),则在输入特征图的边缘填充零(或其他值),以控制输出特征图的大小。

  • 填充后的输入特征图大小为:

    Hin′=Hin+2⋅paddinghHin′​=Hin​+2⋅paddingh​Win′=Win+2⋅paddingwWin′​=Win​+2⋅paddingw​
4.3 输出特征图大小
  • 输出特征图的大小由以下公式计算:

    Hout=⌊Hin+2⋅paddingh−dilationh⋅(Kh−1)−1strideh+1⌋Hout​=⌊strideh​Hin​+2⋅paddingh​−dilationh​⋅(Kh​−1)−1​+1⌋Wout=⌊Win+2⋅paddingw−dilationw⋅(Kw−1)−1stridew+1⌋Wout​=⌊stridew​Win​+2⋅paddingw​−dilationw​⋅(Kw​−1)−1​+1⌋

5. 示例

假设:

  • 输入特征图大小为 (1, 3, 32, 32)(1 个样本,3 个通道,高度 32,宽度 32)。

  • 卷积核大小为 (16, 3, 3, 3)(16 个输出通道,3 个输入通道,3x3 卷积核)。

  • 步幅为 (1, 1),填充为 (1, 1)

则输出特征图的大小为:

Hout=⌊32+2⋅1−1⋅(3−1)−11+1⌋=32Hout​=⌊132+2⋅1−1⋅(3−1)−1​+1⌋=32Wout=⌊32+2⋅1−1⋅(3−1)−11+1⌋=32Wout​=⌊132+2⋅1−1⋅(3−1)−1​+1⌋=32

输出特征图的形状为 (1, 16, 32, 32)


6. 代码示例

以下是一个简单的 nn.Conv2d 的使用示例:

python

复制

import torch
import torch.nn as nn

# 定义卷积层
conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)

# 输入特征图 (batch_size=1, in_channels=3, H=32, W=32)
input_tensor = torch.randn(1, 3, 32, 32)

# 前向传播
output_tensor = conv(input_tensor)

# 打印输出形状
print("输入形状:", input_tensor.shape)  # 输出: torch.Size([1, 3, 32, 32])
print("输出形状:", output_tensor.shape)  # 输出: torch.Size([1, 16, 32, 32])

7. 总结

  • nn.Conv2d 的核心是卷积运算,通过滑动窗口和逐元素相乘并求和的方式提取局部特征。

  • 通过调整卷积核大小、步幅、填充等参数,可以控制输出特征图的大小和形状。

  • 卷积操作是深度学习中提取空间特征的基础,广泛应用于图像处理、计算机视觉等领域。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐