卷积神经网络
步幅 stride
卷积中的步幅是构建卷积神经网络的基本操作
例如:我们将步幅(stride=2)设置为2,7x7的矩阵与右边的filter进行卷积运算;
与之前的卷积运算不同的是我们之前步幅为1时,移动filter向右一格,而此时步幅为2时则移动两格;
而当我们向下移动时,也是移动两格而非一格
如此经过卷积运算,我们最终得到一个3x3的输出矩阵
7x7 * 3x3 = 3x3;
由此可总结出一个输入输出的公式(padding = p,stride = s = 2):nxn * fxf = (n+2p-f)/s+1 x (n+2p-f)/s+1
(7+0-3)/2+1 = 3
如果商不为时我们向下取整,也就是在过滤器移动过程中只有过滤器整体处于原有矩阵或填充后矩阵中时,才输出相应结果
数学中的卷积
以6x6 * 3x3 卷积运算为例,做元素乘积求和之前,首先要做的一步就是将3x3的过滤器沿水平和垂直轴翻转,相当于对过滤器做了一个镜像,按照机器学习的惯例,我们通常不进行翻转操作,从技术上说这个操作可能叫做互相关更好,对于一些信号处理应用来说很好,但对于深度神经网络来说,他真的不重要,因此也就省去了双重镜像操作简化了代码,并使神经网络也能正常工作;根据惯例我们大多人都叫它卷积,数学上更喜欢称之为互相关
三维卷积
我们已经知道了如何在二维图像上如何进行卷积,接下来我们看看如何在三维立体上执行卷积
如果我们想检测RGB彩色图像的特征,如果彩色图像大小为6x6,那么它就是6x6x3,这里的3指的是三个颜色通道,我们可以想象为三个6x6图像的堆叠
而进行卷积运算使用的过滤器也不是原来的3x3,而是跟一个立体的三维的过滤器,它的维度就是3x3x3,这样一来过滤器也有三层,对应红绿蓝三个通道;
我们对图像6x6x3这三个数字进行命名(过滤器也如此):
6–>height 图像的高
6–>width 图像的宽
3–>channels 通道数
图像的通道数必须和过滤器的通道数相匹配,所以这两个数字必须相等
输出:4x4x1 我们看看其中细节
首先要做的就是把3x3x3的过滤器放到最左上角位置,过滤器有27个参数也就是3^3,依次取这27个数然后乘以相应的红绿蓝通道中的数字,先取红色通道的前9个数字然后是绿色通道,再然后是蓝色通道,乘以左边黄色立体覆盖的对应的27个数,然后把这些数加起来,就得到了输出的第一个数字
第二个输出则将立方体过滤器向右滑动一个单位再进行卷积操作
依次得到4x4的特征矩阵,那么这个能干什么呢?
如果我们想检测图像红色通道的边缘,我们可以设计如下过滤器:
如果我们把这三个堆叠起来,形成一个3x3x3的过滤器,那么它就是一个检测垂直边缘的过滤器并且只对红色通道有用
如果我们不关心垂直边缘在哪个颜色通道里,可以设计这样一个过滤器:
对三个通道都进行垂直边缘检测,该过滤器用于检测任意颜色通道里的边界,参数选择的不同,你就可以得到不同的特征检测器
现在我们已经了解如何对三维立体卷积,如果我们想同时检测垂直和水平边缘,45°倾斜的边缘还有七十度倾斜的边缘我们该怎么做?
换句话说,如果我们同时用多个过滤器怎么办?
我们使用不同的过滤器对图像进行卷积得到不同的特征矩阵,然后我们把这两个4x4的卷积取第一个放在前面,然后取第二个输出放在后面,把这两个输出堆叠在一起你就得到一个4x4x2的输出立方体,这里的2来源于使用了两个不同的过滤器进行卷积;
总结:nxnxnc * fxfxnc --> n-f+1xn-f+1xnc’
对立方体卷积,我们可以检测2个特征,比如垂直和水平边缘,或者10个或者128个或者几百个不同的特征并且输出的通道数会等于你要检测的特征数
channels在这里用来表示通道数,我们在文献里也叫做三位立方体的深度,不管是通道还是深度都经常出现在文献里,但是深度容易与神经网络深度混淆,所以我们经常习惯称为通道这个术语,来表示过滤器第三个维度的大小