同学你好!本文章于2021年末编写,已与实际存在较大的偏差!
故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,
Pytorch深度学习·理论篇(2023版)目录地址为:
CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录
本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!
https://v9999.blog.csdn.net/article/details/127587345
欢迎大家订阅(2023版)理论篇
1 视觉角度理解卷积神经网络
1.1 卷积神经网络与生物视觉系统的关系
卷积神经网络的工作流程与生物大脑的处理视觉信号的流程相似,即:将图像从基础像素到局部信息再到整体信息的转化。大脑在对图像进行分级处理时,图片由低级特征到高级特征进行逐级计算。
1.2 微积分
大脑处理视觉时,本质是先微分再积分的过程
1.3 离散微分与离散积分
在微积分中,无限细分的条件是,被细分的对象必须是连续的,例如直线可以无限细分为点、但是若干个点则无法进行细分。
1.3.1 离散微分
将离散的对象进行细分的过程,称为离散微分,例如图7-3右,虚线段分成四个点的过程。
1.3.2 离散积分
- 图7-3左可以理解为连续细分的线段进行积分的结果,把所有任意小的线段合在一起。
- 图7-3右的虚线段可以理解为4个点的积分结果,即把4个点组合在一起。
- 对离散微分结果进行积分的操作即为离散积分。
1.4 视觉神经网络中的离散积分
1.4.1 计算机视觉的数字化形式
每个矩阵的值为0~255,用来代表像素点
1.4.2 计算机的图片处理/离散微积分的工作模型
①利用卷积操作对局部信息进行处理,生成低级特征。
②对低级特征进行多次卷积操作,生成中级特征,高级特征。
③将多个局部信息的高级特征组合在一起,生成最终的解释结果
2 卷积神经网络的结构
对数据区域进行小规模的计算,使用更小的权重完成分类任务,改善难收敛的情况,提高泛化能力。
2.1 卷积神经网络的工作过程
以全连接网络为例子,进行卷积神经网络的介绍:
卷积过程:
卷积核(又称滤波器),该卷积核有三个输入节点,一个输出节点。经过卷积操作做得到的节点称为特征图。每次移动一定的步长,其输出的全部结果即为卷积的结果。
2.1.1 卷积神经网络与全连接网络的区别
- 卷积网络输出的每个节点都是原数据中局部区域节点经过神经元计算后得到的结果。
- 全连接网络输出的每个节点都是原数据中全部节点经过神经元计算后得到的结果。
- 卷积神经网络所输出的结果中含有的局部信息更为明显。由于卷积的这一特性,卷积神经网络在计算机视觉领域被广泛应用。
2.2 1D卷积、2D卷积、3D卷积
1D/2D/3D卷积计算方式都是一样的,其中2D卷积应用范围最广。与全连接层相比,卷积层的主要优点是参数共享和稀疏连接,这使得卷积操作所需要学习的参数数量大大减少。
卷积计算方式如下:
n:原始图像尺寸 n ∗ n
p:即padding,原始图像边缘的填充像素列数
f:即 filter 的kernel 尺寸,这里需要强调下,因为原始图像只有一个通道,所以这个卷积filter 只用了一个kernel。
s:即stride,filter 在图像上每次的移动步长。
计算方式的推导过程:
卷积就是对相邻的一片数据进行加权求和得到一个数的一种“合并”操作,将此操作对输入张量进行滑动扫描以得到输出张量。循着这个过程,我们很容易推导出卷积输出尺寸的计算公式。
(1)padding指的是两边同时补零,所以补零后输入尺寸相当于变成了i+2p;
(2)用卷积核扫描的时候,想象一把尺子在桌子上从左移动到右,受到左右边框的界限,它的移动范围只有i+2p-f大小。
(3)如果每次移动的步长是s,实际上移动的步数就是 (i+2p-f)/s,但移动的步数必须是整数,因为不能出界,如果最后一步哪怕还差一点也不能算,所以必须要向下取整。
(4)即使一步不移动,也会在原位得到一个输出点,所以最后得到的输出尺寸是移动的总步数再加上1。
2.2.2 AI面试题之(反)卷积输出尺寸计算
【input+2*padding】这个就是原来的图片,外面加了一圈padding,因为padding是一圈,所以左右、上下都有,所以是两倍的。
【input+2∗padding−kernel】是计算,这个要走多少步。
来举个例子就好理解了:
图中是input为7,然后kernel_size为3,podding是1的一个例子。
从下图中可以看出来,kernel总共要走6步
这个六步,就是input+2∗padding−kernel的含义,kernel要滑动的步数。
那么stride就是步长,如果是2的话,那么kernel移动就是这样的(如下图):
就变成3步了。那么为什么计算公式最后还要加上1呢?就是在kernel还没有迈出步子的时候,最开始的处于左上角的那个位置,也是一个点。
【总结:卷积输出尺寸计算的时候,前面的分式,就是计算卷积核可以走几步,然后再加上卷积核的初始位置,就是输出尺寸了】
来看个正经的例子:
【这个例子展示了,如果输入尺寸是一个偶数,卷积核是奇数的情况,如何计算——向下取整】
2.2.3 反卷积推导计算
两个反卷积例题
输入尺寸input=2,kernel_size=3,stride=1,padding=2,计算反卷积的输出尺寸?
【答案:output=4】
输入尺寸input=3,kernel=3,stride=2,padding=1,计算反卷积的输出尺寸?
【答案:output=5】
2.2.4 1D卷积
计算方式
1、图中的输入的数据维度为8,过滤器的维度为5。与二维卷积类似,卷积后输出的数据维度为8−5+1=4。
2、如果过滤器数量仍为1,输入数据的channel数量变为16,即输入数据维度为8×16。这里channel的概念相当于自然语言处理中的embedding,而该输入数据代表8个单词,其中每个单词的词向量维度大小为16。在这种情况下,过滤器的维度由5变为5×16,最终输出的数据维度仍为4。
3、如果过滤器数量为n,那么输出的数据维度就变为4×n。
应用领域
一维卷积常用于序列模型,自然语言处理领域
2.2.5 2D卷积
计算方式
1、图中的输入的数据维度为14×14,过滤器大小为5×5,二者做卷积,输出的数据维度为10×10(14−5+1=10)。
2、上述内容没有引入channel的概念,也可以说channel的数量为1。如果将二维卷积中输入的channel的数量变为3,即输入的数据维度变为(14×14×3)。由于卷积操作中过滤器的channel数量必须与输入数据的channel数量相同,过滤器大小也变为5×5×3。在卷积的过程中,过滤器与数据在channel方向分别卷积,之后将卷积后的数值相加,即执行10×10次3个数值相加的操作,最终输出的数据维度为10×10。
3、以上都是在过滤器数量为1的情况下所进行的讨论。如果将过滤器的数量增加至16,即16个大小为10×10×3的过滤器,最终输出的数据维度就变为10×10×16。可以理解为分别执行每个过滤器的卷积操作,最后将每个卷积的输出在第三个维度(channel 维度)上进行拼接。
应用领域
二维卷积常用于计算机视觉、图像处理领域
2.2.6 3D卷积
计算方式
1、假设输入数据的大小为a1×a2×a3,channel数为c,过滤器大小为f×f×f×c(一般不写channel的维度),过滤器数量为n。
2、基于上述情况,三维卷积最终的输出为(a1−f+1)×(a2−f+1)×(a3−f+1)×n。
应用领域
三维卷积常用于医学领域(CT影响),视频处理领域(检测动作及人物行为)
3 实例分析:Sobel算子原理
Sobel算子是卷积操作中经典例子,利用手动配置好的卷积核对图片进行卷积操作,实现图片的边缘检测,生成只包括轮廓的图片。
Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是效率要求较高,而对细纹理不太关心的时候。
3.1 方法
假设要处理的图像为I,在两个方向求导:
- 水平变化: 将图像I与奇数大小的模版进行卷积,结果为Gx。比如,当模板大小为3时, Gx为:
- 垂直变化: 将图像I与奇数大小的模板进行卷积,结果为Gy。比如,当模板大小为3时, 则Gy为:
在图像的每一点,结合以上两个结果求出:
统计极大值所在的位置,就是图像的边缘。
注意:当内核大小为3时, 以上Sobel内核可能产生比较明显的误差, 为解决这一问题,我们使用Scharr函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,其计算方法为:
3.3 Sobel算子的计算过程
Sobel算子计算过程图7-10左边的5×5浅色矩阵可以理解为原始图片。中间的3x3矩阵便是Sobe1算子。图7-10右边的5×5矩阵可以理解的轮廓图片。
3.3.1 计算过程的描述。
1、在原始图片的外面补了一圈0,这个过程称为padding,填充操作目的是生同样大的矩阵。
2、将补0后矩阵中,左上角的3×3矩阵中的每个元素分别与Sobel算子矩阵中对应位置上的元素相乘,然后相加,所得到的值作为最右边的第一个元素。
3、把图7-10中左上角的3×3矩阵向右移动一个格,这可以理解为步长为1。
4、将矩阵中的每个元素分别与中间的3×3矩阵对应位置上的元素相乘,然后再将相乘的结果加在一起,算出的值填到图7-0右侧矩阵的第二个元素里。
5、一直重复这个操作将右边的值都填满。完成整个计算过程。
新生成的图片里面的每个像素值并不能保证在0~256。对于在区间外的像素点,会导致灰度图无法显示,因此还需要做一次归一化,然后每个元素都乘上256,将所有的值映射到0~256这个区间,注意归一化算法:x=(c-Mim)/Max-Mim)。其中,Max与Mi血为整体数据里的最大值和最小值,x是当前要转换的像素值。归一化可以使每个x都在[0,1]区间内。
3.4 Sobel算子原理
如下图所示,该图片经过Sobel算子卷积后的数据本质上是该图片中相隔像素之间的差值而已。如果将这个像素差值数据用图片的方式显示出来,就变成了轮廓图片。
Sobel算子第二行权重值的原理与第1行相同,只不过将差值放大为2倍,这样做是为了增强的效果。
它的思想是:(1)对卷积核的3行像素差值再做加权处理;(2)以中间的第2行像素差值为中心;(3)按照离中心点越近,对结果影响越大的原理,对第2行像素差值进行加强(值设为2),使其在生成最终的结果中产生主要影响。
4 深层神经网络中的卷积核
在深层网络中,有很多类似于Sobel算子的卷积核,与Sobel算子不同的是,他们的权重值是模型经过大量的样本训练之后算出来的。
在模型训练过程中,会根据最终的输出结果调节卷积核的权重,最终生成了若干个有特定功能的卷积核,有的可以计算出图片中的像素差值,从而提取背景纹理等。卷积后所生成的特征数据还可以被继续卷积处理。在深度神经网络中,这些卷积处理是通过多个卷积层来实现的。
深层卷积网络中的卷积核也不再是简单地处理轮廓、纹理等基础像素,而是对已有的能廓、纹理等特征更进一步地推理和叠加。被多次卷积后的特征数据会有更具象的局部表征,如可以识别出眼睛、耳朵和鼻子等信息。再配合其他结构的神经网络对局部信息的推理和叠加,最终完成对整个图片的识别。
5 理解卷积的数学意义--卷积分