【前馈神经网络】
前馈神经网络也叫做全连接网络。
缺点:
- 在图像识别中会将多维向量平铺成一维向量,会丢失像素点之间的距离关系。
- 无法将局部的权重应用到其他位置,带来的后果就是,如果在一个图像的右上角有一只猫,可以正确分类;当这只猫出现在左下角时,无法正确识别。(没有平移不变性)
【卷积神经网络】
卷积神经网络就是让权值在不同位置共享的神经网络。(卷积神经网络解决了前馈神经网络的什么问题?)
- 局部连接
- 空间共享
【局部连接】
如上图就是卷积运算,可以表示如下(两种不同的表达方式):
这是单通道、单卷积核下的计算方式。
- 每一次卷积运算,其实就是一次局部区域的线性组合,加上一个偏置后,得到下一层网络的一个神经元的输出。
【空间共享】
- 当卷积核扫到其他位置计算输出节点时,比如y1,w1,w2,w3,w4 和b 0 是共用的。
- 要注意这里的空间共享是指的在高和宽方向上的共享,在通道数上并不共享。
- 空间共享也就是卷积神经网络所引入的先验知识。
【输出表达】
在前面说,前馈神经网络时说到,如果将图片向量表示,就失去了平面结构信息,因此在输出时,卷积神经网络依然保留了矩阵的排列方式。如下图:
其实,经过一个卷积计算后得到一个神经元,比如上面蓝色的0,这个神经元叫做“Convolved Feature”或“Activation Map”或“Feature Map”
【通道维的处理】
- 前面所说的通道都是1,也就是灰度图。其实,在应用中大多数是彩色图。也就是有RGB三个颜色通道。
问题:
卷积核的尺寸如果是2 x 2,那么一个2表示的高维度上的局部连接数,另一个2表示的宽维度上的局部连接数。在通道维上的局部连接数并没有给出表示。
解答: 在通道维上并不是局部连接,是全部连接,因此不需要指定。
注意:
假如有三个通道,那么在进行卷积运算时,会有三个完全独立的kernel,也就是卷积核都是独立的,分别在三个不同的通道进行计算,然后将计算后的结果进行加和,然后加上偏置项,得到最终的输出。
下面是计算的两种表达:
- 这样每个卷积核都在width维度、height维度上以局部连接和空间共享,并贯穿整个depth维度的方式得到一个Feature Map。
【padding】
大多时候是使用的zero-padding。也就是在输入数据的每个通道一周用0填充。如下图:
- 这样做的好处就是可以控制输出的形状,比如,4 x 4的图片被2 x 2的卷积核运算后,输出形状就变成了3 x 3的图片了(假设步幅为1)。每次卷积后都会小一圈,如果想控制图片的形状不变,那么就可以使用填充。
- 另一个好处就是避免图片的边缘信息被一步步舍弃的问题。
尺寸计算:
输出尺寸 = (input_size + 2* padding_size - filter_size)/stride + 1
padding_size 表示的是单边补零的个数,比如,(4 + 2 * 1- 3 )/ 1 + 1 = 4
【卷积核抓取特征】
一个卷积核filter会抓取什么样的信息??
我们知道不同的形状都可由细小的“零件”组合而成。卷积的每个filter 可以探测特定的形状,又由于Feature Map保持了抓取后的空间结构。若将探测到细小图形的Feature Map作为新的输入再次卷积后,则可以由此探测到“更大”的形状概念(感受野在变大)。
图片被识别成什么不仅仅取决于图片本身,还取决于图片是如何被观察的。
而filter内的权重矩阵w是网络根据数据学习得到的,也就是说,我们让神经网络自己学习以什么样的方式去观察图片。
拿老妇与少女的那幅图片举例,当标签是少女时,卷积网络就会学习抓取可以成少女的形状、概念。 当标签是老妇时,卷积网络就会学习抓取可以成老妇的形状、概念。
【多个卷积核】
- 卷积核在很多地方也叫做滤波器,filter。
- 同一个图片,不同的滤波器得到的结果也是不一样的,比如对太阳光的折射,红色的镜片滤过之后是红光;绿色的镜片滤过之后是绿光。如下图也是同样的道理,不同的kernel,会探测到不同的概念。
- 每个filter可以抓取探测特定概念的存在,那么这样输入是一个长方体,输出也是一个长方体了,不同的filter不能够在像上面那种运算一样,全部贯穿到一个神经元上,而是层叠输出,如下图:
上面是输入,下面是输出。
【激活函数】
- 和前馈神经网络一样,卷积是局部线性组合和偏置的线性组合,经过非线性激活函数增强模型的拟合能力。
如下图,将卷积后的Feature Map经过ReLU变换后得到的输出就如下图。
【输出形状和参数个数】
现在知道了输入是一个长方体,也就是有width、height、depth,那么输出的长方体是由哪些因素决定的?
因素:
- filter个数:影响depth
- filter_size :影响width、height
- stride:影响width、height
- zero padding:影响width、height
【矩阵乘法执行卷积】
略
【pooling】
- 池化,一般卷积后会有激活,还会有一个池化。
- 池化有多种,Maxpooling、averagepooling等。
- pooling的操作比较简单,不要参数控制,也就是说池化层不会有新的参数被学习。
如下maxpooling
maxpooling的作用,先看下图的一个对比。
- maxpooling的主要功能是downsampling,下采样。但是这么做却不会损坏识别结果,这意味着卷积后的Feature Map中有对于识别物体不必要的冗余信息。
- 这样下采样的作用就是去除局部敏感性。只是保留区域内最大的像素点。
- maxpooling也有缺点,有些周边有用的信息会被丢弃掉。
【全连接层】
- 当有了足够多的特征了,就可以用这些特征进行图片的分类了。全连接层也叫做前馈层,就是可以用来将最后的输出映射到线性可分的空间。
- 通常卷积网络的最后会将末端得到的长方体平摊(flatten)成一个长长的向量,并送入全连接层配合输出层进行分类。
【结构变迁】
- LeNet:第一个成功的卷积神经网络。
- AlexNet:类似 LeNet,层次更深更大。使用了层叠的卷积来抓取特征(通常是一个卷积层马上一个 maxpooling 层)。
- ZF Net:增加了中间卷积层的尺寸,让第一层 stride 和 filter size 更小。
- VGG:只使用 filter size = 3 和 pooling size = 2 从头到尾堆叠。
- GoogLeNet:较少参数数量,最后一层用局部平均代替了全连接。
- ResNet:引入了跨层连接和 batch normalization
- DenseNet:将跨层连接从头进行到尾
【变迁的点】
- 使用small filter size的卷积层和pooling
- 去掉parameters过多的全连接层
- Inception的使用
- 跳层连接
【Inception】
下图是Inception的结构,尽管也有不同的版本,但是其动机都是一样的:消除尺寸对于识别结果的影响,一次性使用多个不同filter size来抓取多个范围不同的概念,并让网络自己选择需要的特征。
你也一定注意到了蓝色的1x1卷积,撇开它,先看左边的这个结构。
- 输入(可以是被卷积完的长方体输出作为该层的输入)进来后,通常我们可以选择直接使用像素信息(1x1卷积)传递到下一层,可以选择3x3卷积,可以选择5x5卷积,还可以选择max pooling的方式downsample刚被卷积后的feature maps。但在实际的网络设计中,究竟该如何选择需要大量的实验和经验的。
- Inception就不用我们来选择,而是将4个选项给神经网络,让网络自己去选择最合适的解决方案。
- 接下来我们再看右边的这个结构,多了很多蓝色的1x1卷积。
这些1x1卷积的作用是为了让网络根据需要能够更灵活的控制数据的depth的。
【特征结合方式:concatenate、sum】
- concatenate当需要用不同的维度去组合成新观念的时候更有益。
- sum则更适用于并存的判断 。
比如既有油头发,又有胖身躯,同时穿着常年不洗的牛仔裤,三个不同层面的概念并存时,该人会被判定为程序员的情况。又比如双向LSTM中正向和逆向序列抓取的结合常用相加的方式结合。在语音识别中,这表示既可以正向抓取某种特征,又可以反向抓取另一种特征。当两种特征同时存在时才会被识别成某个特定声音。
【1 x 1卷积核】
- 如果卷积的输入输出都是一个平面,那么 size = 1 的filter没有太大的作用,因为只是进行了一个线性变换,并且完全不考虑像素与周边其他像素的关系。
- 但是如果卷积的输出输入是长方体,所以1 x 1 卷积实际上是对每个像素点,在不同的channels上进行线性组合(信息整合),且保留了图片的原有平面结构。
- 根据卷积核的个数K可以控制depth,从而完成升维或者降维的功能。
如下图,3维降到2维;3维升到4维。
所以总结来说1 x 1卷积核的作用有两个:
- 不同channels上的像素点进行线性组合;
- 在不改变平面结构的情况下(shape不变),实现升维或者降维。
【跨层连接】
前馈深网络、卷积神经网络,都是一层层逐步变换,不允许跨层组合,但现实中是否有跨层组合的现象?
答案是肯定的。比如,在判断一个人是小明的时候,很多时候没有办法直接看到他的全部,或者给的图片信息本身就是残缺的。这时候我们会靠其他的组合信息来判断,比如身形、眼睛、穿着等。如下图所示:
残差网络就是拥有这样的结构。
- 其实,简单来说这就是将前面层次学到的东西在次与当前层学到的东西进行组合,如果不做跨层连接也是可以做到的,只不过花费的代价比较大。就是在每次传递到下一层都需要学习那个用于保持前一层图像概念的filter的权重。但是随着层数的加深,会越来越难以保存,加之maxpooling将冗余信息去除,会变得更加困难。
- 而跨层连接,就成为了一种合理的做法。直接将上一层学到的概念传递到下一层,不用让它每次都重新学习。就好比在编程时构建了不同规模的functions。每个function都保留,而不是重新再写一遍。提高了重用性。
【参考】
来源:CSDN
作者:Activewaste
链接:https://blog.csdn.net/qq_41375609/article/details/104423931