之前我们讲了最简单的神经网络--人工神经网络(ANN),如果有不清楚的小朋友,可以去看我之前写的文章,里面详细地简述了人工神经网路的概念以及基本相关知识。 神经网络及其相关知识_Pierrot_Sgr的博客-CSDN博客https://blog.csdn.net/m0_62921128/article/details/123358736?spm=1001.2014.3001.5501
我们讲一讲神经网络的基本分类,之前的文章中,我们讲过神经网络分为:人工神经网络(ANN),bp神经网络,还有卷积神经网络(CNN),其实还有循环神经网络(RNN)和全连接神经网络(DNN)。
本篇文章,我重点讲述卷积神经网络(在了解卷积网络之前,希望大家已经提前了解了‘图片’,‘矩阵的运算’等相关的知识,这里我就不讲解了)
首先我们要理解什么是卷积
卷积
简单来说就是一个提取特征的过程,卷积较多地使用在‘图像识别’(CV)领域。
我们卷积的对象是一大堆图片,图片有它自己的像素,简而言之,我们可以把图片看成一个个矩阵(大部分情况下,这个矩阵是个方阵,有时候这个矩阵是个长方形。)
(先不看下图中红色的框框,就把它看成一个矩阵),如图这是一个6*6*1的矩阵,c=1,如果是RGB图像,则c为3,(这里我举的是c=1的图片,最简单,方便讲解),6*6*1为输入矩阵的尺寸,我们也把它叫为‘input_size’
这个输入的图片我们把它看成矩阵,这个矩阵就要输入我们的卷积神经网络(CNN)。放入我们输入图片的地方,我们把它叫做‘输入层’,我们进行‘卷积’这个操作的所在层叫做‘隐含层’,其实隐含层不只包括‘卷积层’,它还包括‘池化层’和‘全连接层’,之后我会一一讲解。我们之前说过,卷积是一个‘提取特征’的过程,我们提取特征需要用到‘卷积核’,卷积核同时也叫‘filter’,这个卷积核也是一个矩阵,通常情况下,这个卷积核矩阵的大小比输入图片矩阵的大小还要小,卷积核的尺寸我们把它称为kernel_size。
以下图片直观的展示了卷积的过程
如上图,我们的input_size是6*6*1,kernel_size为3*3*1,上图有一个红色的正方形框框,它的size和我们的kernel_size是一样的,这个红色框框是我们使用filter对输入矩阵进行卷积的第一个区域,filter先对这个区域卷积,再对其他区域卷积,图中显示,我们对这第一个区域卷积出来的结果是2,而这个2是由以下公式得到的
4,9,2,5,6,2,2,4,5分别是第一个区域的9个数,1,0,-1,1,0,-1,1,0,-1分别是filter的9个数,我们把他们对应位置的值相乘,最后再相加,就得到了我们最终的结果2。
我们只卷积了第一部分,当然剩下的部分我们也要卷积,当我们要卷积其他部分的时候,我们就要进行移动,专业术语叫‘slide’,我们遵循的移动原则就和我们平常看书的时候一样,我们读书,从左读到右,一排读完之后,我们就会开始读下一排,卷积核移动也是如此,先一直向右移动,移动到了尽头之后就会跳到下一排,直到结束,卷积核移动可以一格一格地移动,可以两格两格的移动,这个移动的步子,我们把它称为‘stride’,我们向右移动和向下移动的步子可以一样,可以不一样,若我们每次向右移动一格,向下移动两格,我们就把stride写成'stride=(1,2)',若我们向右移动和向下移动的步子是一样的,比如都是两格,则我们写成stride=2。
卷积层可以不止一层,可以是多层
感受野
如上图,我们有三个卷积层,每一层的卷积核都是3*3*1
我们把7*7*1,5*5*1,3*3*1,1*1*1的四个矩阵分别命名为f1,f2,f3,f4
想想一下,当你正视你眼前的物体的时候,在你视野中央的区域你看得比较清楚,而你视野周围的部分是模糊的,你看不清,在生物学方面我们把这个看得清楚部分称为‘感受野’,在CNN中,我们也有‘感受野’这个概念,我们先给出它的定义,感受野(Receptive Field)的定义:卷积神经网络每一层输出的特征图(feature map)上的像素点映射回输入图像上的区域大小。通俗点的解释是,特征图上一点,相对于原图的大小,也是卷积神经网络特征所能看到输入图像的区域。上面四个图中,f1到f2的过程中7*7*1的信息都跑到了5*5*1的矩阵上,最后这个这些信息都跑到了1*1*1上,所以这个1*1*1的矩阵的感受野是7*7*1(注意这里的感受的指的是feature map映射到原图上的大小,而不是其他图片,同时每一层的feature map都会有一个感受野,而不是最后一个feature map才有感受野。)
下图能帮助帮助大家更好的理解感受野
以下为感受野的计算公式
感受野是从后往前计算的如f1,f2,f3,f4(1-1)*1+3=3,(3-1)*1+3=5,(5-1)*1+3=7我们通过公式可以计算出感受野为7*7*1。
神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;而值越小则表示其所包含的特征越趋向于局部和细节。因此感受野的值可以大致用来判断每一层的抽象层次。
当然感受野的也不能过大或过小
若感受野过大,会忽略被检测的物体,导致物体成为背景,提取不到物体特征。也就是说对小物体的检测会差一点;若感受野过小的话,感受野小于要提取的特征区域,获得的局部信息过多,导致全局信息的丢失,影响识别率。
网络深度越深,卷积的过程中会丢失信息,所以一般选取大的感受野来保证不丢失过多信息。 当然,对于一些小物体选择大的感受野效果就不太好了。
不同大小的卷积核获得不同大小的信息,选取合适的感受野也是很重要的。
padding
从上图我们可以很容易看出,每一次卷积过后,我们的feature map都会变小,如果继续卷积,最终我们的feature map可能会变成1*1,虽然提取了信息,但是最终的图片和input_size大小相差太大,丢失了太多的原图信息,为了避免这种情况,我们就要给输入的原图加上padding,所谓的padding,就是在原图加上一层数值为0的矩阵,如下图
padding的添加,可以放大我们的input_size,以至于在卷积的过程中,我们的图片不会越变越小,如果想在输入矩阵外加上一圈0,padding=1,若想加上两圈0,则padding=2。(这里补充一个重要的知识点,若我们要计算感受野的话,在卷积的整个过程中,我们不能加上padding,我们的感受野是只最终输出的feature map在原图矩阵上的映射大小,加上padding后,就不是原图了)
要是一直我们的输入矩阵的尺寸为N,卷积核的尺寸为F,padding的大小为P,步长为S,则我们通过以下公式,可以求出feature map的大小(其中的方括号指的是向下取整的意思,若
的值为1.5,则
=1,以此类推),我们把这种输出矩阵和输入矩阵的大小相同的情况成为padding=same,其作用就是为了防止最终的图片和input_size大小相差太大,丢失了太多的原图信息因为每次卷积过后我们的尺寸都没有变化,故每次卷积后我们不用计算矩阵的尺寸。
大多数情况下,我们的卷积核的尺寸为1*1,3*3,5*5,7*7这种奇数,之前说了,为了不让我们的矩阵越来越小,我们会加上padding,我们假设我们的输入矩阵的大小为N,卷积核的尺寸为F,padding的大小为p,步长为1(大多数情况下为1),输出的feature map的大小也为N,我们可以代入公式从而求出
而p是一个整数,则F必须是一个奇数,当然你也可以用偶数的卷积核,只不过这种情况非常少见,而且偶数的卷积核卷积的效率很低。用奇数的卷积核还有一个优点,当为奇数时,我们的卷积核会有一个最中心的位置,我们称这个绝对中心为锚点,方便我们确定卷积核的位置,避免信息位置发生偏移。
1*1卷积核的作用
在讲1*1卷积之前,我们先讲一讲多维卷积,之前我们的通道数为1(c=1),我们进行的操作时单通道卷积,我们的RGB图像的通道数是3,RGB图像也可以卷积,我们进行的操作即为多通道卷积
改图可以帮助大家更好地理解多通道卷积,我们的RGB图像为8*8*3,我们的卷积核为3*3*3,我们有四组卷积核,我们的具体过程如下。我们把rgb的三张图片命名为x1,x2,x3,第一组卷积核的三个卷积核分别命名为y1,y2,y3。在卷积过程中,我们y1卷积x1,y2卷积x2,y3卷积x3,故我们会得到三个feature map,他们的大小一定都是相同的,我们把这个三个feature map相加起来,就会得到一个feature map其他三组卷积核的操作相同,因为我们有四组卷积核,所以最终我们会得到四个feature map。
想象一下,我们如果用一个1*1的二维卷积核,去卷积一个二维的矩阵,我们的feature map是不是会和我们的输入矩阵完全一样,但如果我们进行多通道卷积,就如上图,我们把我们四组卷积核中的数字全部换为1,我们第一组卷几个卷出来的三个feature map会和我们出入的rgb图像是一样的,我们三个feature map相加,得到我们最终的第一个feature map,我们会得到最终的四个feature map,我们输入图像的通道数为3,我们最终输出图像的通道数委,从而达到一个升维的效果,当然如果我们只有两组卷积核,我们可以达到一个降维的效果,故经过1*1卷积,我们就可以实现升维和降维的操作。(当然,我们这里要注意一下,我们的每一组的卷积核的通道数必须要和我们我们输入矩阵的通道数相同,如我们rgb图像的通道数为3,我们每一组卷积核的通道数也为3,只有通道数相同,我们才能进行多通道卷积)
小卷积核的作用
在卷积过程中,我们一般会选择尺寸较小的卷积核如1*1和3*3进行多次卷积,来代替大的卷积核
例如我们进行以下操作(忽略我的丑字...谢谢)
同时多个小尺寸的卷基层比一个大尺寸卷积层有更多的非线性(更多层的非线性函数),使得判决函数更加具有判决性,并且起到隐式正则化的作用。
池化层
之前我们讲过,隐含层里面不止有卷积层,同样有池化层和全连接层
所谓池化,池化层可以有效的缩小参数矩阵的尺寸,从而减少最后连接层的中的参数数量。所以加入池化层可以加快计算速度和防止过拟合的作用。
池化常见的有最大池化和平均池化
如图就是一个最大池化的过程,一个矩阵,被分为四个部分,每一部分有四个数,我们取出每一部分最大的数,构成一个小矩阵,即为最大池化。
如果是平均池化的话,就把每一部分的四个数取一个平均值,填入我们的小矩阵,即为平均池化。
全连接层
全连接层位于CNN的最后一部分,比如我们进行多通道卷积,最后经过了池化层,我们最后得到的特征图为2*2*3
我们将这个特征图展平,得到一个一维向量,计算这个一维向量,比我们计算特征图的计算量小很多,我们把这个一维向量输入我们的全连接神经网络中,用来输出我们的结果,最后这个全连接神经网络可以只有一层,可以有很多层,具体层数依据情况而定
全连接层和全连接神经网络的区别,如果一个神经网络有卷积层,池化层,激活层,全连接层等等,他就是个卷积神经网络,如果一个神经网络只有全连接层,那它就是个全连接神经网络。
输出层
经过了我们之前所有层之后,最后到了我们的输出层,输出层的作用就是输出我们的最终结果。
一些常用的激活函数
sigmoid函数
sigmoid函数,也可以叫logistic函数,之前的文章我也讲过,我们的这个函数通常用于二分类问题,同时也可以将我们的结果映射到(0,1)这个值域范围中,sigmoid函数也具有较好的对称性。
同时它的导数和它本身有如下的关系
优点:
1.Sigmoid的取值范围在(0, 1),而且是单调递增,比较容易优化
2. Sigmoid求导比较容易,可以直接推导得出。
缺点:
1. Sigmoid函数收敛比较缓慢
2. 由于Sigmoid是软饱和,容易产生梯度消失,对于深度网络训练不太适合(从图上sigmoid的导数可以看出当x趋于无穷大的时候,也会使导数趋于0)
3. Sigmoid函数并不是以(0,0)为中心点
tanh函数
它的导数和函数本身有如下关系,
优点:
1. 函数输出以(0,0)为中学
2.收敛速度相对于Sigmoid更快
缺点:
<1.tanh并没有解决sigmoid梯度消失的问题
损失函数
交叉熵损失函数,这个损失函数常常使用在分类问题,比如我们区分一张图片究竟是猫,是狗,还是猪其真实的概率为[0,1,0],即这个图片显示的是猫,[0,1,0]被称为我们的真实分布,而计算机给出的预测概率分布为[0.2,0.7,0.1]我们把真实的概率分布记为p(x)预测的概率分布为q(x)
我们就可以给出以下公式 (其中对数的底为e)
我们带入公式就可以算出我们的loss
优化器
SGD优化器
之前的文章我们讲过梯度下降(GD),并给出了公式
我们也有其他的方法
SGD优化器
随机梯度下降(SGD)算法
每次选择一个mini-batch,而不是全部样本,使用梯度下降来更新模型参数。它解决了随机小批量样本的问题,但仍然有自适应学习率、容易卡在梯度较小点等问题。
Adam优化器
adam优化器在梯度比较大的地方,它的学习率会比较大,在梯度比较小的地方,它的学习率会比较小。