【深度学习】卷积神经网络CNN

1.卷积神经网络

1.1Convolution 卷积

  卷积核里面的数字是被学出来的。卷积核的大小是认为规定的,以 3 × 3 3\times3 3×3的卷积核为例,
[ 1 − 1 − 1 − 1 1 − 1 − 1 − 1 1 ] , [ − 1 1 − 1 − 1 1 − 1 − 1 1 − 1 ] , . . . \begin{bmatrix} 1 & -1 & -1 \\ -1 & 1 & -1 \\ -1 & -1 & 1 \end{bmatrix}, \begin{bmatrix} -1 & 1 & -1 \\ -1 & 1 & -1 \\ -1 & 1 & -1 \end{bmatrix},... 111111111,111111111,...
  卷积步骤:对一张拥有 28 × 28 28\times28 28×28像素的图片来说,首先将卷积核放在左上角,跟对应像素位置的值做內积得到一个值。然后向右滑动1个stride(滑动的步长称为stride),继续计算內积。当一行计算完之后,卷积核移动到下一行(移动stride步)的行首,重复以上步骤。最后可以将整张图片的像素用卷积得到的值来表示。
  当我们使用n个不同的卷积核时,我们可以得到n组新的值,这时得到的东西称之为Feature Map。我们可以把它想象为一组新的图片,只不过比原来的图片要小,并且原始图片上被卷积核卷过的区域都用n个新的特征值来表示。
  可以这样来考虑卷积后的到的特征,对于图片 [ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 ] \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 1 & 1\end{bmatrix} 1001010000110001,我们使用卷积核 [ 1 − 1 − 1 − 1 1 − 1 − 1 − 1 1 ] \begin{bmatrix} 1 & -1 & -1 \\ -1 & 1 & -1 \\ -1 & -1 & 1 \end{bmatrix} 111111111对其进行卷积,对于左上角 3 × 3 3\times3 3×3的区域,其计算公式为 1 × 1 − 1 × 0 − 1 × 0 − 1 × 0 + 1 × 1 − 1 × 0 − 1 × 0 − 1 × 0 + 1 × 1 = 3 1\times1-1\times0-1\times0-1\times0+1\times1-1\times0-1\times0-1\times0+1\times1=3 1×11×01×01×0+1×11×01×01×0+1×1=3。可以发现3这个输出,其实是以[1,0,0,0,1,0,0,0,1]为输入,[1,-1,-1,-1,1,-1,-1,-1,1]权重得到的输出,如果看成是神经网络的形式,其实相当于以卷积区域的值为输入,卷积核作为权重,得到一个输出3。因此卷积后得到的feature map其实是由一个全连接神经网络得到的结果。而由于卷积核是固定不变的,在卷积过程中,我们使用到的卷积也是不变的,因此对于这个全连接神经网络,得到的每个输出,它们的输入对应的权重都是不变,即 权重共享,这使得需要学习的参数量大大减少。
  卷积有两个缺点,第一个缺点是每次做卷积操作,你的图像就会缩小,第二个缺点是那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。
  卷积后得到图片宽度w的计算公式(n表示图片宽度,f表示卷积核宽度,p表示填充像素,s表示步长):

  • s=1的情况下,w=n-f+1。
  • 考虑填充p后,w=n+2p-f+1
  • 考虑步长s后,w=floor((n+2p-f)/s)+1。

  卷积类型:

  • valid卷积:不填充
  • same卷积:填充使得前后大小一致。其中p=(f-1)/2。通常卷积核为奇数。

  666的图像对于333的卷积,最终得到的图像是441,而不是443,应该将其想象成小立方体对大立方体进行卷积操作。

1.2 Max Pooling最大池化

  将卷积得到的feature矩阵,比如我们卷积后得到 [ 3 − 1 − 3 − 1 − 3 1 0 − 3 − 3 − 3 0 1 3 − 2 − 2 − 1 ] \begin{bmatrix} 3 & -1 & -3 & -1 \\ -3 & 1 & 0 & -3 \\ -3 & -3 & 0 & 1 \\ 3 & -2 & -2 & -1\end{bmatrix} 3333113230021311,对于Max Pooling来说,它会将这个矩阵分成四块,每一块取其中最大值作为代表值,得到 [ 3 0 3 1 ] \begin{bmatrix} 3 & 0 \\ 3 & 1 \end{bmatrix} [3301],与Max Pooling相对应的,还有Average Pooling平均池化。每次不取最大的,而是取其平均值作为代表。进行池化操作后,我们得到一张新的图片,可以对其重复进行卷积,池化操作,直到其变成我们想要的大小为止。大部分情况下,最大池化很少用 padding。
  均值池化能够抑制由于领域大小受限造成估计值方差增大的现象,特点是对背景的保留效果好。最大池化能够抑制网络参数误差造成估计均值偏移的现象,特点是更好地提取纹理信息。其本质都是降采样。

1.3 Flatten

  将上面步骤最后得到的结果拉直,用于后续的全连接层的输入,最终得到整个模型的结果,比如判断一张图片是猫还是狗,到此为止,整个CNN的部分就介绍完了。

CNN图解

2.CNN的几个思想

2.1 稀疏连接

  在多层感知机中,我们的输入X中某个特征x1,需要连接到下一层的每个神经元中,层与层之间都是全连接的。而CNN中,如果将卷积操作后得到的若干个特征看做是神经元,那么采用卷积核的方式,使得一个特征往往只需要跟几个神经元有交互。比如 3 × 3 3\times 3 3×3的卷积核,步长为1的卷积操作,对于拥有成千上万个像素的图片来说,最外层的像素只需要跟3个神经元相连,第二层只需要跟6个神经元相连,第三层需要跟9个神经元相连,再往里的元素都是9个神经元 。如果有m个输入n个输出,相比于原本的全连接需要训练 m × n m\times n m×n个系数,CNN只需要训练 k × n k\times n k×n个参数,由于 k &lt; &lt; n k &lt;&lt; n k<<n,所以稀疏的连接方式意味着存储更少的参数,更低的模型存储需求,以及更少的计算量。

2.2 参数共享

  参数共享是指在一个模型的多个函数中使用相同的参数。由于CNN采用了卷积核来实现稀疏连接,实际上卷积核上的值就是所谓的参数,图像的每一块经过卷积核,跟卷积核上面的参数做线性组合之后的输出到下一层的神经元中。假如有6个卷积核,每个都是 3 × 3 3\times 3 3×3的大小,那我们要学习的参数总共有 6 × ( 3 × 3 + 1 ) = 60 6\times (3\times 3+1)=60 6×(3×3+1)=60个参数,其中的1代表卷积核的偏置。

2.3 等变

  参数共享大大降低了我们需要学习的参数的数量。也使得神经网络具有对平移等变的性质。考虑卷积的操作是通过扫描完成的,这其实跟卷积核不动,平移图像的操作是等价的,相同的像素点往右平移,跟相同的参数做卷积,其得到的结果是不变的。

2.4 局部平移不变性

  池化操作使得网络具有局部的平移不变性。也就是说,我们对输入进行少量平移时,经过池化函数后大多数输出并不会发生改变。由于等变的特性,平移之后卷积得到的数值是不变的,经过池化的时候,池化函数会使用某个区域的总体统计特征来代替其输出,比如 2 × 2 2\times2 2×2的最大池化,会把其中最大的特征输出,尽管图像平移了,但是最大池化只对周围的最大值敏感,而不是对精确的位置。局部平移不变性在我们关心某个特征是否出现而不关心它的具体位置时很有帮助。

3.理解深度学习

  理论上我们只需要一层hidden层就可以学到任何的非线性函数,为什么需要多层呢?并且实际上也很有用?
在这里插入图片描述

  从上面这组实验数据不难发现,当一个参数数量差不多的“高瘦”的模型和“矮胖”的模型相比,“高瘦”模型,也就是深度学习模型的效果更好,并且在只有一层hidden layer的情况下增加神经元数量到16k的数目也不能获得比深度学习更好的效果。
  在软件体系架构里面,有一个很重要的步骤就是模块化。比如,当我们需要对一组数据做一次排序,我们通常是将排序封装成一个方法,这样下次需要排序时就只要调用这个方法,而不需要再重新写一次排序。
在这里插入图片描述

  深度学习其实也是在做类似模块化的步骤。对于一张图片,我们要将其判断出是长发男生,长发女生,短发男生,短发女生四个类型,如果我们直接训练一层hidden layer,恰好其中长发男生的样本很少,那最终学出来的模型不会很好。而如果我们先判断图片中是男生还是女生,是长发还是短发,再将这两个结果组合,最终得到比较好的效果。因为长发和短发的样本是比较均匀的,男生和女生的样本也是比较均匀的,它可以学到一个比较好的基本分类器来判断这两种情况,再由后面的hidden layer进行组合。而在深度学习中,前面的hidden layer就是较为底层的模块,后面的hidden layer使用前一个hidden layer作为模块来构建分类器。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值