卷积神经网络(CNN)自学笔记2:卷积层
1. 卷积层的定义
卷积层是卷积神经网络的基本组成部分之一,主要用于提取图像特征。
1. 卷积运算的原理
卷积运算是一种数学运算,用于两个函数之间的积分。对于图像处理,卷积运算通常表示为对输入图像和滤波器(也称为卷积核或核)的点积运算。卷积核是一个较小的矩阵,它通过滑动窗口来计算每个位置的点积以生成特征图,从而在输入图像上移动。
这
Pytorch 中 Tensor 通道的排序顺序为:[batch, channel, height, width]。
2. 卷积运算的一些基本概念 卷积核(Kernel)。
又称滤波器,假设卷积核的高度和宽度分别为 h 和 sum,则称为 h× 卷积,如 3×3 卷积,即卷积核的高度为 3,宽度为 3。卷积核中的值是用于对图像中与卷积核大小相同的子块像素进行卷积的权重。
填充
填充是在卷积神经网络 (CNN) 中向输入张量的边缘添加额外的像素,以控制输出特征图的大小并保持输入图像的空间维度。填充有助于保留有关输入图像边缘的信息,并避免在卷积运算中过度减少空间维度。
跨
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)
2. 卷积 Convolution作的作流程
卷积运算是指卷积内核在输入图像上滑动,在每个位置的元素级别进行乘法和求和以产生输出值,这个过程会重复几次以生成完整的特征图。具体步骤如下:
1. 找到卷积核:将卷积核放在输入图像中的某个位置。
2. 元素级乘积求和:将卷积核的权重乘以输入图像对应位置的元素,将所有乘积结果求和,得到输出值。
3. 滑动卷积核:根据指定的步长(步幅)在输入图像上滑动卷积核,重复上述步骤,直到遍历完所有位置。
(1) 单通道卷积
如下图所示,卷积核的权重是逐个元素乘以并添加到图像的像素值中。
图 1 二维卷积过程示意图
图片转载于:Convolution — PaddleEdu documentation
(2) 多输入输出卷积
这
上图显示了一维图像的卷积过程,但在实际应用中,更常用的是多输入多输出维度的卷积,假设输入为 CxHxW,其中 C 为通道数,H 维输入图像的高度开元棋官方正版下载,W 维输入图像的宽度,卷积核的维度也应与输入图像的维度一致, 假设 CxKhxKw。
以 RGB 三通道彩色图像为例,输入图像的形状为 3xHxW,那么卷积核的大小为 3xKhxKw,假设输出维度为 1kaiyun.ccm,那么在每个维度上进行 HxW 和 KhxKw 的点积运算,最后将每个通道相同位置的值相加,得到最终的特征输出图。
图 2 多维输入卷积过程示意图
图片转载于:Convolution — PaddleEdu documentation
当输出为多维通道时,计算过程如下图所示。卷积过程为:
在所有输入通道上对每个卷积内核进行卷积:每个卷积内核对输入的每个通道执行卷积运算。添加每个通道的卷积结果:将每个卷积核在所有通道上的卷积结果相加,得到一个输出通道。Generate Output Feature Map:重复上述步骤,对所有卷积核进行作,生成多通道输出特征图。
图 3 MIMO 卷积示意图
图片转载于: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)
即输出特征图的维度等于卷积核的数量
批量作
通过一起处理多个样本来提高计算效率和训练稳定性。在训练神经网络时,批量作是指在单个正向和反向传播中同时处理多个样本,而不是单个样本。
在卷积神经网络的计算中,通常会将多个样本放在一起,形成一个小批量进行批量运算,即输入数据的维度×××。由于每张图像使用相同的卷积核,并且卷积核的维度为 ××h×,因此输出特征图的维度为 ×××。
假设我们输入数据的维度是 2×3××,卷积核的维度和上面多个输出通道的情况一样,仍然是 2×3×h×,输出特征图的维度是 2×2××。如图 4 所示。
图 4 批量作
图片转载于:Convolution — PaddleEdu documentation
感受野性
感受野是神经网络中的一个区域,神经元能够在其中“看到”或响应输入图像。换句话说,感受野是指神经网络中神经元“看到”的输入区域,而在卷积神经网络中,特征图上元素的计算受输入图像上某个区域的影响,该区域是该元素的感受野。
在卷积神经网络中,神经元看到的越深,输入区域就越大,如下图所示,核大小为 3×3,步幅为 1,绿色标记 2 层每个神经元看到的区域,黄色标记是 3 层看到的区域,具体来说,2 层的每个神经元都能看到 1 层 3×3 大小的区域, 并且 3 层的每个神经元都可以看到 2 层 3×3 大小的区域。在此区域中,您可以看到图层 1 上的 5×5 大小区域。
感受野计算公式:
其中,
对于感受野的 k 层,
它是 K-1 层的感受野
是 k 层的卷积核的大小或池化层的大小
是所有先前层的阶梯乘积。
注意:
(1) 第一卷积层的输出特征像素的感受野大小等于卷积核的大小;
(2) 深卷积层的感受野大小与其之前所有层的滤波器大小和步长有关;
(3) 在计算感受野的大小时,忽略图像边缘的影响,即不考虑填充的大小。
3. 卷积层的优势
与传统的全连接层相比,卷积层具有许多显著优势,使其在处理图像和其他类型的多维数据时非常有效。以下是卷积层的主要优点:
(1) 本地连接
每个卷积核仅与输入图像的一小部分区域(感受野)交互,并且不完全连接到整个图像。该方法可以减少计算量和参数数量,提高计算效率。这种本地连接允许卷积层有效地捕获本地特征,例如边缘、角落等。
(2) 重量共享
在卷积层中,同一个卷积核对整个输入图像执行卷积运算,这意味着相同的参数(权重)在不同的位置共享。这种权重共享机制大大减少了模型的参数数量,降低了过拟合的风险,提高了训练效率。
(3) 平移不变性
卷积运算具有平移不变性,即卷积核能够识别图像中的特征,无论它们出现在图像中的哪个位置。这使得卷积神经网络对图像的局部特征具有鲁棒性。
(4) 自动特征提取
卷积层能够自动学习图像中的特征,从低级特征(例如边缘、角落)到高级特征(例如形状、物体的结构),而无需人工设计的特征提取器。这使得卷积神经网络在各种图像处理任务中表现出色。
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 表示输入特征矩阵的特征图的深度kaiyun官方网站登录入口,即通道,如果输入 RGB 彩色图像,则 in_channels=3
out_channels 表示卷积核的数量,使用 n 个卷积核的特征图输出的深度为 n
kernel_size 表示卷积核的大小,输入可以是 int 类型,例如卷积核的 height=width=3 为 3,也可以是元组类型,例如 height=3 的 (3, 5) 和卷积核的 width=5
Stride 代表默认步长为 1 的卷积核,与 kernel_size 一样,输入可以是 int 类型或元组类型
padding 表示在输入特征图周围填零,默认为 0,同一个输入可以是 int 类型,比如 1 表示上下方向的一行 0 个元素,左右方向的一列 0 像素(即一个 0 的圆圈),如果输入是元组类型, 如 (2, 1) 表示上面加两行,下面加两行,左边加一列,右边加一列。在 H 高度方向的两侧填充 padding[0],在 W 宽度方向的两侧填充 padding[1]
bias 指示是否使用 bias (默认值)。
扩张参数控制卷积核的扩张(扩张)速率。它定义了卷积核元素之间的间距,可用于在不增加参数数量的情况下增加卷积核的感受野。它的默认值为 1,表示正常卷积。增加膨胀值可以使卷积核更广泛地感知输入特征,从而捕获更大的上下文信息。
groups 参数用于控制卷积层的分组卷积。它的默认值为 1,表示正常卷积。通过设置 groups 参数,您可以将输入和输出通道划分为多个组,每个组执行独立的卷积作。
详情请参考官方文档