CNN的整体流程

处理非图片数据的神经网络 cnn处理非图像_数据


输入层——》卷积层——》池化层(可以接多个卷积和池化,由我们自己设定)—(flatten)—》全连接网络——》输出层

处理图像问题时为什么用CNN而不用DNN?

当我们直接用一般的fully connected的feedforward network来做图像处理的时候,往往会需要太多的参数,CNN做的事情其实是,来简化这个neural network的架构,我们根据自己的知识和对图像处理的理解,一开始就把某些实际上用不到的参数给过滤掉。

数据输入层

该层要做的处理主要是对原始图像数据进行预处理,其中包括:
  • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
  • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
  • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

去均值与归一化效果图:

处理非图片数据的神经网络 cnn处理非图像_卷积_02


去相关与白化效果图:

处理非图片数据的神经网络 cnn处理非图像_卷积_03

还可以对输入图像先进行一个下采样,减少输入的像素数量。

处理非图片数据的神经网络 cnn处理非图像_卷积_04


CNN对不同scale的相同pattern的处理上存在一定的困难,由于现在每一个filter size都是一样的,这意味着,如果你今天有同一个pattern,它有不同的size,有大的鸟嘴,也有小的鸟嘴,CNN并不能够自动处理这个问题;DeepMind曾经发过一篇paper,上面提到了当你input一张image的时候,它在CNN前面,再接另外一个network,这个network做的事情是,它会output一些scalar,告诉你说,它要把这个image的里面的哪些位置做旋转、缩放,然后,再丢到CNN里面,这样你其实会得到比较好的performance。

卷积层

以灰度图像为例进行讲解:从一个小小的权重矩阵,也就是卷积核(kernel)开始,让它逐步在二维输入数据上“扫描”。卷积核“滑动”的同时,计算权重矩阵和扫描所得的数据矩阵的乘积,然后把结果汇总成一个输出像素。

处理非图片数据的神经网络 cnn处理非图像_数据_05


处理非图片数据的神经网络 cnn处理非图像_数据_06

填充

填充值是什么呢?以下图为例子,比如有这么一个5x5的图片(一个格子一个像素),我们卷积核取2x2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?

处理非图片数据的神经网络 cnn处理非图像_数据_07


那我们在原先的矩阵加了一层填充值,使得变成6x6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。

处理非图片数据的神经网络 cnn处理非图像_卷积_08


通常都用“0”来进行填充的。

卷积核

【卷积核的大小一般为奇数乘奇数】 1x1,3x3,5x5,7x7都是最常见的。这是为什么呢?为什么没有偶数x偶数?

(1)更容易padding

在卷积时,我们有时候需要卷积前后的尺寸不变。这时候我们就需要用到padding。假设图像的大小,也就是被卷积对象的大小为n*n,卷积核大小为kxk,padding的幅度设为(k-1)/2时,卷积后的输出就为(n-k+2x((k-1)/2))/1+1=n,即卷积输出为nxn,保证了卷积前后尺寸不变。但是如果k是偶数的话,(k-1)/2就不是整数了。

(2)更容易找到卷积锚点

在CNN中,进行卷积操作时一般会以卷积核模块的一个位置为基准进行滑动,这个基准通常就是卷积核模块的中心。若卷积核为奇数,卷积锚点很好找,自然就是卷积模块中心,但如果卷积核是偶数,这时候就没有办法确定了,让谁是锚点似乎都不怎么好。

多通道卷积

处理非图片数据的神经网络 cnn处理非图像_处理非图片数据的神经网络_09


这里就要涉及到“卷积核”和“filter”这两个术语的区别。在只有一个通道的情况下,“卷积核”就相当于“filter”,这两个概念是可以互换的。但在一般情况下,它们是两个完全不同的概念。每个“filter”实际上恰好是“卷积核”的一个集合,在当前层,每个通道都对应一个卷积核,且这个卷积核是独一无二的。

多通道卷积的计算过程:将矩阵与滤波器对应的每一个通道进行卷积运算,最后相加,形成一个单通道输出,加上偏置项后,我们得到了一个最终的单通道输出。如果存在多个filter,这时我们可以把这些最终的单通道输出组合成一个总输出。

这里我们还需要注意一些问题——滤波器的通道数、输出特征图的通道数。

某一层滤波器的通道数 = 上一层特征图的通道数。如上图所示,我们输入一张 6x6x3 的RGB图片,那么滤波器(3x3x3 )也要有三个通道。

某一层输出特征图的通道数 = 当前层滤波器的个数。如上图所示,当只有一个filter时,输出特征图( 4x4)的通道数为1;当有2个filter时,输出特征图(4x4x2)的通道数为2。

卷积和全连接的关系

卷积可以看成是全连接的局部连接和权值共享。

处理非图片数据的神经网络 cnn处理非图像_数据_10

池化层

池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

作用:

  1. 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
  2. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
  3. 在一定程度上防止过拟合,更方便优化。

处理非图片数据的神经网络 cnn处理非图像_卷积_11


池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

处理非图片数据的神经网络 cnn处理非图像_卷积_12


Maxpooling的问题

如果取Maxpooling放到network里面,不就没法微分了吗?这个东西,感觉是没有办法对它微分的啊,其实是可以的:maxpooling和maxout类似,以maxout举例:

处理非图片数据的神经网络 cnn处理非图像_卷积_13

实际上我们真正训练的并不是一个含有max函数的network,而是一个化简后如下图所示的linear network;当我们还没有真正开始训练模型的时候,此时这个network含有max函数无法微分,但是只要真的丢进去了一笔data,network就会马上根据这笔data确定具体的形状,此时max函数的问题已经被实际数据给解决了,所以我们完全可以根据这笔training data使用Backpropagation的方法去训练被network留下来的参数

所以我们担心的max函数无法微分,它只是理论上的问题;在具体的实践上,我们完全可以先根据data把max函数转化为某个具体的函数,再对这个转化后的thiner linear network进行微分

处理非图片数据的神经网络 cnn处理非图像_卷积核_14


Flatten

做完convolution和max pooling之后,就是FLatten和Fully connected Feedforward network的部分Flatten的意思是,把左边的feature map拉直,然后把它丢进一个Fully connected Feedforward network,然后就结束了,也就是说,我们之前通过CNN提取出了image的feature,它相较于原先一整个image的vetor,少了很大一部分内容,因此需要的参数也大幅度地减少了,但最终,也还是要丢到一个Fully connected的network中去做最后的分类工作。

处理非图片数据的神经网络 cnn处理非图像_卷积核_15