AI筑基录——卷积篇
前言
我们前面几讲把神经网络基本的框架差不多搭建完成,本来这一期我本来是想分享线性层的部分,但是我觉得还是先分享卷积部分的内容,这样到时候说到线性层部分的时候会更加容易理解;这一讲我们来了解一下卷积,明白卷积是什么还有对应的池化,归一化等内容;这一讲的内容,会相对比较少;专栏 AI筑基录 前面几期比较偏理论内容,相对来说会比较枯燥,但是这个是我们学习中一定要克服的,后面我们会给大家比较有趣的实战作业;没有看我们上一期的内容的,可以看看上期的内容,内容连贯起来,会更加深刻;上一期的链接我放到下面,方便大家观看学习
卷积是什么?
在了解卷积之前,我想先和大家介绍一下图片;这个时候会有小伙伴问:图片不就是我们经常接触的吗?相机一拍就有了;对,但是实际图片里面隐藏许多细碎的知识;把图片说清楚了,我们后续卷积的理解才能顺利!
图片的构成?
像素
我们平时看到一张图片,第一反应可能是图片中有什么人物、物体或者场景;但是计算机并不能像人一样直接理解图片内容,在计算机眼中,一张图片实际上就是一堆按照一定顺序排列的数字;而组成图片最基本的单位,就是像素;
我们可以把一张图片想象成由许多非常小的方格拼接而成,每一个小方格就是一个像素。单独观察一个像素时,我们可能只能看到一种颜色;但是当大量像素按照一定的位置排列在一起后,就形成了我们所看到的完整图片;
一般来说我们规定 0 表示的是黑色,255 表示的是白色;那么这其实就是一张由 4×4 个像素组成的灰度图片,所以从计算机的角度来看,图片并不是一个抽象的画面,而是一个由数值组成的矩阵;
分辨率
我们平时可能会听到 4K 超清,实际上就是 3840×2160,表示水平方向有 3840 个像素点,垂直方向有 2160 个像素点,这样的一张图片有 3840×2160 = 8294400个像素,一般情况下,在显示范围相同的前提下,像素数量越多,图片能够保存的细节也就越丰富;有一个点注意一下,分辨率高不一定代表图片就一定清晰,图片是否清晰,还受到拍摄质量、压缩程度、对焦、噪声以及显示尺寸等因素影响;
灰度图&彩色图
前面的例子中,每一个像素只使用一个数值表示亮暗,因此它是一张灰度图片,通常是用 0~225去表示一个灰度像素;比如一个经典的数据集 —— MNIST 手写数据集,就是一个灰度图片,这个后面我们实战的时候会用到;
彩色图片不能只用一个数值描述一个像素,我们常见的彩色图片使用 RGB 三个颜色通道;所以,一张高度为 H、宽度为 W 的 RGB 图片,可以看成三个大小相同的矩阵叠放在一起,这三个矩阵分别保存红、绿、蓝三个通道的信息;这三个颜色也被称为三原色,所有的颜色都可以用这三个按照不同的比例进行混合;

RGB图片中的通道表示颜色信息;卷积网络后续层中的通道,通常表示不同的特征信息;这个很重要,通道的概念是卷积很重要的点;那通道我们可以怎么理解呢?通道可以理解成同一张图片中,用来分别保存不同类型信息的多个二维矩阵
我们深度学习一般采用的是 PyTorch 框架,在这个框架下,我们通常会把通道放到前面;由上面讲,我们知道我们训练的时候是按一个 batch 计算的,所以一般我们输入的信息是 B,C,H,W
卷积
卷积计算
假设你是真的零基础,你可能读到这里会有点懵,那我们现在正是说一下卷积的内容,看完这个部分,再和前面的内容结合一下,我相信你一定可以豁然开朗;
实际上我们人眼观察图片的时候,也不是先把所有像素放在一起分析;我们通常会先注意到一些局部信息,例如边缘,线条,颜色,纹理等等;然后再把这些局部特征逐渐组合成眼睛、鼻子、轮廓,最后识别出完整物体(你感受不到,是因为我们大脑处理的速度太快了)
我们又知道神经网络设计的初衷就是想让计算机像人一样思考问题,处理问题;因此我们卷积的时候就是先从浅层的信息开始提取,比如现实边缘信息,水平信息,简单信息;后面就是变成比较复杂的语义信息;因此,我们可以看出卷积是提取信息的一个方式,实际上是一种特征提取的工具
那么卷积是怎么提取特征的呢?卷积是采用卷积核去扫描原图,进行一个乘法加和计算得到一个特征值;我们这边看一个例子:
假设我们原图的矩阵是:
卷积核的大小是:
第一次扫描:
向右移动一次:
继续按照同样的方法扫描完全部16个位置,得到:
假设觉得语言有点抽象缺少动态感的话,我们可以看看下面的图片,会比较清晰:

看到这里,可能会有点疑问:这个卷积核里的数字是谁定的?答案是:在神经网络中,这些数字不是人设计的,而是网络自己学出来的;一开始里面的数字是随机初始化得到的,卷积核的数值是可学习的参数,在反向传播中不断的更新学习新的数值
可能还会有一个疑问就是在多通道中卷积怎么扫描?实际上多通道中,对应的卷积核也是多通道的;举一个例子,我们在 RGB 通道中,卷积核也有 3 个通道,分别对应 R、G、B。扫描时,卷积核的每个通道和图像的对应通道做乘加,最后把三个通道的结果加起来,得到一个输出值。所以:一个卷积核输出一个通道的特征图。如果我们想要提取多种特征(比如同时检测边缘、纹理、颜色),就用多个卷积核,每个卷积核输出一个通道,最终得到多通道的特征图;
Padding 填充
我们可以发现,原图的大小是 7*7,但是经过我们卷积之后特征图变成了 5*5 的,这是因为卷积核每一次只能覆盖图片内部区域,而边缘位置参与计算的次数会比较少
我们通过观察会发现一个问题,如果不断进行卷积操作,会出现两个问题:
- 图片尺寸不断缩小
- 边缘信息容易丢失
尺寸减小我们在卷积的过程中可以直观的看出,但是边缘信息是什么说法呢?是因为边缘信息可能就是我们重要的信息,但是由于卷积主要扫描图片内部区域,边缘像素参与计算次数较少;因此,我们想在卷积之前,给图片周围增加一些额外的信息,让边缘也能够充分参与卷积计算;
Padding 可以帮助我们解决这个问题,常见的方式就是在我们图片的周围补0,我们可以看看卷积的输出公式:
其中:
- H:输入高度
- P:Padding大小
- K:卷积核大小
- S:Stride步长
我们可以举一个例子计算:
在没有填充的时候,也就是 P = 0 的情况,K = 3,H = 7,S = 1,这个时候代入计算,输出是 5
在有填充的时候,也就是 P = 1 的情况,K = 3,H = 7,S = 1,这个时候代入计算,输出是 7
这个结果和我们一开始设想的是一样的;
Stride 步长
聪明的你可能会有一个疑问,如果卷积核每次只移动一个像素,那计算量是不是太大?没错的,所以参数 Stride 就是控制卷积核移动距离;假设为 1 表示的就是每隔一个移动一位,假设为 2 就是每隔两位移动一位;
这个效果就是,卷积输出的尺寸减小,同时计算量减小;
池化
卷积解决了特征提取的问题,但是特征太多怎么办?池化就是专门解决这个问题的,降低空间尺寸,保留重要信息,减少计算量
在计算上,池化和卷积有点相似,也会使用一个小窗口在特征图上滑动;但卷积窗口会进行对应位置相乘再求和,而池化通常只对窗口中的数值进行一种简单的统计操作,比如说去最大值或者是平均值;池化通常没有需要学习的权重参数,它主要负责压缩特征图
最大池化
在窗口取最大值,保留的是每个局部区域中响应最强的特征;例如某一个卷积通道正在检测边缘,那么数值越大,可能表示该位置越符合这个卷积核想寻找的特征。最大池化就会把最明显的响应保留下来
平均池化
在窗口取平均值,保留的是一个区域中的整体平均信息;
在经典卷积神经网络中,最大池化比较常见。不过现代网络中,也经常使用带步长的卷积代替池化进行下采样;
感受野
感受野这个名词在后面的学习中我们会经常听到的,这个和视野差不多;视野越大,感受野就越大;我们举一个例子:
例如使用一个 3×3 卷积核时,输出特征图中的一个数值,来自输入图像中的一个 3 ×3 区域;因此,这一层输出位置的感受野是 3 ×3;如果再叠加一个 3×3、Stride 为 1 的卷积层,第二层中的一个位置,不只是看到上一层的 3×3,它对应到原图上时,实际覆盖范围会变成 5×5,以此类推;
归一化
假设前一层卷积输出的特征值主要分布在 -1~1 之间,经过若干层计算后,下一层的特征值可能变成 -20~30 之间;再往后,数值分布还会不断发生变化,如果不同层输出的数值尺度相差很大,就可能导致:
- 梯度更新不稳定;
- 对学习率更加敏感;
- 网络收敛速度变慢;
- 深层网络更难训练;
因此,我们希望对中间特征进行适当调整,让它们保持在相对稳定的数值范围内;归一化就是专门解决因为量纲不同和难度分布不同所带来的不公平这样的一个问题
归一化的操作一般就是减去平均值(消除绝对数值对大小的影响),再除以标准差(给数据统一单位)
归一化是对数据的数值分布进行调整,不同归一化方法使用的基础计算大致相似,主要区别在于它们选择哪些维度的数据计算均值和方差,我们常用的归一化有两种,分别是层归一化和批归一化,下面介绍这两个归一化;
批归一化
对每一个通道分别进行归一化,也就是说,同一个通道中会涉及到不同图片的数据会参与计算,不同空间位置的数据也会参与计算,不同通道不会混在一起计算;
层归一化
在每个样本内部进行归一化,不需要依赖其他图片或者其他样本;一般这样的归一化是用在 Transformer 网络
文字描述这个归一化,缺乏动态感和例子,我们看看下面的图片:

我们可以看到对于批归一化,会把不同特征的内容给平均了,这样会导致语义信息丢失,所以 Transformer 通常都是采用层归一化,自己内部的词语进行平均,可以保证语义信息不会被中和;
那有小伙伴会问:既然这样的话,那我们就在每一步之间都进行归一化
会存在两点问题:
1.拖慢训练速度,因为归一化也是需要耗费时间的
2. 数据本身发生的偏移或幅度变化也正是网络需要学习的重要特征,如果频繁使用归一化,会破坏模型学习这一部分的区别
总结
这一将的概念比较多,还是得花点时间记忆一下;实际上卷积的种类不止介绍的这个普通卷积;比如还有深度可分离卷积,分组卷积,空洞卷积等等内容;后面我们专栏 AI筑基录 也会慢慢推进这一些内容;有了前面几期的内容,我们下一期就是用 MNIST 数据集做一个简单的实战,我们用完整的神经网络做一个分类任务;浅浅期待一下;
AI筑基录 的专栏会慢慢更新完,带大家有体系的理解神经网络的由来!制作不易,喜欢博主文章的可以点赞收藏关注,这些都是我持续更新的动力!
更多推荐


所有评论(0)