购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 构建卷积神经网络

卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,专门用于处理具有类似网格结构的数据,例如图像和音频。它在图像识别、计算机视觉和自然语言处理等领域取得了重大成功。CNN的核心思想是通过卷积层、池化层和全连接层来逐层提取特征并进行分类。卷积层通过滤波器(也称为卷积核)在输入数据上滑动,计算局部区域的特征映射。池化层则用于减小特征图的尺寸,并保留重要的信息。全连接层在提取特征后,将其映射到不同的类别上,进行分类。

2.4.1 全连接层

1.全连接层的优点

(1)灵活性

全连接层可以建立图像中任意像素之间的连接,并学习到更加复杂的特征和关系。

(2)特征组合

全连接层可以通过权重的学习,将输入特征进行线性或非线性的组合,从而提取更高级别的抽象特征。

(3)高度可解释性

由于每个神经元与前一层所有神经元相连,全连接层具有较高的可解释性,可以直观地理解每个神经元对应的特征。

2.全连接层的缺点

(1)参数量大

全连接层需要大量的连接权重参数,尤其是在输入较大的情况下,导致模型过于复杂,容易过拟合。

(2)忽略了空间信息

全连接层无法保留输入数据的空间结构信息,而仅仅考虑特征之间的线性组合。

(3)计算量大

全连接层需要对整个输入数据进行矩阵乘法运算,计算量较大。

2.4.2 卷积层

卷积层是卷积神经网络的核心层,而卷积又是卷积层的核心。卷积,直观理解就是两个函数的一种运算,这种运算也被称为卷积运算。

(1)卷积层的优点

1)参数共享。卷积层使用相同的权重对整个输入进行卷积操作,可以用较少的参数表示丰富的特征,减少了模型的复杂性和过拟合风险。

2)保留空间信息。卷积层在进行卷积操作时,保留了输入数据的空间结构信息,使得模型能够捕捉到局部特征和空间关系。

3)计算效率高。卷积操作可以通过卷积核的重复使用和局部计算来减少计算量,尤其适用于大规模图像数据处理。

(2)卷积层的缺点

1)局部感受野。卷积操作仅考虑局部区域的信息,并不会直接获取全局信息,对于全局特征的提取相对较弱。

2)空间分辨率下降。卷积池化操作会导致特征图的尺寸减小,可能导致一定的空间信息损失。

3)参数共享的限制。虽然参数共享可以减少参数量,但也限制了模型学习到更复杂的特征和关系。

下面通过具体实例来加深理解。图2-8就是一个简单的二维空间卷积运算示例,虽然简单,但是包含了卷积的核心内容。

图2-8 二维空间卷积运算示例

在图2-8中,输入和卷积核都是张量,卷积运算就是用卷积分别乘以输入张量中的每个元素,然后输出一个代表每个输入信息的张量。接下来我们把输入、卷积核推广到更高维空间,输入由2×2矩阵拓展为5×5矩阵,卷积核由一个张量拓展为一个3×3矩阵,如图2-9所示。这时该如何进行卷积运算呢?

图2-9 卷积神经网络卷积运算

图2-9c中的4是图2-9a左上角的3×3矩阵与卷积核矩阵的对应元素相乘后的汇总结果,如图2-10所示。

图2-10c中的4由表达式1×1+1×0+1×1+0×0+1×1+1×0+0×1+0×0+1×1得到。

当卷积核在输入图像中右移一个元素时,便得到图2-11。

图2-10 对应元素相乘后的结果

图2-11 卷积核往右移动一格

图2-11c中的3由表达式1×1+1×0+0×1+1×0+1×1+1×0+0×1+1×0+1×1得到。

卷积核窗口从输入张量的左上角开始,从左到右、从上到下滑动。当卷积核窗口滑动到一个新位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,输入(假设为 X ,其大小为( X w X h ))与卷积核(假设为 K ,其大小为( K w K h ))运算后的输出矩阵的大小为:

X w -K w + 1, X h -K h + 1)

由此得出了这一位置的输出张量值,如图2-12所示。

图2-12 输出结果

用卷积核中每个元素乘以对应输入矩阵中的对应元素,原理还是一样,但输入张量为5×5矩阵,而卷积核为3×3矩阵,得到一个3×3矩阵。这里首先就要解决如何对应的问题。把卷积核作为输入矩阵上的一个移动窗口,通过移动与所有元素对应,对应问题就迎刃而解了。这个卷积运算过程可以用PyTorch代码实现。

1)定义卷积运算函数。

2)定义输入及卷积核。

运行结果如下:

那么,如何确定卷积核?如何在输入矩阵中移动卷积核?在移动过程中,如果超越边界应该如何处理?这种因移动可能带来的问题将在后续章节详细说明。

2.4.3 卷积核

卷积核是整个卷积过程的核心,从名字就可以看出它的重要性。比较简单的卷积核(也称为过滤器)有垂直卷积核(Vertical Filter)、水平卷积核(Horizontal Filter)、索贝尔卷积核(Sobel Filter)等。这些卷积核能够检测图像的水平边缘、垂直边缘,增强图像中心区域权重等。下面通过一些图来说明卷积核的具体作用。

1.卷积核的作用

(1)垂直边缘检测

卷积核对垂直边缘的检测的示意图如图2-13所示。

这个卷积核是3×3矩阵(卷积核一般是奇数阶矩阵),其特点是第1列和第3列有数值,第2列为0。经过这个卷积核的作用后,就把原数据垂直边缘检测出来了。

(2)水平边缘检测

卷积核对水平边缘的检测的示意图如图2-14所示。

这个卷积核也是3×3矩阵,其特点是第1行和第3行有数值,第2行为0。经过这个卷积核的作用后,就把原数据水平边缘检测出来了。

(3)对图像的水平边缘、垂直边缘检测

卷积核对图像的水平边缘检测、垂直边缘检测的对比效果图如图2-15所示。

图2-13 卷积核对垂直边缘的检测

图2-14 卷积核对水平边缘的检测

图2-15 卷积核对图像的水平边缘检测、垂直边缘检测的对比效果图

以上这些卷积核比较简单,在深度学习中,卷积核的作用不仅在于检测垂直边缘、水平边缘等,还可以检测其他边缘特征。

2.如何确定卷积核

如何确定卷积核呢?卷积核类似于标准神经网络中的权重矩阵 W W 需要通过梯度下降算法反复迭代求得。同样,在深度学习中,卷积核也需要通过模型训练求得。卷积神经网络的主要目的就是计算出这些卷积核的数值。确定得到了这些卷积核后,卷积神经网络的浅层网络也就实现了对图像所有边缘特征的检测。

以图2-14为例,给定输入 X 及输出 Y ,根据卷积运算,通过多次迭代可以得到卷积核的近似值。

(1)定义输入和输出

(2)训练卷积层

(3)查看卷积核

运行结果如下:

这个结果与图2-13中的卷积核就比较接近了。

假设卷积核已确定,卷积核如何对输入数据进行卷积运算呢?下面将进行详细介绍。

2.4.4 步幅

如何对输入数据进行卷积运算?回答这个问题之前,我们先回顾一下图2-9。在图2-9a中,左上方的小窗口实际上就是卷积核,其中×后面的值就是卷积核的值。如第1行×1、×0、×1对应卷积核的第1行[1 0 1]。图2-9c的第1行第1列的4是如何得到的呢?就是由5×5矩阵中由前3行、前3列构成的矩阵各元素乘以卷积核中对应位置的值,然后累加得到的,即1×1+1×0+1×1+0×0+1×1+1×0+0×1+0×0+1×1=4。那么,如何得到图2-9c中第1行第2列的值呢?我们只要把图2-9a中小窗口往右移动一格,然后进行卷积运算即可。以此类推,最终得到完整的特征图的值,如图2-16所示。

图2-16 通过卷积运算生成的数据

小窗口(实际上就是卷积核)在图2-9a中每次移动的格数(无论是自左向右移动,还是自上向下移动)称为步幅(stride),在图像中就是跳过的像素个数。在上面的示例中,小窗口每次只移动一格,故参数stride=1,这个参数也可以是2或3等其他数值。如果是2,则每次移动时就跳2格或2个像素,如图2-17所示。

图2-17 stride为2时的示意图

在小窗口移动过程中,卷积核的值始终保持不变。也就是说,卷积核的值在整个过程中是共享的,所以又把卷积核的值称为共享变量。卷积神经网络采用参数共享的方法大大降低了参数的数量。

参数stride是卷积神经网络中的一个重要参数,在用PyTorch具体实现时,stride参数格式为单个整数或两个整数的元组(分别表示在height和width维度上的值)。

在图2-11中,如果小窗口继续往右移动2格,那么卷积核将移到输入矩阵之外,如图2-18所示。此时该如何处理呢?具体处理方法就涉及下节要讲的内容——填充(padding)了。

图2-18 小窗口移到输入矩阵外

2.4.5 填充

当输入图像与卷积核不匹配或卷积核超过图像边界时,可以采用边界填充的方法,即把图像尺寸进行扩展,扩展区域补0,如图2-19所示。当然也可以不扩展。

图2-19 采用边界填充方法对图像进行扩展

根据是否扩展可将填充方式分为Same、Valid两种。采用Same方式时,对图像扩展并补0;采用Valid方式时,不对图像进行扩展。具体如何选择呢?在实际训练过程中,一般选择Same方式,因为使用这种方式不会丢失信息。设补0的圈数为 p ,输入数据大小为 n ,卷积核大小为 f ,步幅大小为 s ,则有:

2.4.6 多通道上的卷积

前面对卷积在输入数据、卷积核的维度上进行了扩展,但输入数据、卷积核都是单一的。从图像的角度来说,二者都是灰色的,没有考虑彩色图像的情况。在实际应用中,输入数据往往是多通道的,如彩色图像就是3通道,即R、G、B通道。此时应该如何实现卷积运算呢?我们分别从多输入通道和多输出通道两方面来详细讲解。

1.多输入通道

3通道图像的卷积运算与单通道图像的卷积运算基本一致,对于3通道的RGB图像,其对应的卷积核算子同样也是3通道的。例如一个图像是3×5×5的,3个维度分别表示通道数(channel)、图像的高度(height)、宽度(weight)。卷积过程是将每个单通道(R,G,B)与对应的卷积核进行卷积运算,然后将3通道的和相加,得到输出图像的一个像素值。具体过程如图2-20所示。

图2-20 多输入通道的卷积运算过程示意图

下面用PyTorch实现图2-20多输入通道的卷积运算过程。

(1)定义多输入通道的卷积运算函数

(2)定义输入数据

(3)计算

运行结果如下:

2.多输出通道

为了实现更多边缘检测,可以增加更多卷积核组。图2-21就是两组卷积核:卷积核1和卷积核2。这里的输入为3×7×7,经过与两个3×3×3的卷积核(步幅为2)的卷积运算,得到的输出为2×3×3。另外,我们也会看到图2-21中的补零填充(Zero Padding)是1,也就是在输入元素的周围补0。补零填充对于图像边缘部分的特征提取是很有帮助的,可以防止信息丢失。最后,不同卷积核组卷积得到不同的输出,个数由卷积核组决定。

图2-21 多输出通道的卷积运算过程示意图

把图2-21一般化,写成矩阵的方式为图2-22所示。

图2-22 矩阵方式

3.1×1卷积核

1×1卷积核在很多经典网络结构中都有使用,如Inception网络、ResNet网络、YOLO网络和Swin-Transformer网络等。在网络中增加1×1卷积核有以下主要作用。

(1)增加或降低通道数

如果卷积的输出、输入都是一个二维数据,那么1×1卷积核的意义不大,它是完全不考虑像素与周边其他像素的关系的。如果卷积的输出、输入是多维矩阵,则可以通过1×1卷积的不同通道数,增加或减少卷积后的通道数。

(2)增加非线性

1×1卷积核利用后接的非线性激活函数,可以在保持特征图尺度不变的前提下大幅增加非线性特性,使网络更深,同时提升网络的表达能力。

(3)跨通道信息交互

使用1×1卷积核可以增加或减少通道数,也可以组合来自不同通道的信息。图2-23为通过1×1卷积核改变通道数的例子。

上述过程可以用PyTorch实现,代码如下。

(1)生成输入及卷积核数据

图2-23 1×1卷积核改变通道数示意图

(2)定义卷积函数

运行结果如下:

2.4.7 激活函数

卷积神经网络与标准的神经网络类似,为保证非线性,也需要使用激活函数,即在卷积运算后,把输出值另加偏移量输入激活函数,作为下一层的输入,如图2-24所示。

图2-24 卷积运算后的输出值加偏移量输入激活函数ReLU

常用的激活函数有torch.nn.functional.sigmoid、torch.nn.functional.ReLU、torch.nn.functional. softmax、torch.nn.functional.tanh、torch.nn.functional.dropout等。类对象方式的激活函数有torch. nn.sigmoid、torch.nn.ReLU、torch.nn.softmax、torch.nn.tanh、torch.nn.dropout等。

2.4.8 卷积函数

卷积函数是构建神经网络的重要支架,通常PyTorch的卷积运算是通过nn.Conv2d来完成的。下面先介绍nn.Conv2d的参数,然后介绍如何计算输出的形状。

1.nn.Conv2d函数

nn.Conv2d函数的定义如下。

主要参数说明如下。

● in_channels(int):输入信号的通道。

● out_channels(int):卷积产生的通道。

● kernel_size(int or tuple):卷积核的尺寸。

● stride(int or tuple, optional):卷积步长。

● padding(int or tuple, optional):输入的每一条边补充0的层数。

● dilation(int or tuple, optional):卷积核元素之间的间距。

● groups(int, optional):控制输入和输出之间的连接。groups=1,输出是所有的输入的卷积;groups=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。

● bias(bool, optional):如果bias=True,则添加偏置。其中参数kernel_size、stride、padding、dilation可以是一个整型(int)数值,此时卷积的height和width值相同,也可以是一个tuple数组,tuple的第一维度表示height的数值,tuple的第二维度表示width的数值。

● padding_mode:有4种可选模式,分别为zeros、reflect、replicate、circular,默认为zeros,也就是零填充。

2.输出形状

卷积函数nn.Conv2d参数中输出形状的计算公式如下:

当groups=1时

当groups=2时

当groups=3时

注意:in_channels、groups必须是整数,否则报错。

2.4.9 转置卷积

转置卷积(Transposed Convolution)在一些文献中也称为反卷积(deconvolution)或部分跨越卷积(Fractionally-strided Convolution)。何为转置卷积?它与卷积又有哪些不同?

通过卷积的正向传播的图像一般会越来越小,类似于下采样(downsampling)。而卷积的反向传播实际上就是一种转置卷积,类似于上采样(upsampling)。

1.转置卷积的直观理解

图2-25为 s =1、 p =0、 k =3的转置卷积运算示意图。

图2-25 转置卷积运算示意图(一)

图2-26为 s =2、 p =0、 k =3的转置卷积运算示意图。

图2-26 转置卷积运算示意图(二)

图2-25和图2-26中的输出是如何得到的呢?可根据给定的 s p k 进行简单推导:

● 在输入特征图元素间填充 s -1行和列的0值。

● 在输入特征图四周填充 k-p -1列和行的0值。

● 做正常卷积运算(步长为1,填充为0)。此时不需要再对特征图进行填充了,直接进行步长为1、padding为0的卷积运算。

接下来我们介绍PyTorch对转置卷积输出形状的计算公式。

2.转置卷积输出形状的计算公式

假设转置卷积的参数为:

假设输入的大小为 i ,即 H = W = i ,其中dilation、output_padding的默认值分别为1和0,为便于计算,取dilation=1,则转置卷积的输出大小(假设 H = W )为:

根据式(2.5)可计算图2-25和图2-26的输出大小。

图2-25的参数为 s =1、 p =0、 k =3,原输入大小为 i =2,由此可得转置卷积的输出大小为:

H = s ×( i -1)-2× p + k =1-0+3=4

图2-26的参数为 s =2、 p =0、 k =3,原输入大小为 i =2,由此可得转置卷积的输出大小为:

H = s ×( i -1)-2× p + k =2-0+3=5

3.转置卷积的应用示例

转置卷积主要用于变分自编码、生成式对抗网络GAN、目标检测和语义分割等。图2-27为使用转置卷积的一个示例,它是一个上采样过程。

图2-27 转置卷积示例

4.转置卷积的PyTorch实现

情况1:将输入x先进行卷积运算,然后再使用转置卷积,使最后的输出形状与输入形状一致。

情况2:将输入x先进行卷积运算,然后再使用转置卷积,使最后的输出形状与输入形状一致。这里用到了参数output_padding,这个参数主要用于调整输出分辨率。

通过转置卷积后的特征图大小为:

H = s ×(feature的大小-1)-2 p + k +output_padding

=2(3-1)-2×1+3+1=6

2.4.10 特征图与感受野

输出的卷积层有时被称为特征图(Feature Map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。在CNN中,对于某一层的任意元素x,其感受野(Receptive Field)是指在正向传播期间可能影响x计算的所有元素(来自所有先前层)。

注意,感受野的覆盖率可能大于某层输入的实际区域大小。让我们用图2-28为例来解释感受野。感受野是卷积神经网络每一层输出的特征图上的像素点在输入图像上映射的区域大小。通俗来说,感受野是特征图上的一个点对应输入图上的区域。

图2-28 感受野

由图2-28可以看出,经过几个卷积层之后,特征图逐渐变小,一个特征所表示的信息量越来越多,如s3表示了x1、x2、x3、x4、x5的信息。

2.4.11 卷积层如何保留图像的空间信息

通过卷积层的介绍可知,卷积层通过卷积操作来保留输入数据的空间信息。在卷积操作中,使用一个固定大小的滤波器(也称为卷积核或卷积窗口)与输入数据进行逐元素乘积并求和的操作,这个滤波器以一定的步长在整个输入数据上进行滑动。

通过这种卷积操作,卷积层可以从局部区域中提取特征,并保留空间结构信息。在滤波器的不同位置,卷积操作会提取不同的局部特征。通过滑动步长的调整,可以在不同位置上进行卷积操作,从而将整个输入数据的空间信息编码到输出特征图中。

例如,假设有一个3×3的灰度图像作为输入,如下所示:

123

456

789

我们使用一个2×2的滤波器以步长为1对整个图像进行滑动,执行卷积操作。卷积操作的公式为:

output[i, j]=sum(input[i:i+2, j:j+2]*filter)

其中,input[i:i+2, j:j+2]表示图像中以(i, j)为左上角的2×2区域,filter表示滤波器。

对于这个例子,如果使用滤波器大小为[1, 1;1, 1],则卷积操作的结果为:

1+2+4+5=12 2+3+5+6=16

4+5+7+8=24 5+6+8+9=28

即得到输出特征图:

12 16

24 28

从上述例子可以看出,卷积操作保留了图像的空间信息。具体来说,输出特征图的每个单元格中的值都来自输入图像中对应位置及其周围的值的线性组合。这意味着,输出特征图中的每个元素都对应于输入图像的一个局部区域,从而保留了图像的空间结构。

此外,通过调整滑动步长,可以在整个输入图像上进行卷积操作,进一步提取全局空间信息。通过堆叠多个卷积层,深层卷积神经网络可以从低级的图像特征逐步提取出高级的语义特征,以更好地理解和处理图像。这些特征保留了图像的空间信息作为后续任务的输入。

2.4.12 现代经典网络

1.ResNet模型

2015年,何恺明推出的ResNet在ISLVRC和COCO上超越所有选手,获得冠军。ResNet在网络结构上做了一大创新,即采用残差网络结构,而不再简单地堆积层数,为卷积神经网络提供了一个新思路。残差网络的核心思想可以概括为:通过将两个连续的卷积层的输出作为下一层的输入来实现信息传递,单元结构如图2-29所示。

图2-29 ResNet残差单元结构

其完整网络结构如图2-30所示。

通过引入残差实现恒等映射(Identity Mapping),相当于一个梯度高速通道,使训练更简洁,且避免了梯度消失问题,由此可以得到很深层的网络,如网络层数由GoogLeNet的22层发展到ResNet的152层。

ResNet模型具有如下特点。

图2-30 ResNet完整网络结构

● 层数非常深,已经超过百层。

● 引入残差单元来解决退化问题。

2.DenseNet模型

ResNet模型极大地改变了参数化深层网络中函数的方式,DenseNet(稠密网络)在某种程度上可以说是ResNet的逻辑扩展,其每一层的特征图是后面所有层的输入。DenseNet网络结构如图2-31所示。

图2-31 DenseNet网络结构

ResNet和DenseNet的主要区别如图2-32所示(阴影部分)。

由图2-32可知,ResNet和DenseNet的主要区别在于,DenseNet的输出是连接(如图2-32b中的[,]表示),而不是ResNet的简单相加。

DenseNet主要由两部分构成:稠密块(Dense Block)和过渡层(Transition Layer)。前者定义如何连接输入和输出,后者则控制通道数量、特征图的大小等,使其不会太复杂。

图2-32 ResNet与DenseNet的主要区别

3.U-Net网络

U-Net网络结构如图2-33所示。

图2-33 U-Net网络结构

1)由图2-33可以看到,输入是572×572的,但是输出变成了388×388,这说明经过网络以后,输出的结果和原图不是完全对应的,这在计算loss和输出结果时都可以得到体现。

2)朝右的箭头(除跳跃连接方向)代表3×3的卷积操作,并且stride是1,填充策略是Valid,因此,每个该操作以后,特征图的大小会减2。

3)朝下的箭头代表2×2的最大池化操作,需要注意的是,此时的填充策略也是Valid(Same策略会在边缘填充0,保证特征图的每个值都会被取到,Valid会忽略掉不能进行下去的池化操作,而不是进行填充),这就会导致如果池化之前特征图的大小是奇数,那么就会损失一些信息。

4)朝上的箭头代表2×2的转置卷积操作,操作会将特征图的大小乘以2,共包含4次上采样过程。

5)跳跃连接方向代表复制和剪切操作,可以发现,在同一层左边的最后一层要比右边的第一层要大一些,这就导致想要利用浅层的特征,就要进行一些剪切,也导致了最终的输出是输入的中心某个区域。

6)输出的最后一层使用1×1的卷积层做了分类。

下面用PyTorch来实现U-Net网络。

1)定义一个由两个卷积层构成的卷积块。

2)定义下采样模块,这里的下采样包括最大池化下采样和连续的两个“卷积(3×3)+ReLU激活函数”。

3)定义上采样模块,这里的上采样包括转置卷积上采样,并与左侧对应编码器的特征图拼接(concatenation),之后进行连续的两个“卷积(3×3)+ReLU激活函数”。

4)构建U-Net模型。

5)用测试数据测试模型。

2.4.13 可变形卷积

可变形卷积(Deformable Convolution)是一种改进的卷积操作,可以在卷积过程中对输入特征图进行形变。可变形卷积的核心思想是通过引入偏移量来调整卷积核的采样位置,从而适应目标对象的形变和旋转等情况。在DragGAN中,可变形卷积被用来替代传统的卷积操作,以更好地处理图像中存在的形变和旋转等情况。具体来说,DragGAN中可变形卷积的实现包括以下几个步骤:

1)利用一个额外的可学习参数矩阵来预测每个像素点的偏移量。

2)通过将当前卷积层的采样位置根据偏移量进行位移,实现卷积核中心坐标的动态调整,即可获得可变形卷积的输出结果。

3)将可变形卷积的输出结果传递给下一层网络进行处理。通过引入可变形卷积,DragGAN可以更加准确地捕捉目标对象的形变和旋转等细节信息,从而进一步提高模型的表现力和生成效果。 kvDrQubvNkS4cEMGO3Nezw8mv7IfqfI1vUivTUEo4xI5spPFbR+3GYdhwaJ7HY7k

点击中间区域
呼出菜单
上一章
目录
下一章
×