《深度学习入门-基于Python的理论与实现》第七章带读 -- CNN介绍

《深度学习入门-基于Python的理论与实现》第七章带读 – CNN介绍

在这里插入图片描述


在第六章,我们介绍了深度学习模型训练过程中非常重要的一些技巧,包含了:

  • 如何更新模型的参数
  • 如何初始化需要的权重
  • Batch Normalization
  • 正则化处理
  • 超参数验证

本章,我们一起看看深度学习中非常重要的一个模型:卷积神经网络(Convolutional Neural Network,CNN) ,其被广泛用于图像识别、语音识别等领域。

7.1 整体结构

CNN网络在之前神经网络的基础上,增加了卷积层 (Convolution层)和池化层(Pooling层)。我们先来看看之前基于全连接层(Affine层)的神经网络图:

图片

基于CNN的网络的例子:新增了Convolution层和Pooling层(用灰色的方块表示):

图片

对比发现,CNN中新增了 Convolution 层和 Pooling 层。CNN中层的连接顺序是“Convolution - ReLU - ( Pooling) ”(Pooling 层有时会被省略)。这可以理解为之前的“Affine - ReLU” 连接被替换成了“Convolution - ReLU - ( Pooling) ”连接。

除此之外,CNN中,靠近输出的层中使用了之前 的“Affine - ReLU” 组合。还有,最后的输出层中使用了之前的“Affine Softmax” 组合。

7.2 卷积层

a.全连接层存在的问题

问题:数据的形状被“忽视”了。

如:前面提到的使用了 MNIST 数据集的例子中,输入图像就是 1 通道、高 28 像素、长 28 像素 的(1, 28, 28)形状,但却被排成1列,以784个数据的形式输入到最开始的 Affine层。

基于以上问题,我们需要找出一种方法,既可以学习到需要的特征,又保持形状相关的信息。而卷积层就可以满足这个需求。

接下来,我们看看卷积层是如何进行运算的。

b.卷积运算

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。

卷积层运算结果:

图片

计算过程:

图片

通过,最后内容 = 矩阵对应位置*滤波器

15 =

12+20+31+00+11+22+31+00+1*2 =

2+3+1+4+3+2

最后在上内容中增加偏置:

图片

c.填充

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充(padding),是卷积运算中经常会用到的处理。

卷积运算的填充处理如下图:向输入数据的周围填入0(图中用虚线表示填充,并省略了填充的内容"0”)

图片

为什么要进行padding呢?

使用填充主要是为了调整输出的大小。比如,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小 比输入大小缩小了2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。

为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例子中,将填充的幅度设为1,那么相对于输入大小(4, 4), 输出大小也保持为原来的(4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。

d.步幅

应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是1,如果将步幅设为2,则如图所示,应用滤波器的窗口的间隔变为2个元素。

图片

根据之前观察,我们发现:增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。

具体他们之间会有什么关系呢?

假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为 (OH, OW),填充为P,步幅为S。此时,输出大小可通过式(7.1)进行计算。

图片

e.三维数组的卷积运算

之前卷积运算的例子都是以有高、长方向的2维形状为对象的。但是,图像是3维数据,除了高、长方向之外,还需要处理通道方向(一般黑白图片为1通道,彩色图片为3通道)。

3通道数据计算结果:

图片

3通道数据计算过程:

图片

通过每个通道分别计算,最后进行求和。

7.3 池化层

a.池化层的介绍

池化层的目的是:缩小高、长方向上的空间的运算。

一般有最大池化和平均池化。

  • 最大池化:从目标区域中取出最大值
  • 平均池化:计算目标区域的平均值

举例:按照步幅2进行2*2的最大池化处理顺序:

图片

b.池化层的特征
  • 没有要学习的参数

    • 池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数。
  • 通道数不发生变化

    • 经过池化运算,输入数据和输出数据的通道数不会发生变化。计算是按通道独立进行的。
      • 图片
  • 对微小的位置变化具有鲁棒性(健壮)

    • 输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对输入数据的微小偏差具有鲁棒性。

7.4 具有代表性的CNN网络

前面我们介绍了CNN中的卷积层和池化层,其实如果堆叠了多层卷积层,则随着层次加深,提取的信息也愈加复杂、抽象,这是深度学习中很有意思的一个地方。最开始的层对简单的边缘有响应,接下来的层对纹理有响应,再后面的层对更加复杂的物体部件有响应。也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。

如下图:CNN的卷积层中提取的信息。第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应。

图片

关于CNN,迄今为止已经提出了各种网络结构。这里,我们介绍其中特别重要的两个网络,一个是在1998年首次被提出的CNN元祖LeNet , 另一个是在深度学习受到关注的2012年被提出的AlexNet。

a.LeNet

LeNet在1998年被提出,是进行手写数字识别的网络。如下图,它有连续的卷积层和池化层(正确地讲,是只“抽选元素”的子采样层),最后经全连接层输出结果。

图片

和“现在的CNN”相比, LeNet有几个不同点。

  • 第一个不同点在于激活函数。LeNet 中使用sigmoid 函数,而现在的 CNN 中主要使用 ReLU 函数。
  • 此外,原始的LeNet中使用子采样(subsampling)缩小中间数据的大小,而 现在的CNN中Max池化是主流。
b.AlexNet

AlexNet是引发深度学习热潮的导火线,不过它的网络结构和LeNet基本上没有什么不同.

图片

AlexNet叠有多个卷积层和池化层,最后经由全连接层输出结果。虽然结构上AlexNet和LeNet没有大的不同,但有以下几点差异:

  • 激活函数使用ReLU。
  • 使用进行局部正规化的LRN(Local Response Normalization)层。
  • 使用Dropout。

7.5 小结

这一章中主要介绍了CNN,以及卷积层和池化层。同时我们在其基础上又介绍了LeNet和AlexNet两个网络。本章中的难点是卷积层和池化层的理解。



书籍下载链接:https://pan.baidu.com/s/1goHhf2GZt0gxxbLXa42CmA
密码: 4vi2


欢迎微信搜索关注微信公众号【布道NLP】获取更多AI相关资料和知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文言AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值