图像算法--卷积神经网络

卷积神经网络

CNN已经成为图片分类比较成熟的算法,在上一节中我们介绍了卷积,可以在本站点搜索卷积,就能看到卷积的相关介绍,这下可以趁热打铁进入CNN的学习。

卷积核

上一个文章中我们了解到卷积,下面咱们就来理解一下卷积核了。

卷积核的表达式

$$f=wx+b$$

很简单吧,这就是一个线性关系的表达。咱们来看个图吧:

这下是不是理解了,其实就是一个映射关系,表达的简单点也没有什么关系。

上图中我们的卷积核就是黄色的矩阵。经过九宫格的点乘,就得到了粉色的一个元素,而这个粉色的数字就是我们要的feather map。 经过这一层压缩,九个数字就变成了一个数字,当然这是一个有损的压缩,你可以理解成特征提取。 小黄格每次移动一个格子,就相当于卷积的的滑动。

需要说明的是,上个公式的w和b 是通过迭代训练得到的,当时不是我们凭空定下来一个。

卷积的参数

当你使用卷积神经网络的时候,你可能更加关注几个参数,一个padding(填充) 另一个是striding(步长)。

padding 简单说就是用0去填充图片边界的像素;

convolutional_neural_network_2.png

就像上图这样做的。

这时你需要问 擦 填这种0 有毛线用?

其实这里的用途主要有两种:

1.保持边界信息,因为边界仅仅能被卷积卷一次,而中间的元素能被卷积多次扫描。一定程度上其实是降低了边界的重要程度。

2.如果输入图片的尺寸有差别,那padding的用途就更大了,可以通过padding对图片进行填充,从而达到尺寸一致的效果。

striding就比较好理解,就是卷积在图片的中的滑动步长,当然你如果选择这个“步长”太大,特征就不会太明显,但是计算量却降低了不少。这个就需要根据情况和场景自行选择了。

池化层

池化层分为两种:

一种是最大池化层,就是取范围内最大的数作为当前的特征。

一种是平均池化层,就是取区域内的均值作为当前特征。

这里我们可以想象池化层到底有什么作用呢?

  1. 肯定降低了计算量,也是一种压缩,同时也是一次特征提取
  2. 防止过拟合,当然了因为又抽象了一次吗。
  3. 提高泛化能力,这个也能理解,就是信息损失了一部分,但是却得到了更加好的泛化能力。

convolutional_neural_network_3.gif

CNN的传播过程

其实我个人觉得神经网路这种东西,抠的这么细是没啥必要的,但是总有一些变态的人希望你了解这些东西,其实即使你了解了,你用的可能性还是很小。

CNN的前向传播

1.对于卷积层,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M*N大小,卷积核为a*b大小,那么输出Y为(M-a+1)*(N-b+1)大小。

convolutional_neural_network_4.png

2.对于池化层,按照池化标准把输入张量缩小

3.对于全连接层,按照普通网络的前向传播计算

CNN反向传播

首先要注意的是,一般神经网络中每一层输入输出a,z都只是一个向量,而CNN中的a,z是一个三维张量,即由若干个输入的子矩阵组成。其次:

1.池化层没有激活函数。这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1。

2.池化层在前向传播的时候,对输入进行了压缩,那么我们向前反向推导上一层的误差时,需要做upsample处理。

3.卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得到当前层的输出,这和一般的网络直接进行矩阵乘法得到当前层的输出不同。这样在卷积层反向传播的时候,上一层误差的递推计算方法肯定有所不同。

4.对于卷积层,由于W使用的运算是卷积,那么由该层误差推导出该层的所有卷积核的W,b的方式也不同。

举个栗子

已知池化层的误差,反向推导上一隐藏层的误差

在前向传播时,池化层我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后区域的误差,还原前一层较大区域的误差。这个过程叫做upsample。假设我们的池化区域大小是2x2。第l层误差的第k个子矩阵$δ_l^k$为:

convolutional_neural_network_5.png

如果池化区域表示为a*a大小,那么我们把上述矩阵上下左右各扩展a-1行和列进行还原:

convolutional_neural_network_6.png

如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:

convolutional_neural_network_7.png

如果是Average,则进行平均,转换后的矩阵为

convolutional_neural_network_8.png

上边这个矩阵就是误差矩阵经过upsample之后的矩阵,那么,由后一层误差推导出前一层误差的公式为:

convolutional_neural_network_9.png

是不是一目了然?

已知卷积层的误差,反向推导上一隐藏层的误差

公式如下:

convolutional_neural_network_10.png

下一层的权重$w$的转置操作,变成了旋转180度的操作,也就是上下翻转一次,左右再翻转一次,这其实就是“卷积”一词的意义(我们可简单理解为数学上的trick),可参考下图,$Q$是下一层的误差,周围补0方便计算,$W$是180度翻转后的卷积核,$P$是$W$和$Q$做卷积的结果:
convolutional_neural_network_11.png

已知卷积层的误差,推导该层的W,b的梯度

经过以上各步骤,我们已经算出每一层的误差了,那么:

a)对于全连接层,可以按照普通网络的反向传播算法求该层W,b的梯度。

b)对于池化层,它并没有W,b,也不用求W,b的梯度。

c)只有卷积层的W,b需要求出,先看w:
convolutional_neural_network_12.png

结语

话说真心是很复杂呀,一些细节将来有机会还会做补充,不过性价比可能并不高。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×