当前位置: 首页 > news >正文

T05_卷积神经网络

全连接网络存的弊端

以MINST数字识别为例,创建一个4层全连接网络层,输入为28x28,中间三个隐藏层的节点数都是 256,输出节点数是10。通过summary()函数打印出模型每一层的参数量,计算总的参数量超过34万个网络参数,单个权值保存为 float 类型的变量,网络参数至少需要约 1.34MB 内存。训练过程中占用内存超过2GB(未使用GPU),训练时长超过5分钟(个人笔记本,ADM R7系列)。

随着图片的尺寸增加,网络层增加,训练占用的内存、时长会暴增。

下面是几种如何避免全连接网络的参数量过大的缺陷的方法。

局部相关性

以2D图片数据为例,在进入全连接层之前,需要将矩阵数据打平成 1D 向量,然后每个像素点与每个输出节点两两相连。网络层的每个输出节点都与所有的输入节点相连接,用于提取所有输入节点的特征信息,这种稠密的连接方式是全连接层参数量大、计算代价高的根本原因。全连接层也称为稠密连接层(Dense Layer)

可以分析输入节点对输出节点的重要性分布,仅考虑较重要的一部分输入节点,而抛弃重要性较低的部分节点,这样就可以简化模型了。然而找出每个中间节点的重要性分布是件非常困难的事情。利用先验知识,可以使用位置或距离作为重要性分布衡量标准的数据。

以2D 图片数据为例,简单地认为与当前像素欧式距离(Euclidean Distance)小于和等于k2\frac{k}{\sqrt{2}}2k,的像素点重要性较高,欧式距离大于k2\frac{k}{\sqrt{2}}2k到像素点重要性较低,那么这样就很轻松地简化了每个像素点的重要性分布问题。

如下图,这个高宽为kkk的窗口称为感受野(Receptive Field),它表征了每个像素对于中心像素的重要性分布情况,网格内的像素才会被考虑,网格外的像素对于中心像素会被简单地忽略。

在这里插入图片描述

这种基于距离的重要性分布假设特性称为局部相关性,它只关注和自己距离较近的部分节点,而忽略距离较远的节点。

权值共享

每个输出节点仅与感受野区域内k×kk \times kk×k输入节点相连接,输出层节点数为∥J∥\parallel J \parallelJ,当前层的参数量为$k \times k \times \parallel J \parallel ,相对于全连接层的,相对于全连接层的,相对于全连接层的\parallel I \parallel \times\parallel J \parallel,考虑,考虑,考虑k一般取值较小如1、3、5等,一般取值较小如 1、3、5 等,一般取值较小如135等,k \times k \ll \parallel J \parallel$,因此成功地将参数量减少了很多。

权值共享就是说,给一张输入图片,用一个卷积核去扫这张图,卷积核里面的数就叫权重,这张图每个位置是被同样的卷积核扫的,所以权重是一样的,也就是共享。

通过权值共享的思想,对于每个输出节点ojo_joj,均使用相同的权值矩阵𝑾,那么无论输出节点的数量∥J∥\parallel J \parallelJ是多少,网络层的参数量总是k×kk \times kk×k

卷积运算

对于窗口k×kk \times kk×k 内的所有像素,采用权值相乘累加的方式提取特征信息,每个输出节点提取对应感受野区域的特征信息。这种运算其实是信号处理领域的一种标准运算:离散卷积运算。

离散卷积运算流程:

  1. 卷积核即是行、列为kkk大小的权值矩阵𝑾,对应到特征图上大小为kkk的窗口即为感受野,感受野与权值矩阵𝑾相乘累加,得到此位置的输出值。
  2. 每次通过移动卷积核,并与图片对应位置处的感受野像素相乘累加,得到此位置的输出值。
  3. 通过权值共享,从左上方逐步向右、向下移动卷积核,提取每个位置上的像素特征,直至最右下方,完成卷积运算。

在2D卷积运算中,卷积核是一个函数g(m,n)g(m,n)g(m,n)(m,n表示长/宽),有时也叫 Filter、Weight 等。

卷积神经网络

卷积神经网络通过充分利用局部相关性和权值共享的思想,大大地减少了网络的参数量,从而提高训练效率,更容易实现超大规模的深层网络。

单通道单核卷积

单通道输入cin=1c_{in}=1cin=1,如灰度图片只有灰度值一个通道,单个卷积核cout=1c_{out}=1cout=1的情况。以输入XXX为5 × 5的矩阵,卷积核为3 × 3的矩阵为例,与卷积核同大小的感受野(输入XXX上方的绿色方框)首先移动至输入XXX最左上方,选中输入XXX上3 × 3的感受野元素,与卷积核(图片中间3 × 3方框)对应元素相乘:

∣1−10−1−2−212−2∣⊙∣−1121−130−1−2∣=∣−1−10−1260−24∣\begin{vmatrix}1&-1&0 \\ -1&-2&-2 \\ 1&2&-2 \end{vmatrix} \odot \begin{vmatrix}-1&1&2 \\ 1&-1&3 \\ 0&-1&-2 \end{vmatrix}=\begin{vmatrix}-1&-1&0 \\ -1&2&6 \\ 0&-2&4 \end{vmatrix}111122022110111232=110122064

⊙\odot符号表示哈达马积,即矩阵的对应元素相乘,它与矩阵相乘符号@是矩阵的二种最为常见的运算形式。

运算后得到3 × 3的矩阵,这 9 个数值全部相加:−1−1+0−1+2+6+0−2+4=7-1-1+0-1+2+6+0-2+4 = 711+01+2+6+02+4=7

在这里插入图片描述

完成第一个感受野区域的特征提取后,感受野窗口向右移动一个步长单位(Strides,记为𝑠,默认为 1),按照同样的计算方法,与卷积核对应元素相乘累加,得到输出 10

在这里插入图片描述

按照上述方法,每次感受野向右移动𝑠 = 个步长单位,若超出输入边界,则向下移动𝑠 = 个步长单位,并回到行首,直到感受野移动至最右边、最下方位置,最终输出得到一个3 × 3的矩阵。

可以观察到,卷积运算的输出矩阵大小由卷积核的大小kkk,输入XXX的高宽ℎ/𝑤,移动步长𝑠,是否填充等因素共同决定。

在这里插入图片描述

多通道单核卷积

多通道输入的卷积层更为常见,比如彩色的图片包含了 R/G/B 三个通道,每个通道上面的像素值表示 R/G/B 色彩的强度。下面以 3 通道输入、单个卷积核为例,将单通道输入的卷积运算方法推广到多通道的情况。

每个通道上面的感受野窗口同步落在对应通道上面的最左边、最上方位置,每个通道上感受野区域元素与卷积核对应通道上面的矩阵相乘累加,分别得到三个通道上面的输出 7、-11、-1 的中间变量,这些中间变量相加得到输出-5,写入对应位置。

在这里插入图片描述

随后,感受野窗口同步在XXX的每个通道上向右移动𝑠 = 个步长单位,每个通道上面的感受野与卷积核对应通道上面的矩阵相乘累加,得到中间变量 10、20、20,全部相加得到输出 50,写入第一行、第二列元素位置。

在这里插入图片描述

以此方式同步移动感受野窗口,直至最右边、最下方位置,此时全部完成输入和卷积核的卷积运算,得到3 × 3的输出矩阵

在这里插入图片描述

整个的计算示意图如下

在这里插入图片描述

一般来说,一个卷积核只能完成某种逻辑的特征提取,当需要同时提取多种逻辑特征时,可以通过增加多个卷积核来得到多种特征,提高神经网络的表达能力。

多通道,多卷积核

多通道输入、多卷积核是卷积神经网络中最为常见的形式。

以 3 通道输入、2 个卷积核的卷积层为例。第一个卷积核与输入XXX运算得到输出OOO的第一个通道,第二个卷积核与输入XXX运算得到输出OOO的第二个通道,输出的两个通道拼接在一起形成了最终输出OOO。每个卷积核的大小kkk、步长sss、填充设定等都是统一设置,这样才能保证输出的每个通道大小一致,从而满足拼接的条件。

在这里插入图片描述

步长

对于信息密度较大的输入,如物体数量很多的图片,为了尽可能的少漏掉有用信息,在网络设计的时候希望能够较密集地布置感受野窗口;对于信息密度较小的输入,比如全是海洋的图片,可以适量的减少感受野窗口的数量。感受野密度的控制手段一般是通过移动步长(Strides)实现的。

步长是指感受野窗口每次移动的长度单位,对于 2D 输入来说,分为沿xxx(向右)方向和yyy(向下)方向的移动长度。

在这里插入图片描述

通过设定步长𝑠,可以有效地控制信息密度的提取。当步长设计的较小时,感受野以较小幅度移动窗口,有利于提取到更多的特征信息,输出张量的尺寸也更大;当步长设计的较大时,感受野以较大幅度移动窗口,有利于减少计算代价,过滤冗余信息,输出张量的尺寸也更小。

填充

经过卷积运算后的输出OOO的宽高一般会小于输入XXX的宽高。在网络模型设计时,有时希望输出OOO与输入XXX的宽高相同,从而方便网络参数的设计,残差链接等。

为了让输出OOO与输入XXX的宽高相同,一般通过在原输入XXX的高和宽维度上面进行填充(Padding)若干无效元素操作,得到增大的输入X′X^\primeX。通过精心设计填充单元的数量,在X′X^\primeX上面进行卷积运算得到输出OOO的高宽可以和原输入XXX相等,甚至更大。

在这里插入图片描述

在这里插入图片描述

在 TensorFlow 中,在𝑠 = 1时(s表示步长),如果希望输出OOO和输入XXX高、宽相等,只需要简单地设置参数 padding=”SAME" 即可使 TensorFlow 自动计算 padding 数量,非常方便。

空洞卷积

普通的卷积层为了减少网络的参数量,卷积核的设计通常选择较小的 × 和3 × 3感受野大小。小卷积核使得网络提取特征时的感受野区域有限,但是增大感受野的区域又会增加网络的参数量和计算代价,因此需要权衡设计。

空洞卷积(Dilated/Atrous Convolution)的提出较好地解决这个问题,空洞卷积在普通卷积的感受野上增加一个 Dilation Rate 参数用于控制感受野区域的采样步长。当感受野的采样步长 Dilation Rate 为 1 时,每个感受野采样点之间的距离为1,此时的空洞卷积退化为普通的卷积;当 Dilation Rate 为 2 时,感受野每 2 个单元采样一个点每个采样格子之间的距离为 2……

在这里插入图片描述

池化层

在卷积层中,可以通过调节步长参数𝑠实现特征图的高宽成倍缩小,从而降低了网络的参数量。除了通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,那就是池化层。

池化层同样基于局部相关性的思想,通过从局部相关的一组元素中进行采样或信息聚合,从而得到新的元素值。最大池化层(Max Pooling)从局部相关元素集中选取最大的一个元素值,平均池化层(Average Pooling)从局部相关元素集中计算平均值并返回。

5×55 \times 55×5输入XXX的最大池化为例,考虑感受野窗口大小为k=2k=2k=2,步长s=1s=1s=1的情况

绿色虚线方框代表第一个感受野的位置,感受野元素集合为{1,−1,−1,−2}\begin{Bmatrix} 1,-1,-1,-2 \end {Bmatrix}{1,1,1,2}

在最大池化采样的方法下,通过 x′=max({1,−1,−1,−2})=1x^\prime = max(\begin{Bmatrix} 1,-1,-1,-2 \end {Bmatrix}) = 1x=max({1,1,1,2})=1

计算出当前位置的输出值为1,并写入对应的位置

在这里插入图片描述

同样的方法,循环往复,移动感受野窗口直到最下方、最右边,获得最大池化层的输出,长宽为 × ,略小于输入XXX

在这里插入图片描述

由于池化层没有需要学习的参数,计算简单,并且可以有效减低特征图的尺寸,非常适合图片这种类型的数据,在计算机视觉相关任务中得到了广泛的应用。

通过精心设计池化层感受野的高宽kkk和步长sss参数,可以实现各种降维运算。

BatchNorm层

卷积神经网络的出现,网络参数量大大减低,使得几十层的深层网络成为可能。然而,在残差网络出现之前,网络的加深使得网络训练变得非常不稳定,会出现出现网络长时间不更新甚至不收敛的现象,同时网络对超参数比较敏感,超参数的微量扰动也会导致网络的训练轨迹完全改变。

BN (BatchNorm)层的提出,使得网络的超参数的设定更加自由,比如更大的学习率、更随意的网络初始化等,同时网络的收敛速度更快,性能也更好。

在 TensorFlow 中,通过 layers.BatchNormalization()类可以非常方便地实现 BN 层:

# 创建 BN 层
layer=layers.BatchNormalization()

与全连接层、卷积层不同,BN 层的训练阶段和测试阶段的行为不同,需要通过设置training 标志位来区分训练模式还是测试模式。

以 LeNet-5 的网络模型为例,在卷积层后添加 BN 层:

# 网络容器
network = Sequential([ layers.Conv2D(6,kernel_size=3,strides=1),# 插入 BN 层layers.BatchNormalization(),layers.MaxPooling2D(pool_size=2,strides=2),layers.ReLU(),layers.Conv2D(16,kernel_size=3,strides=1),# 插入 BN 层layers.BatchNormalization(),layers.MaxPooling2D(pool_size=2,strides=2),layers.ReLU(),layers.Flatten(),layers.Dense(120, activation='relu'),# 此处也可以插入 BN 层layers.Dense(84, activation='relu'),# 此处也可以插入 BN 层layers.Dense(10)
])

在训练阶段,需要设置网络的参数 training=True 以区分 BN 层是训练还是测试模型

with tf.GradientTape() as tape:x = tf.expand_dims(x,axis=3)out = network(x, training=True)

在测试阶段,需要设置 training=False,避免 BN 层采用错误的行为

for x,y in db_test: # 遍历测试集x = tf.expand_dims(x,axis=3)out = network(x, training=False)

深度残差网络

ResNet原理

ResNet 通过在卷积层的输入和输出之间添加 Skip Connection 实现层数回退机制,如下图所示,输入xxx通过两个卷积层,得到特征变换后的输出F(x)\mathcal{F}(x)F(x),与输xxx进行对应元
素的相加运算,得到最终输出H(x)\mathcal{H}(x)H(x)H(x)=x+F(x)\mathcal{H}(x) = x + \mathcal{F}(x)H(x)=x+F(x)

在这里插入图片描述

H(x)\mathcal{H}(x)H(x)叫作残差模块(Residual Block,简称 ResBlock)。由于被 Skip Connection 包围的卷积神经网络需要学习映射F(x)=H(x)−x\mathcal{F}(x)=\mathcal{H}(x) - xF(x)=H(x)x,故称为残差网络。

为了能够满足输入xxx与卷积层的输出F(x)\mathcal{F}(x)F(x)能够相加运算,需要输入xxx的 shape 与F(x)\mathcal{F}(x)F(x)的shape 完全一致。当出现 shape 不一致时,一般通过在 Skip Connection 上添加额外的卷积运算环节将输入xxx变换到与F(x)\mathcal{F}(x)F(x)相同的 shape。

DenseNet

DenseNet是Skip Connection 比较流行方案之一,DenseNet 将前面所有层的特征图信息通过 Skip Connection 与当前层输出进行聚合,与 ResNet 的对应位置相加方式不同,DenseNet 采用在通道轴𝑐维度进行拼接操作,聚合特征信息。

如下图所示,输入X0X_0X0通过H1H_1H1卷积层得到输出X1X_1X1X1X_1X1X0X_0X0在通道轴上进行拼接,得到聚合后的特征张量,送入H2H_2H2卷积层,得到输出X2X_2X2,同样的方法,X2X_2X2与前面所有层的特征信息 X1X_1X1X0X_0X0进行聚合,再送入下一层。如此循环,直至最后一层的输出X4X_4X4和前面所有层的特征信息:{Xi}i=0,1,2,3\begin{Bmatrix}X_i\end{Bmatrix}_{i=0,1,2,3}{Xi}i=0,1,2,3进行聚合得到模块的最终输出。这样一种基于 Skip Connection 稠密连接的模块叫做 Dense Block。

在这里插入图片描述

http://www.xdnf.cn/news/1296253.html

相关文章:

  • 消费级显卡分布式智能体协同:构建高性价比医疗AI互动智能体的理论与实践路径
  • TypeScript 中,! 是 非空断言操作符
  • 上网行为安全概述和组网方案
  • EN 61010电子电气设备安全要求标准
  • 抗辐照CANFD通信芯片在高安全领域国产化替代的研究
  • 从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性
  • Gemma 3 多模态推理 通过vllm运行Gemma-3-27B-IT模型的推理服务
  • NineData云原生智能数据管理平台新功能发布|2025年7月版
  • 基于U-NET遥感影像语义分割任务快速上手
  • git upstream
  • 流式数据服务端怎么传给前端,前端怎么接收?
  • 入门概述(面试常问)
  • vercel部署上线
  • 【数据分享】351个地级市农业相关数据(2013-2022)-有缺失值
  • 数智先锋 | 告别运维黑盒!豪鹏科技×Bonree ONE构建全栈智能可观测体系
  • 带环链表详解:环形链表检测与入环节点查找
  • 从 Notion 的水土不服到 Codes 的本土突围:研发管理工具的适性之道​
  • Linux下的软件编程——framebuffer(文件操作的应用)
  • 表达式树实战:Unity动态逻辑编程
  • tp5集成elasticsearch笔记
  • Unity中的神经网络遗传算法实战
  • 一篇文章读懂.Net的依赖注入
  • .NET 的 WebApi 项目必要可配置项都有哪些?
  • .Net4.0 WPF中实现下拉框搜索效果
  • 面试题之项目中git如何进行管理
  • 如何启动本机mysql数据库
  • 在mysql> 下怎么运行 .sql脚本
  • XCTF-warmup详细题解(含思考过程)
  • Morph Studio-一站式AI视频创作平台
  • Vue浅学