卷积层及其计算公式
- 前言
- 定义与功能
- 计算过程与输出尺寸
- 没有填充的情况
- 有填充的情况
- 网络结构中的表示
- 分析一:数字的含义
- 分析二:分支的含义
前言
卷积层是在深度学习领域中非常常见、基础且重要的一种神经网络层。许多初学者可能会对卷积层的功能、其计算过程以及它在神经网络中的作用感到困惑。在这篇文章中,我将为大家详细介绍卷积层的基本概念和运作原理。
定义与功能
卷积层主要执行的是卷积操作,这是一种在神经网络中常用的操作,用于从输入数据中提取特征。在卷积层中,多个卷积核(也称为滤波器)在输入数据上滑动,并在每个位置上执行逐元素的乘积运算,随后将这些乘积相加以产生输出特征图中的一个元素。这个过程在数学上被描述为卷积运算,其目的是通过滤波器提取输入数据的局部特征。卷积操作步骤如下图(这里采用的是2*2的卷积核):
计算过程与输出尺寸
卷积层的输出尺寸受到多个因素的影响,包括卷积核的尺寸、步幅(stride)和填充(padding)。以一个640x640像素的图像通过一个3x3卷积核的卷积层为例来说明:
没有填充的情况
如果没有填充,且步幅为1,则输出尺寸可以通过以下公式计算:
o
u
t
p
u
t
=
(
input_size
−
kernel_size
stride
)
+
1
output = \left( \frac{{\text{input\_size} - \text{kernel\_size}}}{{\text{stride}}} \right) + 1
output=(strideinput_size−kernel_size)+1
对于一个640x640的图像通过一个3x3的卷积核,步幅为1的情况下,输出尺寸为:
o u t p u t = ( 640 − 3 1 ) + 1 = 638 output = \left( \frac{{640 - 3}}{1} \right) + 1 = 638 output=(1640−3)+1=638
因此,输出的特征图大小为 638x638。这里假设了没有填充且步幅为 1 的情况。填充和步幅的设置会影响输出的大小。
有填充的情况
当在卷积操作中使用填充时,会在输入数据的边缘周围添加额外的像素值(通常是0),以便控制输出特征图的大小。填充的主要目的是为了保持输入和输出的大小相同,或者为了在卷积操作中保留边缘信息。
如果我们使用填充来保持输入和输出的大小相同,并且使用3x3的卷积核,则所需的填充大小计算如下:
o u t p u t = ( input_size + 2 × padding − kernel_size stride ) + 1 output = \left( \frac{{\text{input\_size} + 2 \times \text{padding} - \text{kernel\_size}}}{{\text{stride}}} \right) + 1 output=(strideinput_size+2×padding−kernel_size)+1
在这个公式中,padding 是填充的大小,kernel_size 是卷积核的大小,stride 是卷积操作的步幅。
如果我们想要输入和输出的大小相同,并且使用 3x3 的卷积核,那么可以通过以下方式来计算需要的填充大小:
padding
=
(
output_size
−
1
×
stride
−
input_size
+
kernel_size
2
)
\text{padding} = \left( \frac{{\text{output\_size} - 1 \times \text{stride} - \text{input\_size} + \text{kernel\_size}}}{{2}} \right)
padding=(2output_size−1×stride−input_size+kernel_size)
例如,对于一个640x640的图像,经过一个3x3大小的卷积核,且步幅为1,想要输出大小与输入相同(640x640),则填充计算为:
padding
=
(
640
−
1
×
1
−
640
+
3
2
)
=
1
\text{padding} = \left( \frac{{640 - 1 \times 1 - 640 + 3}}{2} \right) = 1
padding=(2640−1×1−640+3)=1
因此,需要在输入图像的边缘周围添加1个像素的填充。添加了填充后,卷积操作将在填充后的图像上进行,输出大小与输入相同,都是640x640。
o
u
t
p
u
t
=
(
input_size
+
2
×
padding
−
kernel_size
stride
)
+
1
=
(
640
+
2
×
1
−
3
1
)
+
1
=
640
output = \left( \frac{{\text{input\_size} + 2 \times \text{padding} - \text{kernel\_size}}}{{\text{stride}}} \right) + 1 \\ = \left( \frac{{\text{640} + 2 \times \text{1} - \text{3}}}{{\text{1}}} \right) + 1 = 640
output=(strideinput_size+2×padding−kernel_size)+1=(1640+2×1−3)+1=640
注:所有公式中的大括号都代表了取整,即int强制转换类型操作。
网络结构中的表示
通过将这些概念应用于具体的网络结构如YOLOv5,在网络可视化工具中我们可以看到每个卷积层的参数设置和细节实现,这有助于我们更好地理解卷积层如何在实际的深度学习模型中发挥作用。
这里采用yolov5s.onnx文件,将其输入可以展示神经网络结构的网址中,可以得到卷积层的表示:
分析一:数字的含义
Conv代表该层是卷积层(Convolution),其中W
和 B
通常代表卷积层中的权重(weights)和偏置(biases)。在该示例中,W
和 B
的维度具体表示如下:
- W:32 * 3 * 6 * 6
- 32:这是输出通道数(也被称为滤波器或卷积核的数量)。每个滤波器都会产生一个不同的特征图(feature map)。
- 3:这是输入通道数。例如,在处理RGB图像的第一卷积层中,这个数字通常为3,代表红、绿、蓝三个颜色通道。
- 6 * 6:这是每个滤波器的空间维度,即每个卷积核的高度和宽度。这里,每个卷积核是6x6像素大小。
- B:32
- 32:这表示有32个偏置值,每个输出通道对应一个偏置值。偏置是在计算卷积之后、激活函数之前加到每个特征图上的一个标量值,用于调整网络的输出。
总结:W
是一个四维张量,其中包含了整个卷积层的所有滤波器(卷积核),而 B
是一个一维向量,包含了对应于每个输出通道的偏置值。这样的配置使得卷积层能够对输入数据进行有效的特征提取,每个滤波器通过其独特的权重集从输入数据中提取不同的特征,而偏置值则帮助调整输出信号,增强网络学习的灵活性和表达能力。
分析二:分支的含义
-
分支一(未修改的特征图):直接将卷积层的输出保持不变,这部分通常保留了原始的特征信息。
-
分支二(Sigmoid变化):这个分支对相同的卷积层输出应用Sigmoid激活函数。Sigmoid函数的输出范围是0到1,可以将其解释为一种权重或概率,用于调节特征的重要性。
-
Mul层合并:在Mul层(逐元素乘法),两个分支的输出被相乘。具体来说,Sigmoid处理过的输出,作为权重应用于未修改的输出上。这个操作相当于对原始特征图进行了一个按元素的缩放,其中缩放系数由Sigmoid输出确定。
作用解释: 这种结构通常用于实现注意力机制,通过它,模型能够学习到哪些部分的特征是更加重要的。在目标检测任务中,这可以帮助模型更加集中注意力于图像中对于当前任务更为重要的区域,从而提高检测的准确性。此外,这种动态调节特征的方式还可以增强模型对输入数据中变化的适应性,提高模型的泛化能力。
最后,看到这里如果觉得该笔记对您有用的话,可以点个小小的赞,或者点赞收藏关注一键三连ヾ(◍’౪`◍) ~ 谢谢!!