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.pswp.cn/news/918730.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链在可信空间智能合约中的应用

区块链在可信数据空间的智能合约应用,通过去中心化信任机制、自动化执行、可验证计算等特性,正在重塑数据存储、共享、交易和治理的模式。以下是其核心应用方向、关键技术及落地案例的深度解析: 一、核心应用方向 1. 数据确权与授权管理 应用场景 个人数据主权:用户通过智…

pycharm配置python解释器教程

一个解释器对应一个环境,无论是conda环境或是Python环境。python环境的解释器的路径形如"D:\Python3.12\python.exe",conda环境的解释器的路径形如"D:\anaconda3\envs\opencv\python.exe"。 如何在Pycharm中设置解释器 打开pycharm&…

C#教程之NPOI读写excel文件XLS,XLSX格式

NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件。仅需处理 XLS/XLSX 格式的文本和数字读写,最少需要加载 2 个核心 DLL:NPOI.dll包含所有格式的通用接口(IWorkbook、ISheet、IRow、ICell …

Perforce P4 Git 连接器

Perforce P4 Git连接器将Git代码库与数字资产集中存储于Perforce P4(前身为Helix Core),为所有数字资产(源码二进制文件)构建单一事实来源。 突破代码库与文件限制 当艺术家、开发者及工程师组成的大型团队仅使用Git时…

day10_寻找用户推荐人

一、题目给出一张customer表,里面有id(客户id)——主键,name(客户姓名),referee_id(推荐人客户id)三个字段二、题目要求1、找出被id不是2的用户推荐的客户姓名2、没有被任…

python爬虫(三)----Selenium

目录 1. Selenium 1.1 Selenium是啥 1.2 安装chrom Driver 1.3 selenium 使用 1.4 selenium元素定位 1.5 访问元素信息 1.6 交互 2. Phantomjs、Chrom handless 1. Selenium 1.1 Selenium是啥 自动化Web浏览器操作 主要用于Web应用程序的测试 支持多操作系统、多浏览器…

《事务隔离级别与 MVCC 机制深度剖析》

🔍 事务隔离级别与 MVCC 机制深度剖析 🧠 前言 在高并发场景下,数据库事务是保证数据一致性的基石。但在 MySQL InnoDB 中,事务的隔离级别、锁策略、MVCC(多版本并发控制)之间的配合,常常是面…

20250814,通义万相,无限生成权限(慢速)

今天看小红书,发现通义万相可以免费生成慢速图片。研究一下每天10分用完后,按钮就变成0,但是可以点击这个0,进入排队慢速生成状态。原来通义万相的收费主要是用来提速的(快速出图),不着急的话也…

Salesforce方案:医疗行业“患者随访与健康管理”

医疗行业“患者随访与健康管理”的Salesforce方案设计 一、业务需求核心解析 医疗行业患者随访与健康管理需实现三大目标: 全周期健康记录:整合患者基本信息、病史、诊疗记录及检查结果,形成完整健康档案个性化随访计划:基于病种和…

vscode使用keil5出现变量跳转不了

vscode使用keil5出现变量跳转不了,或者未包含文件,或者未全局检索; 参考如下文章后还会出现; 为什么vscode搜索栏只搜索已经打开的文件_vscode全局搜索只能搜当前文件-CSDN博客 在机缘巧合之下发现如下解决方式: 下载…

如何查看SQL Server的当前端口

想知道SQL Server用的是哪个端口? 很简单,通过注册表就能查到。第一步:打开注册表按下 Win R,输入:regedit回车,打开注册表编辑器。第二步:找到路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSS…

常见的Jmeter压测问题

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快根据在之前的压测过程碰到的问题,今天稍微总结总结,以后方便自己查找。一、单台Mac进行压测时候,压测客户端Jmeter启动超过2000个…

第二十三天:求逆序对

每日一道C题&#xff1a; 问题&#xff1a;给定一个序列a1,a2,…,an&#xff0c;如果存在i<j并且ai>aj&#xff0c;那么我们称之为逆序对&#xff0c;求逆序对的数目。 要求&#xff1a;输入第一行为n,表示序列长度&#xff0c;接下来的n行&#xff0c;第i1行表示序列中的…

Java—CompletableFuture 详解

参考&#xff1a; CompletableFuture原理与实践-外卖商家端API的异步化 - 美团技术团队 CompletableFuture 详解 | JavaGuide 1.CompletableFuture介绍 CompletableFuture是由Java 8引入的&#xff0c;在Java8之前我们一般通过Future实现异步。 Future用于表示异步计算的结…

大模型部署基础设施搭建 - 向量数据库milvus

一、docker方式安装参考官网&#xff1a;https://milvus.io/docs/zh/install_standalone-docker.md#Install-Milvus-in-Docker1.1 安装 curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.shbash standal…

(25.08)Ubuntu20.04复现KISS-ICP

主页&#xff1a;https://github.com/PRBonn/kiss-icp?tabreadme-ov-file 仓库&#xff1a;https://github.com/PRBonn/kiss-icp.git 非 ROS 使用流程 1. 克隆仓库 git clone https://github.com/PRBonn/kiss-icp.git cd kiss-icp 2. 使用 micromamba 创建 Python 虚拟环…

linux 软硬链接详解

一、核心区别总览特性硬链接&#xff08;Hard Link&#xff09;软链接&#xff08;Symbolic Link&#xff09;本质直接指向文件的 inode&#xff08;数据块的入口地址&#xff09;指向文件的 路径名&#xff08;相当于快捷方式&#xff09;跨文件系统支持❌ 仅限同一文件系统✅…

基于SpringBoot+Vue的房屋匹配系统(WebSocket实时通讯、协同过滤算法、地图API、Echarts图形化分析)

&#x1f388;系统亮点&#xff1a;WebSocket实时通讯、协同过滤算法、地图API、Echarts图形化分析&#xff1b;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17前端&…

第2节:多模态的核心问题(多模态大模型基础教程)

前言 本节课我们聚焦多模态大模型最核心的问题&#xff1a;文本、图像、语音这些“不同语言”的信息&#xff0c;是怎么被模型“翻译”并互相理解的&#xff1f;我们从“差异”入手&#xff0c;一步步搞懂其中的逻辑。 一、先搞懂&#xff1a;什么是“模态差异”&#xff1f; 生…

Java stream distinct findAny anyMatch实现 :DistinctOp、FindOp、MatchOp

DistinctOpsDistinctOps 是一个专门用于实现 Stream.distinct() 操作的工厂类。正如它的名字所示&#xff0c;它的核心职责就是创建能够去除流中重复元素的操作。distinct() 是一个有状态的中间操作 (stateful intermediate operation)&#xff0c;这意味着它通常需要看到所有元…