【卷积神经网络】卷积层、池化层、全连接层

卷积神经网络

观察一下左半图(传统神经网络)和右半图(卷积神经网络),

观察一下,感觉有点不同,左边的像是个二维的,右边的像是个三维的...

左边的输入就是 784 个像素点 ,右边的输入不再是像素点,而就是 一张 28 * 28 * 1 的图像 ,所以用 卷积,需要把数据抬高一个维度 ,不再是一列特征,而是一个长方体矩阵,是一个 h * w * c 的数据,不会把这个数据拉成一个向量,而是直接对这个样本数据进行特征提取。

整体架构:输入层、卷积层、池化层、全连接层。

数一数,这个架构有几层?

  • 提示一:其中 Conv 和 ReLU 基本上是一个组合,
  • 提示二:只有有权重参数矩阵要更新的,才叫做

所以说,激活函数 ReLU 没有参数更新,池化也没有参数更新,都不算层,

两个卷积一个池化,总共三组,最后加上一个全连接层,也就是 2 × 3 + 1 = 7 2 \times 3 + 1 = 7 2×3+1=7 层。

特征图的变化一般是:

假设输入是 32 * 32 * 3,经过一次卷积,特征图个数明显增多,再经过一次卷积,特征图个数又多了,做个池化吧,它的体积变小了,... 最后拉长成一个特征向量,经过全连接层得到分类结果。

卷积层(特征提取)

比如一张喵喵的图像,不同区域的特征是不同的,比如眼睛、鼻子、嘴巴、须须。

所以就把原始图像划分为多个块块,比如 3 * 3 大小划分块,对于当前这个块,是要选出来特征值。

怎么选?在神经网络中是 用一组权重参数(卷积核)来提取特征。

具体怎么提取,参考 【卷积神经网络】卷积的理解,卷积与通道的关系

只做一次卷积就可以了吗?

做一次卷积是不够的,是在上一次卷积后得到的特征图上,继续做卷积,每一层会学习不同层次的特征,详见 扩展知识。

滑动窗口步长

移动窗口可以移动大一点、小一点。

步长为 1 的卷积,绿色在红色的基础上向右移动了一个单元格,

步长为 2 的卷积,移动两个单元格,

看结果,

  • 当步长小的时候,相当于 慢慢地、细粒度地提取特征 ,这样 得到的特征比较丰富
  • 当步长大的时候,走地 比较粗糙 ,滑动比较大,得到的特征比较少,没有那么丰富。

对于图像来说,通常选择步长为 1。

对于文本任务,比如 2 个词一滑动 3 个词一滑动,因为 步长为 1 的时候,得到的特征多,计算效率低

卷积核尺寸

相当于选择区域大小不同,比如卷积核 3 * 3 得到一个值,4 * 4 得到一个值。

卷积核比较小,也是越细粒度地提取;卷积核比较大,也是比较粗糙地提取。

基本做法是,步长比较小一般是 1,卷积核一般是 3 *3,这是比较常见的。

边缘填充

卷积核滑动时候,有些点被滑动到的次数多,比如中间的那些点,有些点被滑动到的次数少,比如边缘那些点,

但不一定边缘的就一定不重要,那怎么提高边缘点的利用呢?

比如在输入的外围填一圈 0(叫做 zero padding,这个填充值是 0 不会造成负面影响),

那么原来是边界的点就会被滑动到的次数更多,这就是 padding 的作用,让网络更公平地对待边缘的特征。

卷积核个数

这要看最终在计算时,要得到几个特征图。

继续看 【卷积神经网络】卷积的理解,卷积与通道的关系

卷积计算结果

无空洞卷积后输出的空间尺寸 (Height × Width) 由以下因素共同决定:

参数 含义
H i n , W i n H_{in}, W_{in} Hin,Win 输入高、宽
k k k 卷积核尺寸(一般 k × k k×k k×k)
s s s 步幅 stride
p p p 填充 padding

单维度输出大小为:

H o u t = H i n + 2 p − k s + 1 H_{out} = \frac{H_{in} + 2p - k}{s} + 1 Hout=sHin+2p−k+1

宽度同理。

卷积参数量怎么计算?权重由以下因素决定:

参数 含义
k k k 卷积核大小
C i n C_{in} Cin 输入通道数
C o u t C_{out} Cout 输出通道数(卷积核个数)

卷积层参数量公式:

P a r a m s = ( k ⋅ k ⋅ C i n ) ⋅ C o u t Params = (k \cdot k \cdot C_{in})\cdot C_{out} Params=(k⋅k⋅Cin)⋅Cout

举个例子,输入: ( 224 × 224 × 3 ) (224 × 224 × 3) (224×224×3),卷积:(k=3, s=1, p=1, C_{out}=64),那么输出尺寸:
H o u t = 224 + 2 ⋅ 1 − 3 1 + 1 = 224 ⇒ 224 × 224 × 64 H_{out} = \frac{224 + 2\cdot1 - 3}{1} + 1 = 224 \Rightarrow 224 \times 224 \times 64 Hout=1224+2⋅1−3+1=224⇒224×224×64

参数量:
( 3 ⋅ 3 ⋅ 3 ) ⋅ 64 + 64 = 1792 (3\cdot3\cdot3)\cdot64 + 64 = 1792 (3⋅3⋅3)⋅64+64=1792

感受野

如上图,输入 Input5*5,第一次卷积使用的是 3×3 kernel(绿色为该卷积核覆盖的区域),第二次卷积也是 3×3 kernel(红色为第二层感受的第一层区域),

  • 先看 First Conv 中的绿色方块 ,对 Input 绿色区域进行卷积,1 次卷积后得到一个值,也就是 First Conv 的绿色方块,这个值对应前面的输入应该是 3*3 大小 ,也就是这个值能看到、感受到前面的大小是 3*3
  • 再看 First Conv 整个红色区域 ,对应前面输入就是 5*5,也就是说感受野就是 5*5
  • 同理,对于 Second Conv 中的红色方块 ,对应了 First Conv 中的红色区域,也就是它的感受野是 5*5

如果 堆叠 3 个 3*3 的卷积层 ,并且保持滑动窗口步长为 1,其感受野就是 7*7 的了,这跟 一个使用 7*7 卷积核 的结果是一样的,那为什么非要堆叠 3 个小卷积呢?

假设输入大小都是 h*w*c,并且都使用 c 个卷积核(得到 c 个特征图),可以来计算一下其各自所需参数,

  • 1 个 7*7 卷积核所需参数: C × ( 7 × 7 × C ) = 49 C 2 C \times (7 \times 7 \times C) = 49 C^2 C×(7×7×C)=49C2
  • 3 个 3*3 卷积核所需参数: 3 × C × ( 3 × 3 × C ) = 27 C 2 3 \times C \times (3 \times 3 \times C) = 27 C^2 3×C×(3×3×C)=27C2

很明显,堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随着增多,还不会增大权重参数个数

这就是 VGG 网络的基本出发点 ,用 小的卷积核 来完成特征提取操作。

为什么 堆叠 block 会扩大感受野(receptive field, RF)(用公式说明)?

对 1D 卷积,按照常用的分析:

  • 单个 conv(kernel = kstride = s)把 输入上相邻点的信息融合到一个输出单元上
  • 如果在当前层之前的 累积 strideS,则这个 conv 对原始输入的感受野(增加量)是 ( k − 1 ) × S (k-1)\times S (k−1)×S。

把这些叠加起来,总体(理论)感受野 RF 满足递推关系:
RF new = RF prev + ( k − 1 ) × S prev \text{RF}{\text{new}} = \text{RF}{\text{prev}} + (k-1)\times S_{\text{prev}} RFnew=RFprev+(k−1)×Sprev

其中 S prev S_{\text{prev}} Sprev 是到当前 conv 为止的累积 stride。

对于上图的示例,

两层卷积核 k 1 = k 2 = 3 k_1 = k_2 = 3 k1=k2=3、步幅 s 1 = s 2 = 1 s_1 = s_2 = 1 s1=s2=1、输入层感受野 = 1,

  • 第一层卷积: R F 1 = 1 + ( 3 − 1 ) ⋅ 1 = 3 RF_1 = 1 + (3-1)\cdot1 = 3 RF1=1+(3−1)⋅1=3,即:第一层每个输出像素感受野是 3 × 3 3×3 3×3
  • 第二层卷积: R F 2 = 3 + ( 3 − 1 ) ⋅ 1 = 5 RF_2 = 3 + (3-1)\cdot1 = 5 RF2=3+(3−1)⋅1=5,即:第二层每个输出像素感受野是 5 × 5 5×5 5×5
感受野大小
第一层 Conv 3×3
第二层 Conv 5×5

所以关键点:堆叠的 conv 每层增加的 RF 是按当前累计下倍数被放大的 。也就是说,越往深层,下采样之前那几层对最终 RF 的贡献越大(成倍放大)。

池化层(特征压缩)

假设卷积得到的结果是下面这样,224 * 224 * 64,这也太大了,得到的特征值太大了,但是这些特征都非常重要吗?未必。

池化层,就是做特征压缩的。经过 pool,变成了 112 * 112 * 64,像是做了瘦身,选择了一些不重要的特征丢弃了,怎么做呢?

在下面红色框中,做了最大池化 Maxpool,就是选择了一个最大值,最重要的特征保留,其他舍弃。

同样是滑动卷积核,但 池化没有权重,只是一个筛选过滤没有计算。而是在每个有效位置上进行操作并返回单个值作为输出,两个常见的操作是取最大值和取平均值。

常见是最大池化,基本上在所有问题中都比平均池化要好,因为已经知道最好的特征了,为什么还要平均一下拉低这个特征呢?

全连接层

假设对于一个分类任务,前面的卷积和池化得到的结果是 32 * 32 * 3,但这是提取的特征的结果,最后还要分类呀?

假设 5 分类,全连接层的输出是五个概率值,那前面的特征图 32 * 32 * 3 得拉长成一个特征向量 吧,再输入到全连接层,把特征转成各分类的概率。

扩展:反卷积网络------可视化每一层提取的特征

论文《Visualizing and Understanding Convolutional Networks》提供了一种有效的方法,来 可视化和理解卷积网络的内部工作机制,从而帮助我们设计和改进网络模型。

其中介绍的一种用于可视化和理解卷积网络的技术,叫做 反卷积网络 (Deconvnet)。反卷积网络是一种与卷积网络相反的结构,它可以 将卷积网络的中间层的特征图映射回像素空间从而展示出每一层所提取的特征和激活的模式

通过反卷积网络,我们可以观察到 卷积网络的每一层都学习到了什么有用的知识,例如:

  • 第一层:学习到了一些 简单的边缘和颜色 的检测器,类似于 传统的滤波器
  • 第二层:学习到了一些 由边缘和颜色组成的更复杂的形状和纹理 的检测器,例如 圆角、条纹、斑点等
  • 第三层:学习到了一些 由形状和纹理组成的更高级的特征 的检测器,例如 眼睛、鼻子、轮胎等
  • 第四层:学习到了一些 由高级特征组成的更具体的物体 的检测器,例如 狗、猫、人脸等
  • 第五层:学习到了一些 由具体物体组成的更抽象的类别 的检测器,例如 动物、汽车、飞机等
相关推荐
LO嘉嘉VE1 小时前
学习笔记二十一:深度学习
笔记·深度学习·学习
YJlio2 小时前
[编程达人挑战赛] 用 PowerShell 写了一个“电脑一键初始化脚本”:从混乱到可复制的开发环境
数据库·人工智能·电脑
RoboWizard2 小时前
PCIe 5.0 SSD有无独立缓存对性能影响大吗?Kingston FURY Renegade G5!
人工智能·缓存·电脑·金士顿
霍格沃兹测试开发学社-小明2 小时前
测试左移2.0:在开发周期前端筑起质量防线
前端·javascript·网络·人工智能·测试工具·easyui
懒麻蛇2 小时前
从矩阵相关到矩阵回归:曼特尔检验与 MRQAP
人工智能·线性代数·矩阵·数据挖掘·回归
xwill*3 小时前
RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION
人工智能·pytorch·python·深度学习
网安INF3 小时前
机器学习入门:深入理解线性回归
人工智能·机器学习·线性回归
陈奕昆3 小时前
n8n实战营Day2课时2:Loop+Merge节点进阶·Excel批量校验实操
人工智能·python·excel·n8n
程序猿追3 小时前
PyTorch算子模板库技术解读:无缝衔接PyTorch模型与Ascend硬件的桥梁
人工智能·pytorch·python·深度学习·机器学习