假设我们想要辨识一张图片里面是不是有猫咪的存在。

这只猫咪可以在图片的任何位置。

什么办法才能辨别这个图片里面有没有猫呢?

一个很简单的想法就是:将图片分成一些子图片的集合,逐个辨别子图片里面有没有猫咪。

的确,卷积神经网络就是这样做的。

但是,分割好后如何辨别子图片有没有猫咪呢?

这就要看卷积的作用了,图片是二维数组(这里指的是灰度图像),即二维离散变量。

卷积能将其中的特征提取出来,这样子图片的特征又组成新图片。

只不过这个新图片的维度减小了。

经过几次这样的过程,剩下来的便是主要特征了。

这时我们可以利用神经网络进行训练。


图中输入为三维矩阵,输出同为三位矩阵。

正如两个长方体相互对应。


1.weight sharing 子图片共享权重矩阵


上文说道,一张图片化为多张子图片,每个子图片的权重矩阵什么呢?

每个子图片的权重矩阵是相同的。这样大大减少了存储空间和计算量。


2. 子图片分割方法

子图片分割方法分为两种:valid 和 same

比如我们想要获得px*py大小的子图片。

进行valid分割时,每个子图片必须在原图片内,不允许出原图片边界。

如下图左侧为valid分割,其绿色边框不允许出原图片的边界,最多重合。

而same分割方法中,same表达的意思是使子图片的分布与原图片的维度相同。

比如,原来28*28的图片进行same分割,要求每个子图片的维度为5*5,这样每次x方向或y方向移动1个像素。

那么,得到的应该是28*28个5*5的子图片。

这么多的子图片,肯定有些子图片越界,如下图右侧。

这些多出来的像素可以置零,也可以有其他方案,比如插值。



下面列出了几种不同方案对应的分割后的维度。




3.卷积神经网络的处理过程

一般图想输入后经过多层卷积提取特征成为深度神经网络的输入层。

注意,这里的逐层提取特征是串联的。

也就是说可以并联,作为神经网络分类器的输入层。(这个后面会提)


上图很好的总结了这一过程。

但是,实际计算中,我们不可能一张张来计算。

这样输入为图片组,也就是四维矩阵了。

既然有深度神经网络分类器,dropout, decay learning rate, regularization都可以使用,这并不一定要求非得是fully connected。


4. Tips



(1)pooling

神经网络分类器间可以有dropout,卷积层间也可以有一些操作,pooling便是其中之一。

只不过dropout为了防止overfitting,而pooling是为了提取特征。

pooling有max_pooling和average_pool,分别对应在距离中心像素kernel_size范围内所以像素的最大值,平均值。


如图所示,比起直接增大stride后减少输出层维度,pooling能有有效利用信息,提高准确度。

但是,pooling增加了计算负荷,需要配置好参数。



(2)1*1 convolution

输入层的图像被增加深度形成(1,1,depth1)的卷积层,之后仍然只改变深度。

这样使计算大大简化,直接变成矩阵乘法。



(3) inception

前面提到卷积层是串联的。

还一种方式是类似于并联。

即采用不同分割方式,得到的卷积层最终化为同样的图像维度,其深度可以不同。

并联以后形成神经网络分类器的输入层。



5. leNet5 架构

著名的手写字体架构,在mnist数据上正确率在98%以上。

不知道在notMNIST上的效果如何。