1.什么是CNN,CNN是怎么来的?
卷积神经网络(Convolutional Neural Networks
:以下简称CNN,在图像分类的为题上具备较好的性能,图像分类最主要的问题在于特征选择上。那么相较与传统的分类算法(如SVM
),CNN在图像分类上有哪些亮点呢?
举个例子来说明:如果我们用神经网络直接对猫狗进行分类呢?这样不就避开了特征提取这一步了吗?假设输入图片大小为30*30,那么设置900个输入神经元,隐含层设置1000个神经元,输出神经元个数对应需要的输出数量不久好了吗?甚至用SVM也可以这样做,把一张30×30的图看作900维空间中的一个点,代表猫的点和代表狗的点在这个900维的空间中必然是相聚于两个簇,然后我们就又可以使用SVM来划出分界线了。
但是这样计算开销就太大了,对于30×30的图片我们也许可以这样做,对于1000×1000的图片我们这样做的话就需要至少一百万个隐层神经元,这样我们就至少要更新10^12个参数。而SVM的话,则相当于在一百万维的空间中运行了。可想而知,运算量会是如何的巨大。另外,图片中并不是所有的信息都和是我们需要的。背景对我们的分类毫无价值,然而我们将一张图片的所有内容都作为输入时,也会加入不确定性因素,准确度自然会有所下降。
但是我们的CNN是一个可以自动提取特征,而且待训练参数相对不那么多的神经网络,这就是CNN在图像分类任务中的决定性优势。
2.边缘检测(Edge detection)
边缘检测,说起来是挺高大上的,但是实际的操作起来还是非常简单的。卷积计算并不复杂,矩阵对应元素相乘的和就是卷积的结果,卷积就是提取过程呀。那么我们可以尝试计算一下过程:
以吴恩达老师讲课的内容为例,我们来推导一遍计算的过程
在计算之前,我们先去查看一张动态图片,可以更加直观的理解我们的卷积的计算方式:
一下子就明白了对吧,我们的过滤器filter
就是那连接两个图像的四根线(比较抽象,嘿嘿),接下来计算的时候就会更加的明白啦:
先给出吴恩达老师那个最终结果的计算图,也就是我们需要填空的内容:
首先我们需要计算第一个位置(此处没有padding
,关于padding
的内容见后面),前面已经说了,就是计算对应元素位置的乘积:
1*3+1*1+2*1+0*0+0*5+0*7+(1+8+2)*(-1)=-5
即绿颜色方框中额内容应该填的是-5
接下来就是开始填第二个方框了,别想得很困难,其实也是很easy
的,将我们的filter
向右平移一个单位,按照上面的计算方式,就得到第二方框中的内容:
(0+5+7)*1+(1+8+2)*0+(2+9+5)*(-1)=-4
接下来的内容就不再继续计算下去了,照葫芦画瓢,你可以的…
好啦,边缘检测简单吧,自己也可以尝试着去计算一下啦。
那么就有个小问题啦?我们在计算卷积的filter
矩阵是怎么来的呢?额,这些都是科学家们进行激烈的讨(si
)论(bi
)得出来的,我们也就不讨论它是怎么来的了,直接使用就好啦。另外两种常见的过滤器是
[ 1 0 −1
2 0 −2
1 0 −1],
叫做Sobel 的过滤器,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。
但计算机视觉的研究者们也会经常使用其他的数字组合,比如这种:
[3 0 −3
10 0 −10
3 0 −3],
这叫做 Scharr 过滤器,它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果
你将其翻转 90 度,你就能得到对应水平边缘检测。
3.padding,卷积步长(strided convolutions
)
3.1. padding
还记得上面那个动图么?为啥旁边多画了一圈白色的框框呢?这个是什么东东呀?对,这就是我们的padding啦,简单的来说就是往图像四周进行填充。那么padding操作有什么用呢?仔细观察上面你的图像,你会发现每次进行操作时,都会存在两个特点
1.第一个缺点是每次做卷积操作,你的图像就会缩小,从 6×6 缩小到 4×4
2.在计算卷积的时候,我们会发现中间的点计算的使用的次数多,而边缘的使用计算次数少。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。
好了,为了解决上面两个问题,我们的padding
出现啦。
padding
填充的方式主要有两种:分别叫做 Valid
卷积和Same
卷积
对于Valid
卷积:很简单,我直接就是不填充任何东西;
对于Same
卷积:意味你填充后,你的输出大小和输入大小是一样的。
3.2 strided convolutions
这个内容的操作说起来就是一句话,还是以计算输出的内容为例:你每次计算出一个内容(绿色方框)后,需要计算下一个方框的内容时,filter
在原图形中需要移动的距离,好吧,还是以吴恩达老师的一个图形解释:
第一次每次只是移动一个距离,而这次操作每次是移动两个距离,输出的图形更小。
3.3 输出图形大小计算
n是原本图形的尺寸,f是我们过滤器的尺寸,padding为p,步长为s,那么输出的图形的大小即为上面的表达式。
权重共享来降低参数量、稀疏化来降低参数量
为了获得平移不变性,使用了权重共享技术,该技术进一步降低了待训练参数数量。
使用卷积层是因为卷积层本质上是在自动提取图片的特征,而且在提取特征的同时,极大的降低了网络总体待训参数的总量。这两个特性使得CNN克服了特征提取困难,待训参数庞大的问题,成功制霸图片分类问题。
5.池化层(降维)
为什么需要池化层,池化层有什么作用呢?
我能想到的唯一的原因是要压缩矩阵,这样可以在模型中多加几层卷积层,用来提取更高维,更复杂的特征。而从压缩的角度上来看,这一步可谓简单有效
最大池化
操作步骤一下子就说完了,这就是最大池化,就是取某一个框框内的最大值。同理,平均池化就是取一个框框内的平均值,那么这么简单的操作对神经网络到底有什么作用呢
pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling三种。
(1)mean-pooling,即对邻域内特征点只求平均,
(2)max-pooling,即对邻域内特征点取最大。
根据相关理论,特征提取的误差主要来自两个方面:
(1)邻域大小受限造成的估计值方差增大;
(2)卷积层参数误差造成估计均值的偏移。
一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。
注意:池化的超级参数包括过滤器大小?和步幅?,常用的参数值为? = 2,? = 2,应用频率非常高,其效果相当于高度和宽度缩减一半。
###6.全连接层
一般的参数学习的都是需要学习全连接层的参数,全连接层就是一个基础的神经网络。在经过几次卷积和池化的操作之后,卷积神经网络的最后一步是全连接层。这一步就和最最普通的神经网络没有什么区别。我认为这里的神经网络就是充当一个分类器的作用,输入是不同特征的特征值,输出是分类。
7.Reference
(1)吴恩达深度学习课程视频