深度学习资料梳理

1.概念

1.1 pipeline

一个基础的 深度学习的Pipeline 主要包含了下述 5 个步骤(5个步骤可以抽象为一个包括多个步骤的流水线式工作,从数据收集开始至输出我们需要的最终结果。):

  • (1).数据读取
  • (2).数据预处理
  • (3).创建模型(具体到模型也有相应的Pipeline,比如模型的具体构成部分:比如GCN+Attention+MLP的混合模型)
  • (4).评估模型结果
  • (5).模型调参

总之,深度学习的Pipeline 就是模型实现的步骤。深度学习现在的Pipeline 一般都比较强调模型的组件构成流程。

1.2 baseline

baseline意思是基线,这个概念是作为算法提升的参照物而存在的,相当于一个基础模型,可以以此为基准来比较对模型的改进是否有效。

通常在一些竞赛或项目中,baseline就是指能够顺利完成数据预处理、基础的特征工程、模型建立以及结果输出与评价,然后通过深入进行数据处理、特征提取、模型调参与模型提升或融合,使得baseline可以得到改进。

所以这个没有明确的指代,改进后的模型也可以作为后续模型的baseline。

1.3 backbone

backbone这个单词原意指的是人的脊梁骨,后来引申为支柱,核心的意思。

在神经网络中,尤其是CV领域,一般先对图像进行特征提取(常见的有vggnet,resnet,谷歌的inception),这一部分是整个CV任务的根基,因为后续的下游任务都是基于提取出来的图像特征去做文章(比如分类,生成等等)。

所以将这一部分网络结构称为backbone十分形象,仿佛是一个人站起来的支柱。

1.4 CNN中feature map的含义

在每个卷积层,数据都是以三维形式存在的。你可以把它看成许多个二维图片叠在一起,其中每一个称为一个feature map。在输入层,如果是灰度图片,那就只有一个feature map;如果是彩色图片,一般就是3个feature map(红绿蓝)。层与层之间会有若干个卷积核(kernel),上一层和每个feature map跟每个卷积核做卷积,都会产生下一层的一个feature map。

1.5 epoch、 iteration和batchsize

  • (1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
  • (2)iteration:1个iteration等于使用batchsize个样本训练一次;
  • (3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

举个例子,训练集有1000个样本,batchsize=10,那么:训练完整个样本集需要:100次iteration,1次epoch。

1.6 “输入通道”与“输出通道”

img

输入通道指的是输入了几个二维信息,也就是很直观的rgb图有r,g,b三个通道,这决定了卷积核的通道数,即输入图像的通道数决定了卷积核通道数;(图片中,第一列有三个矩阵,也就是输入通道为3,所以后面,第二列和第三列,也就是两个卷积核,它们也都有三个矩阵,即卷积核通道数目也为3。)

输出通道是指卷积(关联)运算之后的输出通道数目,它决定了有几个卷积核,即需要输出通道数为几,就需要几个卷积核。(图中,第二列和第三列分别都是三通道的卷积核,输入图像与这两个卷积核做完卷积运算后,产生了第四列的两个矩阵,也就是输出了两个通道)

最后说一下动图演示的事情,输入一个三通道图像,和两个三通道的卷积核做了卷积运算,得到两个输出通道。

题外话:

每个卷积核具有长、宽、深三个维度。

卷积核的长、宽都是人为指定的,长X宽也被称为卷积核的尺寸,常用的尺寸为3X3,5X5等;
卷积核的深度与当前图像的深度(feather map的张数)相同,所以指定卷积核时,只需指定其长和宽两个参数

例如:在原始图像层 (输入层),如果图像是灰度图像,其feather map数量为1,则卷积核的深度也就是1;如果图像是grb图像,其feather map数量为3,则卷积核的深度也就是3.

例如:输入224x224x3(rgb三通道),输出是32位深度,卷积核尺寸为5x5。

那么我们需要32个卷积核,每一个的尺寸为5x5x3(最后的3就是原图的rgb位深3),每一个卷积核的每一层是5x5(共3层)分别与原图的每层224x224卷积,然后将得到的三张新图叠加(算术求和),变成一张新的feature map。 每一个卷积核都这样操作,就可以得到32张新的feature map了。 也就是说:

不管输入图像的深度为多少,经过一个卷积核(filter),最后都通过下面的公式变成一个深度为1的特征图。不同的filter可以卷积得到不同的特征,也就是得到不同的feature map。

1.7 训练集、测试集、验证集

训练集(train set) —— 用于模型拟合的数据样本。

验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。

测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。

一个形象的比喻:

训练集:学生的课本;学生 根据课本里的内容来掌握知识。

验证集:作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。

测试集:考试,考的题是平常都没有见过,考察学生举一反三的能力。

2.疑问点

以下部分的内容来源于网络查找,若有不恰当的地方,希望大佬提出。

2.1 卷积神经网络中为什么要在卷积层后面添加激活函数?

简单的说:增加非线性,即使得输入与输出之间保持非线性的关系。如果不加激活函数,神经元永远只能拟合线性的情况...没办法拟合高维数据。(如果只是想浅了解一下,后面的可以不看了)

原理

卷积操作是一种线性的仿射变换(什么是仿射变换呢?仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间)

以下是卷积过程:

v2-3887b91d142fac4034ec1170e5fdf2b6_720w

更一般的,我们如果有输入图片x和卷积核w以及输出图片y,它们的各个值为:

img

由于输出像素是由输入像素和卷积核得到的,所以输出图片的各个像素可以写成:

img

列出来后,可以看出,这和多元线性回归的式子没有什么区别!我们甚至可以把上面的式子写成向量的形式:

Y=WTX

相当于将图片xy展开成一维的形式:

v2-28ad6d74c553cee720bdbeb80b623984_720w

就可以把原式看成向量XY的线性方程组。

从这里应该可以看出,卷积核可以表示成一种特殊的多元线性回归的权重矩阵;由于权重矩阵有大量的参数是一样的,且有大量的0,所以可以把权重矩阵的系数都压缩到一个卷积核中又不损失信息。卷积的这种数学操作的特点又保留了图片的空间信息,所以卷积是一种开销小于全连接层,但效果较好的操作。

所以在神经网络学习参数中,可以把对卷积核的拟合视为一种对神经元权重的拟合,只是神经元之间会以某种方式连接并且共享大量参数。

也可以很自然的推导出,如果没有池化层等非线性操作,那么多层卷积就等同于一层卷积,只靠卷积操作无法拟合任意函数。

2.2 卷积神经网络卷积层后一定要跟激活函数吗?

这个问题是上一个问题的引申,卷积神经网络卷积层后是不一定要跟激活函数的。

解释:

卷积神经网络卷积层后是否加激活函数是根据数据集来定的:如果是图像类,需要得到复杂深度特征,需要非线性激活,那就要加激活。而如果是处理一维信号,比如振动数据,音频数据,很多时候不加激活效果会好上不少。尤其是工业故障数据,很多时候本身就是线性可分的,网络越复杂效果越差。

我觉得这个问题几本上没有什么好纠结的,我们都知道一般的机器学习算法,比如决策树算法,支持向量机,这些算法都只能解决线性可分的问题,当遇到线性不可分的问题时便没法了,而神经网络为何如此强大的原因一部分就归结于其引入了激活函数,使得函数经过隐藏层之间的层层调用,变成了线性可分的了。假如不跟激活函数,层层之间的数据传递也只是前面的x的参数多点而已,达不到将x变成高次方的目的,不能变成高次方不能函数的形状就还是直线型,还是线性的。

3.代码相关(pytorch版)

以下仅为自己写代码时的方式:

3.1 写代码的流程

确定输出目标—》选择数据-》数据预处理(通常是转化为张量)—》提取特征(构建主干网络模型提取)—》模型训练(不可视的,将标准输入数据经过模型得到输出数据,然后与标准输出数据比对,再利用修改参数,再去训练,直到比对正确)—》模型评估与优化—》模型预测结果—》输出目标转换

3.2 代码的组织结构

3.2.1 主要部分

当一个程序代码长度过长,就可以拆分成几个文件,方便阅读和修改,代码拆分数据如下:

preprocess:数据预处理

对数据进行预处理的文件,将数据转为backbone想要接收的格式与类型。

backbone:提取特征

翻译为主干网络的意思,既然说是主干网络,就代表其是网络的一部分,那么是哪部分呢?这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,供后面的网络使用。这些网络经常使用的是resnet、VGG等,而不是我们自己设计的网络,因为这些网络已经证明了在分类等问题上的特征提取能力是很强的。在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。

neck:承上启下

是放在backbone和head之间的,是为了更好的利用backbone提取的特征。

bottleneck:转化输出

瓶颈的意思,通常指的是网网络输入的数据维度和输出的维度不同,输出的维度比输入的小了许多,就像脖子一样,变细了。经常设置的参数 bottle_num=256,指的是网络输出的数据的维度是256 ,可是输入进来的可能是1024维度的。

head:预测思考

head是获取网络输出内容的网络,利用之前提取的特征,head利用这些特征,做出预测。

3.2.2 次要部分

pretext task和downstream task:

用于预训练的任务被称为前置/代理任务(pretext task),用于微调的任务被称为下游任务(downstream task)

热身Warm up

Warm up指的是用一个小的学习率先训练几个epoch,这是因为网络的参数是随机初始化的,一开始就采用较大的学习率容易数值不稳定。

end to end

在论文中经常能遇到end to end这样的描述,那么到底什么是端到端呢?其实就是给了一个输入,我们就给出一个输出,不管其中的过程多么复杂,但只要给了一个输入,机会对应一个输出。比如分类问题,你输入了一张图片,肯呢个网络有特征提取,全链接分类,概率计算什么的,但是跳出算法问题,单从结果来看,就是给了一张输入,输出了一个预测结果。End-To-End的方案,即输入一张图,输出最终想要的结果,算法细节和学习过程全部丢给了神经网络。

3.3 代码解读

大家直接去看大佬JacobDale的博客就可

3.4 代码测试:探索numworkers和batch_size之前的关系

错误提示:页面文件太小,无法完成操作,是因为numworkers设置过大,因为每次dataloader加载数据时:dataloader一次性创建num_worker个工作进程,导致内存占用不足,除非提高cpu内存大小。

(num_worker设置得大,好处是寻batch速度快,提升训练速度,但是如果显卡计算慢的话,提升num_workers可能会适得其反)

最好的办法是缓慢增加num_workers,直到训练速度不再提高,就停止增加num_workers的值

错误提示:RuntimeError: CUDA Out of memory,是因为显存超了,只需要调整batchsize即可

4.参考文章

深度学习pipeline和baseline是什么意思?

深度学习网络中backbone和feature map的含义

batch size设置技巧 谈谈batchsize参数_

关于卷积神经网络中的“输入通道”和“输出通道”的概念

卷积层、卷积核 - Tomorrow1126 - 博客园

卷积神经网络中为什么要在卷积层后面添加激活函数? - 知乎

卷积神经网络卷积层后一定要跟激活函数吗? - 知乎

t-SNE:最好的降维方法之一 - 知乎

深度学习建模预测全流程(Python)!

backbone、head、neck等深度学习中的术语解释 - 知乎

https://blog.csdn.net/zouxiaolv/article/details/109530461

optimizer.zero_grad()的作用

(8条消息) pytorch之dataloader,enumerate

【创作不易,望点赞收藏,若有疑问,请留言,谢谢】

posted @   东血  阅读(427)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

本站勉强运行 1780 天 21 小时 49 分 19 秒

点击右上角即可分享
微信分享提示
目录导航
目录导航
深度学习资料梳理
1.概念
1.1 pipeline
1.2 baseline
1.3 backbone
1.4 CNN中feature map的含义
1.5 epoch、 iteration和batchsize
1.6 “输入通道”与“输出通道”
1.7 训练集、测试集、验证集
2.疑问点
2.1 卷积神经网络中为什么要在卷积层后面添加激活函数?
2.2 卷积神经网络卷积层后一定要跟激活函数吗?
3.代码相关(pytorch版)
3.1 写代码的流程
3.2 代码的组织结构
3.2.1 主要部分
3.2.2 次要部分
3.3 代码解读
3.4 代码测试:探索numworkers和batch_size之前的关系
4.参考文章
发布于 2022-10-02 11:29