卷积神经网络
1. 背景
在看大模型的一些内容中,为了更好的理解其实现,现对一些经典的网络模型进行学习。本文参考bilibili视频内容:https://www.bilibili.com/video/BV1zF411V7xu/,感谢博主
本文学习的卷积神经网络CNN,在视觉领域非常知名,但也不只用于视觉领域。相比于普通NN,CNN引入了卷积层和池化层两个概念
- 卷积层:对图片的一块一块的小方格位置进行特征提取,通过不同权重的卷积核可以提出图形的各类特征
- 池化层:在提取完特征后,考虑到特征数目多,可以将特征矩阵小方格内最大的权重拿出来,通过这种方式进行降采样。
本文使用的pytorch进行的代码实践,在涉及到具体CNN代码训练时,本文作者对 train,optimiser,loss.backward等逻辑并没有很好的认知,代码内部有些过于黑盒了,学起来心里面太虚。 于是决定在余下的一些时间中,详细看下基本NN的代码训练逻辑,和NN的一些理论能够结合起来,让作者对代码能够认识的更清楚一些
2. 架构
- 包括输入层、卷积层、池化层、全连接层

如下图是一个7层卷积神经网络图

2.1. 卷积
- 下图对一个32323的图片,使用一个333的卷积核进行处理
- 卷积操作是将卷积核在图片中游走,在游走到某个位置时,执行的操作是对应位置的元素进行相乘再相加(下图右边以3*3的核进行的卷积,只表达了两维的概念)
- 注意:卷积核的第三个维度一定和输入特征的第三个维度相同

- 对于一个三维核,可将第三维展开,例如如下图一个图片的第三维代表RGB三种颜色值,使用一个333的卷积核进行卷积计算,可以展开成3个3*3的二维卷积

2.1.1. 单卷积层(多Channel输出)
- 对一个输入图片32323,每个卷积5*5的卷积核,会对应生成一个二维特征图,也叫 一个channel
- 可以使用多个卷积核,生成多个二维图,即如下图右边多个平面,平面的数目即是输出channel的数目

2.2.2. 多层卷积(卷积堆叠)
- 实际应用中,不会只有一层卷积层,而是多层卷积堆叠而成
- 如下图,第一层卷积使用 5 ∗ 5 ∗ 3 5*5*3 5∗5∗3,第二层卷积使用 5 ∗ 5 ∗ 6 5*5*6 5∗5∗6
- 第一层卷积的输出是 28 ∗ 28 ∗ 6 28*28*6 28∗28∗6,28和6是怎么来的?
- 28来源于 32 − 5 + 1 32 - 5 + 1 32−5+1,其中5是卷积核的大小,且采用的卷积核滑动窗口为1
- 6是特征图的个数,这表明使用6个553的卷积核
- 第二层卷积的输出是 24 ∗ 24 ∗ 10 24*24*10 24∗24∗10,24和10是怎么来的?
- 24等于 28 − 5 + 1 28 -5 +1 28−5+1
- 10是特征图的个数,这里使用的是 5 ∗ 5 ∗ 6 5*5*6 5∗5∗6的卷积核

2.2.3. 卷积关键参数
- 滑动窗口步长:最常用是1,或者是2
- 边缘填充:边缘填充的圈数,填充0(目的是为了让原有边缘更靠内,确保边缘计算公平性)
- 卷积核大小:最常用是33,或者55
- 卷积核个数:生成特征图的个数
2.2.4. 卷积常用计算公式
- 一层卷积输出特征是多少?
- 以其中一维的长度举例,它等于 输入长度 + 2 ∗ 边缘填充 − 核大小 滑动窗口步长 + 1 \frac{输入长度 + 2 * 边缘填充 - 核大小}{滑动窗口步长} + 1 滑动窗口步长输入长度+2∗边缘填充−核大小+1
- 以输入 32 ∗ 32 ∗ 3 32*32*3 32∗32∗3图像为例,用 10 10 10个 5 ∗ 5 ∗ 3 5*5*3 5∗5∗3的卷积核filter来指定步长为1,边界填充为2,则最终卷积输出特征为 32 ∗ 32 ∗ 10 32*32*10 32∗32∗10,其长度计算为 32 + 2 ∗ 2 − 5 1 + 1 = 32 \frac{32 + 2*2 - 5}{1}+1=32 132+2∗2−5+1=32,宽度计算和长度计算等同。
- 一层卷积的参数有多少个?
- 用 10 10 10个 5 ∗ 5 ∗ 3 5*5*3 5∗


1万+

被折叠的 条评论
为什么被折叠?



