pytorch基础 nn.Conv2d
nn.Conv2d是 PyTorch 中用于实现二维卷积操作的类。它的数学计算原理基于卷积运算,通过对输入特征图(input feature map)和卷积核(kernel)进行滑动窗口计算,生成输出特征图(output feature map)。以下是nn.Conv2d。
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∑Cinu=1∑Khv=1∑KwXi,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⋅paddinghWin′=Win+2⋅paddingwWin′=Win+2⋅paddingw
4.3 输出特征图大小
-
输出特征图的大小由以下公式计算:
Hout=⌊Hin+2⋅paddingh−dilationh⋅(Kh−1)−1strideh+1⌋Hout=⌊stridehHin+2⋅paddingh−dilationh⋅(Kh−1)−1+1⌋Wout=⌊Win+2⋅paddingw−dilationw⋅(Kw−1)−1stridew+1⌋Wout=⌊stridewWin+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的核心是卷积运算,通过滑动窗口和逐元素相乘并求和的方式提取局部特征。 -
通过调整卷积核大小、步幅、填充等参数,可以控制输出特征图的大小和形状。
-
卷积操作是深度学习中提取空间特征的基础,广泛应用于图像处理、计算机视觉等领域。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)