1 边缘检测( edage detection )
下图是垂直边缘检测的例子,实际上就是用一个卷积核进行卷积的过程。
这个例子告诉我们,卷积可以完成垂直方向的边缘检测。同理卷积也可以完成水平方向的边缘检测,还可以完成各种不同角度的边缘检测。
计算机视觉的研究者会用几种不同的卷积核来做边缘检测。
但是在深度学习时代,我们不需要使用那些卷积核,我们把卷积核的数字设置成参数,通过训练来学习到不同的卷积核, 以此对图像进行处理,抽取相应的特征。
2 padding和步长( padding, stride )
如果采用上述的方法进行卷积,那么图像会缩小,而且原图的边缘信息在卷积中的参与度比较少,我们可以使用padding来解决这个问题,即在外围填充像素,比如填充0。
padding的参数p,表示在外围填充了几层。填充了p层,则原图像的高和宽都会增加2*p,因为会在两边填充所以是2*p。
一个n*n的图像,padding为p,在f*f的卷积核的卷积下,卷积后的图像为 ( n + 2p - f + 1) * ( n + 2p - f + 1 )。
valid convolution:没有padding的卷积。
same convolutioin:设定了padding使得卷积后图像大小不变的卷积,即 n = n+2p-f+1,那么p = ( f - 1 ) / 2,所以为了保证p为整数,一般f都为奇数。
stride决定了卷积核每次移动的步长,假定步长参数为s,每次移动s步。
一个n*n的图像,f*f的卷积核,padding为p,stride为s,卷积后的图像size为 ( n + 2p - f ) / s + 1,为了防止小数,应该向下取整$left lfloor ( n + 2p - f ) / s + 1 ight floor$,表示卷积核在某个方向上无法继续移动。
3 三维卷积( Convolutions over volumes )
考虑到图像的3通道,这个时候的卷积核也应该是3通道的,卷积运算的时候把3个通道的结果加起来作为结果,剩下的就和之前的卷积没什么差别。
再考虑多个卷积核的情况,用#filter表示卷积核个数,则卷积后的图像可以看成#filter层的图像,每一层是单个卷积核卷积后的结果,单个卷积核的通道是3。
用nc表示通道数,用nc' 表示卷积核的数目,那么原始图片是n * n * nc,卷积核是f * f * nc,则卷积后的图片为 (n - f + 1) * ( n - f + 1) * nc'。这里默认p为0,s为1,如果不是则参考之前的计算公式$left lfloor ( n + 2p - f ) / s + 1 ight floor$。
4 卷积网络( convolutional network )
在神经网络中,在对原图像卷积后我们还要做一些运算,卷积可以看成wx的运算,我们还要加上偏置b,以及激活的运算。
先考虑单层卷积网络,如下图所示,输入图像为6*6*3的矩阵。
用第1个卷积核对输入矩阵卷积,用卷积得到的矩阵加上一个偏置b1(python会将它广播成shape为4*4的矩阵),用relu激活,得到一个4*4的矩阵。
用第2个卷积核对输入矩阵卷积,用卷积得到的矩阵加上一个偏置b2,用relu激活,得到另一个4*4的矩阵。
把这个两个矩阵堆叠起来,形成4*4*2的矩阵,作为单元的输出。
卷积核的大小3*3*3,加上1个偏置,等于28,然后乘以卷积核的个数2,就是56,这就是该卷积层的参数个数。
不管你的图有多大,需要的参数个数都是一样的,这是卷积神经网络的一个特点,可以防止过拟合。
做下符号约定,$f^{[l]}$表示l层的卷积核大小(边长),$p^{[l]}$表示l层的padding,$s^{[l]}$表示l层的stride,$nc^{[l]}$表示l层的卷积核个数。
5 池化层( Pooling layers )
最大池化就是把矩阵分成几块,比如4*4就分成4个2*2的块,每个块取最大的值作为该块的值,形成一个2*2的矩阵。
这里参数f为2,表示2*2,参数s为2,表示移动2格。有点类似卷积的操作,只是用最大化代替了卷积运算。
可以把4*4看成某些特征的集合,数字大意味着可能提取了某个特定特征,比如左上象限存在的这个特征9,可能是一个猫的眼睛,而右上象限就没有这个特征。
最大化的实际作用就是,只要在任何一个象限提取到了某个特征,它就会被保留在最大池化的输出里。
如果在过滤器中提取到某个特征,那么保留了一个较大的数字,如果没有提取到这个特征,可能在右上象限不存在这个特征,那么其中的最大值也还是很小。
池化从二维推到三维就只是简单地叠加一层层的矩阵,每层还是按二维的池化那样做,没什么变化,输入是几通道,输出就是几通道。
平均池化和最大池化类似,就是最大化操作变成了取平均操作,目前来说,最大池化比平均池化更常用。
你可以根据自己意愿添加padding参数,只不过,最大池化中很少用padding。
6 卷积神经网络的示例( Convolutional neural network example )
一个典型的卷积神经网络就是(卷积1,池化1,卷积2,池化2,..,压平,全连接)。
可以直接把卷积和池化看成一类卷积操作,那整个过程其实就是进行多次的卷积,压平,然后接1层或几层全连接,最后接输出层。
这是典型的卷积神经网络结构,里面有很多超参数,常规做法是,尽量不要自己设置超参数,而是查看文献,选一个在别人任务中效果很好的架构。
如下图所示,可以看到图像的大小会越来越小,但是通道会越来越大。
7 为什么要卷积( Why convolutions)
卷积有两个重要的性质,一个是权值共享,一个是稀疏连接。正是因为这两个性质,卷积减少了很多参数,防止了过拟合。
权值共享很好理解,对于图像的每一部分都使用卷积核,卷积核就是共享的权值。卷积核在图像的一部分发挥了作用,那么在其它部分也能发挥作用。
稀疏连接就是每一层的输出只依赖于部分的输入,就是卷积的时候,一个输出是由图像的一部分卷积而来的。相比于全连接层,它减少了很多连接。