CNN之自我理解

已经看过了CNN各个层的计算公式的推倒,对各个层次有了基本了解,但是理解的不透彻,只是知道每层怎么计算,误差怎么传递,怎么训练,但是不知道每层具体的意义,这样怎么设计自己的网络???所以从网上搜索了很多关于CNN通俗的理解,记录一下。如有侵权,请联系,立马删除。

自我理解的卷积神经网络

conv+relu+pooling(卷积、非线性、池化)用于特征提取全连接用于分类

怎么特征提取?
提取什么特征?
全连接又是怎么分类的?

卷积层:

回答:怎么特征提取?

具体操作:过滤器在图片上滑一遍, 得到新的特征图。

但是过滤器是什么?
得到的新的特征图又是什么?

这个过滤器(核)其实就是一个模板,利用这个模板再通过卷积计算的定义就可以计算出一幅新的图像,新的图像会把这个卷积核所体现的特征突出显示出来比如这个卷积核可以侦测水平纹理,那卷积出来的图就是原图水平纹理的图像。但是这些特征过于低级。现在假设要做一个图像的分类问题,比如辨别一个图像里是否有一只猫,我们可以先判断是否有猫的头,猫的尾巴,猫的身子等等,如果这些特征都具备,那么我就判定这应该是一只猫(如果用心的话你就会发现这就是CNN最后的分类层)。

关键在于这些特征是高级的语义特征,这种特征怎么用卷积核提取呢?
高级语义特征

原来的卷积核都是人工事先定义好的,是经过算法设计人员精心设计的,他们发现这样或那样的设计卷积核通过卷积运算可以突出一个什么样的特征,于是就高高兴兴的拿去卷积了。但是现在我们所需要的这种特征太高级了,而且随任务的不同而不同,人工设计这样的卷积核非常困难。
于是,利用机器学习的思想,我们可以让他自己去学习出卷积核来!也就是学习出特征!
如前所述,判断是否是一只猫,只有一个特征不够,比如仅仅有猫头是不足的,因此需要多个高级语义特征的组合怎么组合是全连接考虑的,卷积只是考虑怎么提取高级特征),所以应该需要多个卷积核,多个feature map,这就是为什么需要学习多个卷积核的原因。

为什么CNN要设计这么多层呢?

首先,应该要明白,猫的头是一个特征,但是对于充斥着像素点的图像来说,用几个卷积核直接判断存在一个猫头的还是太困难,怎么办?简单,把猫头也作为一个识别目标,比如猫头应该具有更底层的一些语义特征,比如应该有猫的眼睛、猫的耳朵、猫的鼻子等等。这些特征有的还是太高级了,没关系,继续向下寻找低级特征,一直到最低级的像素点,这样就构成了多层的神经网络。
第一层的输入是原始图像,而第二卷积层的输入正是第一层输出的激活映射。第二层的输入大体已经描绘了低级特征在图片中的位置。在此基础上再采用一组过滤器(让它通过第 2 个卷积层),输出将是表示了更高级的特征的激活映射。这类特征可以是半圆(曲线和直线的组合)或四边形(几条直线的组合)。随着进入网络越深和经过更多卷积层后,你将得到更为复杂特征的激活映射。也就是说网络越深我们学到的越是深层次语义特征,越是高级的语义特征。
CNN称之为深度学习,要义就在这个深字上,对于CNN而言,这个深其实就是意味着层层的特征表示。比如浅层的特征,例如点、线、面之类的简单几何形状,都是在底层训练出来的,对于这些底层的特征继续进行组合表示,就是后面的若干层的任务。最后把从低级特征组合而来的高级特征在进一步变成语义特征,就可以使用全连接层进行分类了。
比如下面这个图就是一个可视化理解,越往后过滤器学到的特征越高级:(图中可视化的是过滤器,如果一个曲线过滤器滑过一遍图片,那么在图片有曲线的地方,值就会很大,没有的地方很小甚至为0,越往后过滤器学习的特征越高级,比如后面过滤器可以学习到眼睛,那么滑过一遍图片,原图中有眼睛的地方通过感受野映射到这一层,输出的特征值就会很大,也就意味着这一个像素值对应的原图的感受野中是有眼睛的)【这里不理解可以看一下后面的EXAMPLE】
在这里插入图片描述
这是我们强行可视化的结果看到的,但是,实际上,CNN就是一堆向量一堆矩阵,没有那么明显的可视化结果,那些特征图就是特征向量矩阵,我们无法具体说出他是描述的什么特征,这也是说CNN是黑匣子的原因。卷积提取了他认为最有用的特征,只不过这些特征是用向量表达,简单理解,向量的每一个位置都是神经网络提取的特征,只不过,我们并不知道神经网络提取了哪些特征

—————————————————————————————————————————————————

Example:

这里我们给一个曲线过滤器—每个过滤器可以看成是特征标识符( feature identifiers)。这里的特征指的是例如直边缘、原色、曲线之类的东西。想一想所有图像都共有的一些最简单的特征。假设第一组过滤器是 7 x 7 x 3 的曲线检测器。如下图所示:
在这里插入图片描述
在具体的图像中使用这个过滤器:如下图所示:
在这里插入图片描述
上图,当它移动到上面的位置时,按照矩阵操作,将这个区域的图像像素值与滤波器相乘,我们得到一个很大的值(6600)
简单来说,如果输入图像上某个形状看起来很像过滤器表示的曲线,那么所有点积加在一起将会得出一个很大的值,如果继续移动过滤器,会出现下图:
在这里插入图片描述
这个值小了很多。这是因为图像的这一部分和曲线检测器过滤器不存在对应。

回答:但是过滤器是什么?

也就是说过滤器就是一个特征的检测,图片某个位置有这个特征,经过过滤器输出的这个值就会很大,如果没有这个特征,经过过滤器这个值就会很下甚至为0。
在这里插入图片描述
如上图:**每个过滤器是学习一个特征,但是我们无法判断哪个过滤器学习哪个特征,这些特征可能也很抽象无法一一说出。**很明显上图这个过滤器是一个学习高级特征的过滤器,不是简单的学习曲线的。

回答:得到的新的特征图又是什么?

新的图像会把这个卷积核所体现的特征突出显示出来。
如此,我们对整个原图进行一次卷积,得到的结果中,在那个特定曲线和周边区域,值就很高在其他区域,值相对低。这就是一张激活图。对应的高值区域就是我们所要检测曲线的位置。该卷积层输出的是一个激活映射,因此,在这个带有一个过滤器卷积的例子里(当筛选值为曲线检测器),激活映射将会显示出图像里最像曲线的区域。
在该例子中,28 x 28 x 1 的激活映射的左上角的值为 6600。高数值意味着很有可能是输入内容中的曲线激活了过滤器。激活地图右上角的值将会是 0,因为输入内容中没有任何东西能激活过滤器(更简单地说,原始图片中的这一区域没有任何曲线)。这仅仅是一组检测右弯曲线的过滤器。还有其它检测左弯曲线或直线边缘的过滤器。过滤器越多,激活映射的深度越大,我们对输入内容的了解也就越多。

—————————————————————————————————————————————————

非线性层:

如果用线性的激励函数,其实输出就是输入乘上一个大的矩阵,就没有体现出隐层的作用。输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
非线性变换是深度学习有效的原因之一,激活函数可以引入非线性因素。现实中很多问题是不能用线性解决的,所以要用非线性方程来将问题转化成更方便的解决方案。
激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
—————————————————————————————————————————————————

池化层:

目的:

  1. 权重参数的数目减少到了75%(在池化层是2x2的前提下),因此降低了计算成本。
  2. 控制过拟合。(原有数据保留太完整,当然很有可能造成过拟合)
  3. 池化操作可以看做是一种强制性的模糊策略。当然和之前的卷积一样,池化也是层层递进的,底层的池化是在模糊底层特征,如线条等,高层的池化模糊了高级语义特征,如猫耳朵。所以,一般的CNN架构都是三明治一样,卷积池化交替出现,保证提取特征的同时也强制模糊增加特征的旋转不变性。

池化是一种过滤细节的方法:常见的池化技术是最大池化,我们采用2 x 2像素,并传递具有最大量特定属性的像素。

补充:
 pooling池化的作用则体现在降采样:保留显著特征、降低特征维度,增大kernel的感受野。另外一点值得注意:pooling也可以提供一些旋转不变性。

池化层可对提取到的特征信息进行降维,一方面使特征图变小,简化网络计算复杂度并在一定程度上避免过拟合的出现;一方面进行特征压缩,提取主要特征。
  最大池采样在计算机视觉中的价值体现在两个方面:(1)、它减小了来自上层隐藏层的计算复杂度;(2)、这些池化单元具有平移不变性,即使图像有小的位移,提取到的特征依然会保持不变。由于增强了对位移的鲁棒性,这样可以忽略目标的倾斜、旋转之类的相对位置的变化,以此提高精度,最大池采样方法是一个高效的降低数据维度的采样方法。
  需要注意的是:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。

—————————————————————————————————————————————————

全连接层:

全连接层是怎么做到分类的?

因为卷积层的作用只是提取特征,但是很多物体可能都有同一类特征,比如猫、狗、鸟都有眼睛。如果只用局部特征的话不足与确定具体类别。这时就需要使用组合特征来判别了。全连接就是组合这些特征来最终确定是哪一个分类,所以全连接就是组合特征和分类器功能。

卷积之后得到feature map 这些特征向量是简单的数字,实际上并不能可视化为是什么特征,也就是并不能具体说明是描述的是什么特征,通过与权重矩阵相乘,可以把这些特征拟合到一起,输出具体的特征值,值越大说明特征越明显,也就是说输入的图片经过一系列变化后的这些数值的组合更能体现这一个类别。

全连接的输入是一系列高度抽象后的feature map,全连接就是这些特征进行投票,1,2,3特征更像是猫的特征,2,4,5更像是狗的特征,等等。然后得到一列特征值,特征值越大说明这个特征越明显。再经过softmax这样就能得到每个类别的概率。

FC把feature map的值通过权重矩阵进行了组合,(也就是将特征组合在一起),组合成了很多个新的特征值,(新的特征),再经过一个FC最终把这些大的新的特征值再组合输出为各类的特征值。

其实我们也不知道,网络是怎么根据这些值来判定是哪一类的,这是网络根据我们不了解的特征来组合并判断是哪一类。这些数值我们无法具体的可视化,如果非要强行可视化,我们可以看下面这个图:全连接层把一个个小特征组合成大的特征,大的特征在去组合进行分类。
在这里插入图片描述
在这里插入图片描述
分析上图:看完了感受野,发现这里还有补充。最后一层的feature map是2X2的实际上这四个元素中的每一个元素,都是输入图片中的一个很大的一部分的感受野。比如AlexNet的最后一层感受野是195X195意味着最后一层中的一个元素,对应着的实际上是原图195X195的那么大区域,可能就已经是一个嘴的区域了~filter1 学习的是嘴的特征,那么最后一层的feature map1的四个元素中,每个元素对应原图的195X195区域,如果某个195x195区域有嘴,那么这个区域所对应的元素就会很大,没有嘴的话,元素就会几乎为0.所以在全连接层的时候我们直接把元素展开就好了,每个元素都对应着原图的某个区域。全连接层会知道你哪个过滤器学习的什么哪个特征,哪个特征属于哪一类。比如说最后一层第一个过滤器是学习嘴的,那么这个输出的feature map在连接猫,狗等类别时的权重就会大一些,在连接水杯等类别时的权重就会小一些。
总之,输入图片有这个特征,输出的特征值就会很大,连接的那个类别就会输出的特征值就会很大。

VGG16:
特征图的宽高从512后开始进入全连接层,因为全连接层相比卷积层更考虑全局信息,将原本有局部信息的特征图(既有width,height还有channel)全部映射到4096维度。也就是说全连接层前是7x7x512维度的特征图,估算大概是25000,这个全连接过程要将25000映射到4096,大概是5000,换句话说全连接要将信息压缩到原来的五分之一。VGGNet有三个全连接,【我】的理解是作者认为这个映射过程的学习要慢点来,太快不易于捕捉特征映射来去之间的细微变化,让backprop学的更慢更细一些(更逐渐)。

换句话说,维度在最后一个卷积后达到7x7x512,即大概25000,紧接着压缩到4096维,可能是作者认为这个过程太急,又接一个fc4096作为缓冲,同时两个fc4096后的relu又接dropout0.5去过渡这个过程,因为最后即将给1k-way softmax,所以又接了一个fc1000去降低softmax的学习压力。

为什么两层以上全连接层?

泰勒公式都知道吧,意思就是用多项式函数去拟合光滑函数。我们这里的全连接层中一层的一个神经元就可以看成一个多项式,我们用许多神经元去拟合数据分布,但是只用一层fully connected layer 有时候没法解决非线性问题,而如果有两层或以上fully connected layer就可以很好地解决非线性问题了。

总而言之:个人理解
在计算机眼中:FC层就是把前面的feature map中的特征值通过权重矩阵组合起来,整合为一个值,如果这个值大,说明符合我们要找的特征,和位置无关,最终输出每个分类的特征值,更为相似的类别的输出特征值就会大一些,不相似的输出特征值就会小一些。输入图片有某个特征,输出的特征值就会很大,有这个特征的那个类别就会输出的特征值就会很大,没有这个特征的类别输出的特征值就会很小。至于计算机是学习的什么特征,这就很抽象了,我们也不知道具体根据什么特征(抽象无法用语言描述)判断。
如果非要可视化理解,就是在我们眼中,是一个个学习类似眼睛、耳朵、嘴巴等的过滤器,滑过图片,在有这个特征的地方输出大的特征,没有的地方输出小的特征值,小特征组合为头,然后头等稍微大的特征再组合为猫,使得猫的特征值就会大一些,输出概率就会大一些。也就是把局部特征组合在一起,组合成哪一类,哪一类的特征值就大,也就判断为哪一类了。

说实在的我们根本不知道CNN的每个卷积核具体学习了什么特征,我们只知道网络越深,效果越好。然后认为可以解释成,低层学习低级特征,比如曲线,比如直线,然后学习稍微高级特征,比如圆等,最后学习高级语义特征,比如眼睛比如嘴巴等但是实际上,CNN内部到底学习了什么特征,只是不可解释的。

参考:
https://blog.csdn.net/DL_CreepingBird/article/details/78574133
https://www.zhihu.com/question/41037974
https://blog.csdn.net/bobo_jiang/article/details/79370743
https://blog.csdn.net/weixin_42137700/article/details/81806455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值