人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
CNN 的演化路径可以总结为以下几个方向:
3,Inception V2卷积分解,两个3x3代替5x5,即在保持感受野范围的同时又减少了参数量
4,Inception V1多尺度融合
将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的深度,另一方面也增加了网络对尺度的适应性。
问题解析
开运算:先腐蚀运算,再膨胀运算,把细微连在一起的两块目标分开了,开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不变。
闭运算:先膨胀运算,再腐蚀运算,将两个细微连接的图块封闭在一起,闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
开运算先腐蚀后膨胀,去除了小的黑点,方块边缘变得圆润了,也就是开运算对图像轮廓进行平滑,而闭运算先膨胀后腐蚀,把中心比较大的块连接为一个整体,填补了空白的缝隙。
开运算能够除去孤立的小点,毛刺和小桥,而物体的形状轮廓基本不变。
闭运算与开运算相反,能够填平前景物体内的小裂缝、间断和小孔,而总的位置和形状不变。
结构元素大小的不同将导致滤波效果的不同,不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
问题解析
以 CIFAR-10 数据集举例,一个典型的该数据集上的卷积神经网络分类器应该有[INPUT - CONV - RELU - POOL - FC]的结构,具体说来是这样的:
这样,卷积神经网络作为一个中间的通道,就一步步把原始的图像数据转成最后的类别得分了。有一个点要提一下,刚才说到了有几种不同的神经网络层,其中有一些层是有待训练参数的,另外一些没有。详细一点说,卷积层和全连接层包含权重和偏移的;而 RELU 和 POOLing 层只是一个固定的函数运算,是不包含权重和偏移参数的。不过 POOLing 层包含了我们手动指定的超参数,这个我们之后会提到。
在卷积神经网络中,有 3 种最主要的层:
一个完整的神经网络就是由这三种层叠加组成的。
(1)一个卷积神经网络由多种不同类型的层(卷积层/全连接层/RELU 层/POOLing 层等) 叠加而成。
(2)每一层的输入结构是 3 维的数据,计算完输出依旧是 3 维的数据。
(3)卷积层和全连接层包含训练参数,RELU 和 POOLing 层不包含。
(4)卷积层,全连接层和 POOLing 层包含超参数,RELU 层没有。
传统的基于 CNN 的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为 CNN 的输入,用于训练与预测,这种方法主要有几个缺点:
1)存储开销大,例如,对每个像素使用 15*15 的图像块,然后不断滑动窗口,将图像块输入到 CNN 中进行类别判断,因此,需要的存储空间随滑动窗口的次数和大小急剧上升;
2)效率低下,相邻像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算有很大程度上的重复;
3)像素块的大小限制了感受区域的大小,通常像素块的大小比整幅图像的大小小很多,只能提取一些局部特征,从而导致分类性能受到限制。
而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。
(3)像素块大小的限制了感知区域的大小。
传统的基于 CNN 的分割方法的缺点?
又名带洞的(atrous)卷积,扩张的卷积引入了另一个被称为扩张率(dilation rate)的卷积层。这定义了卷积核中值之间的间隔。一个 3×3 卷积核的扩张率为 2,它的视图与 5×5 卷积核相同,而只使用 9 个参数。想象一下,取一个 5×5 卷积核,每两行或两列删除一行或一列。
空洞卷积将以同样的计算代价提供更广阔的视角,扩张的卷积在实时分割领域特别受欢迎。如果需要广泛的视图,并且不能负担多个卷积或更大的卷积核,那么可以使用它们。
空间金字塔池化的思想来自于 Spatial Pyramid Model,它一个 pooling 变成了多个 scale 的 pooling。用不同大小池化窗口作用于卷积特征,得到1X1,2X2,4X4 的池化结果,由于 conv5 中共有 256 个过滤器,所以得到 1 个 256 维的特征,4 个 256 个特征,以及 16 个 256维的特征,然后把这 21 个 256 维特征链接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征。
对于不同的图像要得到相同大小的 pooling 结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设 conv5 输出的大小为 a*a,需要得到 n*n 大小的池化结果,可以让窗口大小 sizeX 为 |a/n|,步长[a/n]。下图以 conv5 输出的大小为 13*13 为例。
如果 conv5 输 出 的 大小 为 14*14 , [pool1*1]的 sizeX=stride=14 , [pool2*2]的sizeX=stride=7,注意,[pool4*4]的 sizeX=5,stride=4,最后一列和最后一行特征没有被池化操作计算在内。
一般的 CNN 都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把 CNN 扩展到任意大小的图像。SPP 其实就是一种多个 scale 的 pooling,可以获取图像中的多尺度信息;在 CNN 中加入SPP 后,可以让 CNN 处理任意大小的输入,这让模型变得更加的 flexible。
问题拓展
空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让 CNN处理任意尺度的图像,还能避免 cropping 和 warping 操作,导致一些信息的丢失,具有非常重要的意义。
根据上图,我们来做个对比计算,假设输入 feature map 的维度为 256 维,要求输出维度也是 256 维。有以下两种操作:
(1)256 维的输入直接经过一个 3×3×256 的卷积层,输出一个 256 维的 feature map,那么参数量为:256×3×3×256 = 589,824
(2)256 维的输入先经过一个 1×1×64 的卷积层,再经过一个 3×3×64 的卷积层,最后经过一个 1×1×256 的卷积层,输出 256 维,参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九分之一!
1×1 卷积核也被认为是影响深远的操作,往后大型的网络为了降低参数量都会应用上 1×1 卷积核。
1×1 的卷积有两个方面的作用:
1. 实现跨通道的交互和信息整合。
2. 进行卷积核通道数的降维和升维。
下图是加入 1×1 卷积核的 Inception 结构:
补零法(zero-padding):所有落在矩阵范围之外的元素值都默认为0。这样就可以对输入矩阵的每一个元素做滤波了,输出一个同样大小或是更大的矩阵。
补零法又被称为是宽卷积,不使用补零的方法则被称为窄卷积。
在tensorflow的实现中,conv2d的padding=‘SAME',默认的就是宽卷积的方式,会进行补零。padding = ’VALID'就是窄卷积的方式。
通常 CNN 网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map) 映射成一个固定长度的特征向量。以 AlexNet 为代表的经典 CNN 结构适合于图像级的分类和回归任务,因为它们最后都得到整个输入图像的一个概率向量,比如 AlexNet 的 ImageNet 模型输出一个 1000 维的向量表示输入图像属于每一类的概率(softmax 归一化)。
如图所示:
(1)在 CNN 中, 猫的图片输入到 AlexNet, 得到一个长为 1000 的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。
(2)FCN 与 CNN 的区别在于把于 CNN 最后的全连接层转换成卷积层,输出的是一张已经 Label 好的图片, 而这个图片就可以做语义分割
(3)CNN 的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征 较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。高层的抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高, 所以我们常常可以将卷积层看作是特征提取器。
FCN 对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation) 问题。与经典的 CNN 在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax 输出)不同,FCN 可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的 feature map 进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
下图是语义分割所采用的全卷积网络(FCN)的结构示意图:
1、learning-rate 学习速率:学习速率越小,模型收敛花费的时间就越长,但是可以提高模 型精确度。一般初始设置为 0.1,然后每次除以 2 或者 5 来改进,得到最终值;
2、batch-size 样本批次容量:影响模型的优化程度和收敛速度,需要参考你的数据集大小来设置,具体问题具体分析;
3、weight-decay 权重衰减:用来在反向传播中更新权重和偏置,一般设置为 0.005;
4、epoch-number 训练次数:包括所有训练样本的一个正向传递和一个反向传递,训练至 模型收敛即可;(注:和迭代周期 iteration 不一样)而且,也不是训练的次数越多,测试精度就会越高,可能会因为预训练的模型太复杂,而数据集样本数量太少,种类太单一,而出现过拟合
一般来说,调参经验及提高泛化能力的方法主要有以下几个:
下图是一个很经典的图示,左边是全连接,右边是局部连接
对于一个 1000 × 1000 的输入图像而言,如果下一个隐藏层的神经元数目为 10^6 个,采用全连接则有 1000 × 1000 × 10^6 = 10^12 个权值参数,如此数目巨大的参数几乎难以训练;
而采用局部连接,隐藏层的每个神经元仅与图像中 10 × 10 的局部图像相连接,那么此时的权值参数数量为 10 × 10 × 10^6 = 10^8,将直接减少 4 个数量级。
局部连接使网络可以提取数据的局部特征且参数量更少:
首先明白一个概念——感受野,即每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野 (receptive field)。
在图像卷积操作中,即神经元在空间维度是局部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。
权重共享:计算同一个深度切片的神经元时采用的滤波器是共享的。如下图中计算o[:,:,0] 的每个神经元的滤波器均相同都为W0,这样可以很大程度上减少参数
具体做法是,在局部连接中隐藏层的每个特征图连接的是一个 10 × 10 的卷积核,因此有 10 × 10 个权值参数,将这 10 × 10 个权值参数共享给剩下的特征图,也就是说此时不管隐藏层神经元的数目是多少,需要训练的参数就是这 10 × 10 个权值参数(也就是卷积核(也称滤波器)的大小),如下图.
共享权重在一定程度上是有意义的,例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的,比如输入的图片是人脸,眼睛和头发位于不同的位置,希望在不同的位置学到不同的特征。注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。另外,偏重对同一深度切片的所有神经元都是共享的并且权值共享大大降低了网络的训练难度,减少了参数量。
上述仅提取了图像的一种特征,如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像的不同映射下的特征,称之为 Feature Map。如果有 100 个卷积核,最终的权值参数也仅为 100 × 100 = 10^4 个而已。另外,偏置参数也是共享的,同一种滤波器共享一个。
以上图为例,图像都是 152×152 的图像,输入到上述网络结构中,该结构的
参数如下:
Conv:32 个 11×11×3 的卷积核 max-pooling: 3×3, stride=2Conv: 16 个 9×9 的卷积核。
Local-Conv: 16 个 9×9 的卷积核,Local 的意思是卷积核的参数不共享。
Local-Conv: 16 个 7×7 的卷积核,参数不共享 Local-Conv: 16 个 5×5 的卷积核,参数不共享 Fully-connected: 4096 维 Softmax: 4030 维。
前三层的目的在于提取低层次的特征,比如简单的边和纹理。其中 Max-pooling 层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的 Max-pooling 层,因为太多的 Max-pooling 层会使得网络损失图像信息。
全连接层将上一层的每个单元和本层的所有单元相连,用来捕捉人脸图像不同位置的特征之间的相关性。其中,第 7 层(4096-d)被用来表示人脸。全连接层的输出可以用于 Softmax 的输入,Softmax 层用于分类。
本案例后面三层都是使用参数不共享的卷积核,之所以使用参数不共享是因为:对齐的人脸图片中,不同的区域会有不同的统计特征,卷积的局部稳定性假设并不存在, 所以使用相同的卷积核会导致信息的丢失
问题拓展
(1)不共享的卷积核并不增加抽取特征时的计算量,而会增加训练时的计算量
(2)使用不共享的卷积核,需要训练的参数量大大增加,因而需要很大的数据量,然而这个条件在某些人脸项目中刚好满足。
介绍棋盘现象:https://distill.pub/2016/deconv-checkerboard/
现在,生成图像时,神经网络通常使用多层反卷积,从一系列较低分辨率的描述中迭代建立更大的图像。直观地看,假设生成的图像中包含 1 只黑猫。黑猫身体部分的像素颜色应平滑过渡,或极端地说,该部分应全为黑色。实际生成的图像中该部分却有深深浅浅的近黑方块组成,很像棋盘的网格,即棋盘效应。
图像生成网络的上采样部分通常用反卷积网络,不合理的卷积核大小和步长会使反卷积操作产生棋盘效应 (checkerboard artifacts)。
问题产生:kernel size无法被stride整除,stride为1,kernel size为3,这导致了重复上采样绘图的部分不均匀(下图深色部分)
Stride=2,size=5
重叠图案也在二维中形成,两个轴上的不均匀重叠相乘,产生不同亮度的棋盘状图案。 事实上,不均匀重叠往往在二维上更极端!因为两个模式相乘,所以它的不均匀性是原来的平方。
图像生成网络的上采样部分通常用反卷积网络,不合理的卷积核大小和步长会使反卷积操作产生棋盘效应 (checkerboard artifacts)。
https://distill.pub/2016/deconv-checkerboard/
缩放卷积为线性操作:假设原图像为 A,经过插值后的图像为 A+B;用卷积核 C 对插值缩放后的图像卷积,得到最终的图像,
其中*为卷积操作。则可将缩放卷积分解为原图像卷积和插值增量图像卷积。
C 为卷积操作的卷积核。此时为上采样,理解为反卷积操作中的卷积核。
第一种方法是用到的反卷积核的大小可被步长整除,从而避免重叠效应。
https://www.cnblogs.com/hellcat/p/9707204.htm