一、卷积层的定义
卷积层是卷积神经网络的基本组成之一,主要作用是用于提取图像特征。
1.卷积操作的原理
卷积操作是一种数学运算,用于两个函数之间的积分。对于图像处理,卷积操作通常表示为对输入图像与滤波器(也称为卷积核或kernel)进行点积运算。卷积核是一个较小的矩阵,通过滑动窗口的方式在输入图像上移动,计算每个位置的点积,从而生成特征图(feature map)。
Pytorch中的Tensor通道排列顺序是:[batch, channel, height, width]
2.卷积操作的一些基本概念
卷积核(Kernel)
也被叫做滤波器(filter),假设卷积核的高和宽分别为𝑘ℎ和𝑘𝑤,则将称为𝑘ℎ×𝑘𝑤卷积,比如3×3卷积,就是指卷积核的高为3, 宽为3。卷积核中数值为对图像中与卷积核同样大小的子块像素点进行卷积计算时所采用的权重。
填充(Padding)
填充(Padding)是在卷积神经网络(CNN)中为输入张量的边缘添加额外的像素,以控制输出特征图的大小并保持输入图像的空间尺寸。填充有助于保留输入图像边缘的信息,并在卷积运算中避免空间尺寸的过度缩小。
步长(Stride)
步长(Stride)是卷积操作中的一个参数,决定了卷积核在输入图像上滑动的步幅。具体来说,步长定义了卷积核每次滑动的距离。它控制了卷积运算中卷积核在输入图像上移动的距离,从而影响输出特征图的大小。
卷积层输出特征图的尺寸计算
其中,H为输出特征图的高度和宽度(假设输入为正方形图像),W为输入图像的高度和宽度,F为卷积核大小,P为填充,S为步长。
注:当输出图像的尺寸计算公式得到的结果为非整数时,在 PyTorch 中,通常会将其向下取整(取floor),以确保输出图像的尺寸为整数。
import torch
import torch.nn as nn
# 输入张量
input_tensor = torch.randn(1, 3, 7, 7) # (batch_size, channels, height, width)
# 定义卷积层,步长为2,卷积核大小为2x2,填充为1
conv_layer = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=2, stride=2, padding=1)
# 通过卷积层处理输入张量
output_tensor = conv_layer(input_tensor)
# 打印输出张量的形状(1x6x4x4)
print(output_tensor.shape) # 输出形状为 (batch_size, out_channels, out_height, out_width)
二、卷积的运算过程
卷积运算
卷积运算是指卷积核在输入图像上滑动,在每个位置上进行元素级的乘积并求和,从而生成一个输出值,这个过程会重复多次以生成完整的特征映射。具体步骤如下:
1.定位卷积核:将卷积核放置在输入图像的某个位置。
2.元素级乘积和求和:将卷积核的权重与输入图像对应位置的元素相乘,并将所有乘积结果求和,得到一个输出值。
3.滑动卷积核:按照指定的步长(stride),在输入图像上滑动卷积核,重复上述步骤,直到遍历完所有位置。
(1)单通道卷积
如下图所示,卷积核的权重依次与图像的像素值进行逐元素相乘再相加的操作。
图片转载于:卷积(Convolution) — PaddleEdu documentation
(2)多输入输出卷积
上图展示的为一维图像的卷积过程,但在实际应用中,多输入和多输出维度的卷积更为常用,假设输入为CxHxW,其中,C为通道数,H维输入图像的高度,W维输入图像的宽度,卷积核的维度也要与输入图像的维度保持一致,假设为CxKhxKw。
以RGB三通道彩色图片为例,输入图像的形状为3xHxW,则卷积核的尺寸为3xKhxKw,假设输出维度为1的话,则在每个维度中进行HxW与KhxKw的点积运算,最后将每个通道同一位置的值进行相加,得到最终的特征输出图。
图片转载于:卷积(Convolution) — PaddleEdu documentation
输出为多维通道时的计算过程如下图所示。卷积过程为:
- 对每个卷积核在所有输入通道上进行卷积:每个卷积核在输入的每个通道上进行卷积操作。
- 将每个通道的卷积结果相加:对每个卷积核在所有通道上的卷积结果进行相加,得到一个输出通道。
- 生成输出特征图:重复以上步骤,对所有卷积核进行操作,生成多通道的输出特征图。
图片转载于:卷积(Convolution) — PaddleEdu documentation
Pytorch代码实现为:
import torch
import torch.nn as nn
# 定义输入张量,形状为 (批量大小, 通道数, 高度, 宽度)
input_tensor = torch.randn(2, 3, 3, 3) # 2个样本,3个通道,高度3,宽度3
# 定义卷积层,使用 2 个 3x3 的卷积核
conv_layer = nn.Conv2d(in_channels=3, out_channels=2, kernel_size=2, padding=0, stride=1)
# 通过卷积层处理输入张量
output_tensor = conv_layer(input_tensor)
# 打印输出张量的形状
print(output_tensor.shape) # 输出形状为 (2, 2, 2, 2)
即:输出特征图的维度等于卷积核的个数
批量操作
通过将多个样本一起处理来提高计算效率和训练稳定性。在训练神经网络时,批量操作指的是在一次前向传播和后向传播过程中同时处理多个样本,而不是单个样本。
在卷积神经网络的计算中,通常将多个样本放在一起形成一个mini-batch进行批量操作,即输入数据的维度是𝑁×𝐶𝑖𝑛×𝐻𝑖𝑛×𝑊𝑖𝑛。由于会对每张图片使用同样的卷积核进行卷积操作,卷积核的维度是𝐶𝑜𝑢𝑡×𝐶𝑖𝑛×𝑘ℎ×𝑘𝑤,那么,输出特征图的维度就是𝑁×𝐶𝑜𝑢𝑡×𝐻𝑜𝑢𝑡×𝑊𝑜𝑢𝑡。
假设我们输入数据的维度是2×3×𝐻𝑖𝑛×𝑊𝑖𝑛,卷积核的维度与上面多输出通道的情况一样,仍然是2×3×𝑘ℎ×𝑘𝑤,输出特征图的维度是2×2×𝐻𝑜𝑢𝑡×𝑊𝑜𝑢𝑡。如图4所示。
图片转载于:卷积(Convolution) — PaddleEdu documentation
感受野
感受野(Receptive Field)是指在神经网络中,一个神经元能够“看到”或响应输入图像的区域。换句话说,感受野指的是神经网络中神经元“看到的”输入区域,在卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野。
卷积神经网络中,越深层的神经元看到的输入区域越大,如下图所示,kernel size 均为3×3,stride均为1,绿色标记的是Layer2每个神经元看到的区域,黄色标记的是Layer3看到的区域,具体地,Layer2每个神经元可看到Layer1上3×3大小的区域,Layer3每个神经元看到Layer2上3×3大小的区域,该区域可以又看到Layer1上 5×5大小的区域。
感受野计算公式:
其中,为第k层的感受野,为第k-1层的感受野,为第k层的卷积核大小或池化层的池化大小,为前面所有层的步长乘积。
注:
(1)第一层卷积层的输出特征图像素的感受野的大小等于卷积核的大小;
(2)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系;
(3)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小。
三、卷积层的优点
与传统的全连接层相比,卷积层具有许多显著的优点,使其在处理图像和其他类型的多维数据时非常有效。以下是卷积层的主要优点:
(1)局部连接
每个卷积核只与输入图像的一个小区域(感受野)进行交互,而不是与整个图像进行全连接。这种方式可以减少计算量和参数数量,提高计算效率。这种局部连接性使得卷积层能够有效地捕捉局部特征,如边缘、角点等。
(2)权值共享
在卷积层中,同一个卷积核在整个输入图像上进行卷积操作,这意味着相同的参数(权重)在不同的位置共享使用。这种权值共享(weight sharing)机制极大地减少了模型的参数数量,降低了过拟合的风险,提高了训练效率。
(3)平移不变性
卷积操作具有平移不变性(translation invariance),即卷积核能够识别图像中的特征,无论这些特征出现在图像的哪个位置。这使得卷积神经网络对图像的局部特征具有鲁棒性。
(4)自动特征提取
卷积层能够自动学习图像中的特征,从低级别特征(如边缘、角点)到高级别特征(如物体的形状、结构),无需人为设计特征提取器。这使得卷积神经网络在各种图像处理任务中表现出色。
四、Pytorch中卷积层的实现
torch.nn.Conv2d(in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros')
in_channels 代表输入特征矩阵的特征图的深度即channel,如输入一张RGB彩色图像,那in_channels=3
out_channels 代表卷积核的个数,使用n个卷积核输出的特征图的深度就是n
kernel_size 代表卷积核的尺寸,输入可以是int类型如3 代表卷积核的height=width=3,也可以是tuple类型如(3, 5),代表卷积核的height=3,width=5
stride 代表卷积核的步距默认为1,和kernel_size一样输入可以是int类型,也可以是tuple类型
padding 代表在输入特征图四周补零,默认为0,同样输入可以为int型如1 代表上下方向各补一行0元素,左右方向各补一列0像素(即补一圈0),如果输入为tuple型如(2, 1) 代表在上方补两行下方补两行,左边补一列,右边补一列。padding[0]是在H高度方向两侧填充的,padding[1]是在W宽度方向两侧填充
bias 表示是否使用偏置(默认使用)
dilation 参数控制卷积核的扩张(膨胀)速率。它定义了卷积核元素之间的间隔,可以用来增加卷积核的感受野(receptive field)而不增加参数数量。它的默认值是 1
,表示普通卷积。增加 dilation
值可以让卷积核更广泛地感知输入特征,从而捕捉到更大的上下文信息。
groups 参数用于控制卷积层的分组卷积(grouped convolution)。它的默认值是 1
,表示普通卷积。通过设置 groups
参数,可以将输入通道和输出通道分成多个组,每组执行独立的卷积操作。
详细内容参考官方文档,torch.nn — PyTorch 2.3 documentation