深度学习之MNIST手写数字识别——卷积神经网络训练模型并生成gui窗口进行在线识别之基本知识了解

一   基本知识准备

1.卷积(Convolutional)

顾名思义,卷积层由一组卷积单元(又称"卷积核")组成,可以把这些卷积单元理解为过滤器,每个过滤器都会提取一种特定的特征

对卷积层功能的理解

  • 一般认为图像的空间联系是局部的像素联系比较密切,而距离较远的像素相关性较弱,因此,每个神经元没必要对全局图像进行感知,只要对局部进行感知,然后在更高层将局部的信息综合起来得到全局信息。
  • 给定一张输入图片,用一个卷积核去扫这张图,卷积核里面的数就叫权重,这张图每个位置是被同样的卷积核扫的,所以权重是一样的,这也就是权值共享。
  • 如权值共享的部分所说我们用一个卷积核操作只能得到一种特征可能获取不到全部特征,这么一来我们就引入了多核卷积。用不同的卷积核来学习不同的特征(每个卷积核学习到不同的权重)来提取原图特征。需要注意的是,在多核卷积的过程中每个卷积核的大小应该是相同的。

 

下面的动态图形象地展示了卷积层的计算过程:

 

2、池化层(POOL) 

 

卷积层的过滤器负责从图像中查找规律,过滤器越多则参数越多,这意味着卷积层的维度可能很庞大。我们需要一种方法来降低维数,这就是卷积网络中的池化层(又名"下采样层")所扮的角色。

对池化层功能的理解

  • 降低了图片尺寸,也就是增大了感受野。感受野就是数字矩阵中的一个数字所对应的原图中的区域大小。因为池化是在某个范围内选择一个数字,也就是让这个数字代表这个范围内的所有的像素得值。这样做虽然也丢失了一些图片信息,但是同时增加了鲁棒性。
  • 增加平移不变性。图片中某个目标单纯的位置的移动,不应该影响识别结果。而池化捕捉的恰好是目标的特征,并不是目标所在的位置,因此增加了平移不变性。
  • 提升训练速度。因为在保留特征信息的前提下,降低了图片的尺寸。

池化主要有3种形式:一般池化,重叠池化和金字塔池化。

(1)一般池化

池化窗口的尺寸为n*n,一般情况下池化窗口都是正方形的。步长(stride)等于n。此时池化窗口之间是没有重叠的。对于超出数字矩阵范围的,只计算范围内的或者范围外的用0填充再计算。又可以分为最大值池化,均值池化。

  • 最大值池化

池化窗口范围内的最大值作为采样的输出值。
假如输入是一个4×4矩阵,执行最大池化是一个2×2矩阵,每次滑动2步。执行过程非常简单,把4×4的输入拆分成不同的区域,把这些区域用不同颜色来标记。对于2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。

对于每个2 * 2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2 * 2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。 

  • 均值池化

普通均值池化就是将池化窗口范围内的平均值作为采样的输出值。这种池化不如最大池化常用。

 

3.激励层

把卷积层输出结果做非线性映射。

 

 

CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。

 

激励层的实践经验:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先试RELU,因为快,但要小心点
③ 如果2失效,请用Leaky ReLU或者Maxout
④ 某些情况下tanh倒是有不错的结果,但是很少

4.全连接层

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:

 

一般CNN结构依次为

1.INPUT
2.[[CONV -> RELU]N -> POOL?]M
3.[FC -> RELU]*K
4.FC

5.卷积层的填充(padding)公式

直接对原始图像做卷积,会存在两个问题。一是每次卷积后图像(特征图)都会缩小,这样卷不了几次就没了; 二是相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少,导致边缘的信息易于丢失。
为了解决这个问题,我们可以采用填充的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。

 

 

比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。
能够保证输入的数据和输出的数据具有相同的空间尺寸,假设零填充个数为p,卷积核为f * f,卷积核滑动步长为s,则p应设置为

 

计算卷积层输出大小的公式

假设原始输入图像为m * m,输出图像为n * n,零填充个数为p,卷积核为f * f,卷积核滑动步长为s,则输出尺寸为

计算卷积后参数个数

假设输入图像为(m,m,d),其中d为图像深度(通道数),卷积核为f * f,卷积核个数为n,则weight个数为

bias个数:n

计算池化层输出大小的公式

池化层很少使用零填充。假设原始输入图像为m * m,输出图像为n * n,卷积核为f * f,卷积核滑动步长为s,则输出尺寸为

代码整理好会在我的下一篇文章中分享出来