计算机视觉之卷积神经网络原理及如何实现

#必须要明白的地方:

一个图片做卷积,结果也可以理解为另一张图片,这里的卷积和数字信号处理中的卷积千差万别。在信号类教材中,做元素乘积求和之前将卷积核沿对角线翻转也就是卷起来(不是旋转),之后再进行乘积求和,但在计算机视觉中跳过了这个镜像操作,这样可以简化代码并使得神经网络正常工作,从技术上讲,这里实际做的是互相关而不是卷积,在深度学习文献中,按照惯例,这里叫做卷积操作。

!垂直检测核可以检测出垂直边缘,如果原始图像较小,检测出来的边缘较宽,但当图片较大时,可以很好的检测出来垂直边缘,水平同理。
计算机视觉之卷积神经网络原理及如何实现
!在深度学习的领域里,要检测复杂图形的边缘,不一定要去选择研究者们给出的九个数字(卷积模板),而是把这九个数字当成九个参数,并利用反向传播算法,去理解这九个参数,通过数据反馈,让神经网络自动的去学习它们,神经网络可以学习一些如边缘这样低级的特征,可以检测书任何角度的边缘。这就是卷积神经网络要干的事情

!Padding:n×n的图像、f×f的边缘检测卷积核卷积后可以得到(n-f+1)×(n-f+1)大小的图像,这有两个缺点:①每次做完卷积操作图像就会缩小,我们并不想让我们的图片特征缩小(比如100层网络,最后得到很小的特征无用)。②角落、边缘的像素在输出中采用较少,这意味着丢掉了图像边缘为位置的许多信息。解决办法:在卷积操作之前填充图像,习惯上可以用0去填充,如果p是填充外围像素的层数,输出图像大小也就变成了(n+2p-f+1)×(n+2p-f+1)。至于填充多少像素,通常有两个选择:Valid卷积和Same卷积,Valid卷积不填充像素,输出图像尺寸会减小;Same卷积意味着输入大小和输出大小是一样的。
注:在计算机视觉中f很多时候为奇数,这样计算一个像素点会很方便且填充的时候不会发生不对称填充。

!卷积步长:卷积核横向纵向移动的距离,计为s,输出图像尺寸变为:[(n+2p-f)/s]+1×[(n+2p-f)/s]+1 ,如果商不是一个整数,则向下取整

!三维卷积:不仅仅局限于灰度图像,也想检测RGB彩色的图像的特征,则要使用三维卷积核,这里的维数必须和图像的深度匹配(原因在后面)。我们把三位卷积核想象成为一个立方体,在原图像里做平移相乘相加操作,因此三维卷积后输出只有一个通道。如果只想检测一个通道的图像边缘,则可以将第一层核设为一个算子,后两层的核设为0,这样卷积核只会对红色通道有用,所以参数选择不同,就会得到不同的特征检测器。按照计算机视觉的惯例,卷积核的宽高可以和输入图像的宽高不同,但通道数必须一样,理论上我们只关注一个通道是可行的。
计算机视觉之卷积神经网络原理及如何实现
!如果要同时使用多个卷积核怎么办,也就是要检测各个方向的边缘:我们可以把不用的边缘检测卷积核卷积输出的图像堆叠在一起,因此总结以下:如果输入图像是n×n×a,卷积核设为f×f×a,则卷积输出的矩阵就是(n-f+1)×(n-f+1)×卷积核数量—这里步长为1且没有padding。所以输出的通道数等于要检测的特征数。

!如何构建卷积神经网络:不同卷积核和原图卷积后的输出会各自形成一个卷积神经网络层,通过python的广播机制给输出的矩阵每一个值增加相同的偏差,然后应用非线性**函数,每个卷积后的矩阵输出不同的同尺寸矩阵,再重复之前的步骤,把这些矩阵堆叠起来得到一层的输出。卷积核用变量W1表示,在卷积的过程中,对卷积核的每一个数做乘法,其作用类似于W1a[0],再加上偏差b1,第二个卷积核中W1a[1]+b2,就是神经网络中的z=wx+b,最后所有的卷积核输出经过非线性函数后堆叠形成输出:a[1]。卷积核中每一个元素都是一个权重,一个卷积核共用一个偏差,利用这个可以计算参数个数。不论多大的图片,卷积核确定后参数参数个数就确定了,这就是卷积神经网络的一个特征:避免过拟合。这里不懂往下看图例。

这里公式不好打,直接截图了:
计算机视觉之卷积神经网络原理及如何实现
计算机视觉之卷积神经网络原理及如何实现
!实例搭建神经网络:为39×39×3的输入图像提取7×7×40个特征,即1960个特征,然后对该卷积层进行处理,将其展开为1960个单元,需要掌握的是:随着神经网络计算深度不断加深,高度和宽度会在一段时间内保持一致,然后随着网络深度的加深而逐渐减小,而信道数量在增加,在许多卷积神经网络中都有这个趋势
计算机视觉之卷积神经网络原理及如何实现
!虽然利用卷积层就能很好的搭建网络,但大部分架构师都会添加池化层和全连接层,后两者的设计比卷积层更加容易,