当给出一张图像,现在你想让电脑识别出图片中有什么,电脑首先要做的就是垂直边缘检测或水平边缘检测。

垂直边缘检测:
在池化(pooling)过程中,使用一个过滤器(filter),有时也被称为核(kernel),来计算图像的卷积。原始图像是N维的,过滤器是f层的,那么会得到N-f 维的输出。
举个例子,6X6的矩阵,通过一个3X3的过滤器,就会得到一个4X4的一个矩阵。

通过设置不同的过滤器,就可以得到图像的特征,例如选用垂直特征的过滤器,就会得到图像的垂直边缘,亮到暗和暗到亮均可检测出。

Padding:
为了解决通过过滤器时产生的两个问题:

  1. 输出的逐渐缩小(比如你有100层的话,如果每层都缩小,那最后你就会得到一个非常小的图片。
  2. 丢失了图片许多边界上的信息。可以看到,图片边缘其实只经过了一次运算,而中间部分经过了很多次运算。

为了解决上述问题,你能做的是在卷积之前将图片填充(pad),即在图像周围增加一圈,增加这一拳的宽度是任意的。

那么,填充的宽度是多少,我们通常有两种选择:
valid卷积和same卷积

valid卷积:意思是基本没什么填充,就像之前举的例子,6X6的矩阵,通过一个3X3的过滤器,就会得到一个4X4的一个矩阵。
same卷积:意思是你选择的填充将使得输出大小等于输入大小。
n+2p-f+1 = n , 可以得到 p = (f+1)/2。
【在计算机视觉领域中,f基本上都是奇数】

卷积步长:在引入卷积步长之后,卷积之后的维度又发生了变化。
举个例子,7X7的矩阵,通过一个3X3的过滤器,如果卷积步长为2的话,就会得到一个3X3的一个矩阵。

这样就会得到公式:
图像image的维度:n X n , 过滤器filter的维度:f X f
填充padding : p , 卷积步长stride:s
卷积之后输出的矩阵维度:【(n+2p-f)/s + 1】X 【(n+2p-f)/s + 1】
这里的【】表示向下取整。

三维卷积:

过滤器的通道数应该与输入的通道数相同。
例如,6X6X3的输入,过滤器是3X3X3,得到的输出是4X4X1的。

小结:

学到现在,我们将目前所学的串起来。之前我们提到过,z1 = w1 * a0 + b1 ,a2 = g(z1) 。
OK,那这个和我们讲的卷积有什么关系呢?

就用之前的例子,一个 6X6 的 RGB图像通过3X3X3的filter , 会得到一个4X4的输出,那现在通过两个filter的话,就会得到 4X4X2的输出,这里我们称为是两个特征。

得到的输出还要加上一个偏差b , 到此为止就相当于我们之前提到的z1 = w1 * a0 + b1 , a0就是我们的输入。

得到的z1还需要经过一个函数g,从而得到我们最终的4X4X2输出,即a1。

ConvNet :

好,我们在这里再来从头过一遍整个的流程。

首先,

假定我们的输入是一个39X39X3的一个输入,那nH(0)= nW(0)= 39,nC(0)= 3。

下面是第一层:

f(1) = 3 , s(1) = 1 , p(1) = 0 , 10 filters
【这里不会还有人看不懂吧,那就稍稍讲下含义。nH和nW是长和宽,nC是高,0表示第0层,f表示过滤器是3X3的,s指步长,p指的填充padding,10filters表示一共有十个过滤器,每层之间的维度转换遵循下面的公式:
(n + p*2 - f) / s + 1 , 下面再不讲了哟i】

经过上一层之后,

a[0] 变成了37X37X10 的a[1] , 此时nH(1)= nW(1)= 37,nC(1)= 10。
【nC(1)= 10是因为我们之前有说过,是和上一层filter的个数相对应的】

下面是第二层:

f(2) = 5 , s(2) = 2 , p(2) = 0 , 20 filters

经过上一层之后,

a[1] 变成了 17X17X20 的a[2] , 此时nH(2)= nW(2)= 17,nC(2)= 20。

下面是第三层:

f(3) = 5 , s(3) = 2 , p(3) = 0 , 40 filters

经过上一层之后:

a[2] 变成了 7X7X40 的a[3] , 此时nH(3)= nW(3)= 7,nC(3)= 40。

OK,假设我们只有三层的话,a[3] 就是我们的结果,7X7X40的,将它展开为1960维的向量,输送到softmax,为了做出最终预测输出的一个回归。

可以注意到,长和宽维持了一阵后,会逐渐变小,而通道数会不断增加。

层的类型:
Convolution : CONV , 卷积层。
Pooling : POOL , 池。
Fully connected : FC , 全连接层。