深度学习流程介绍&&个人理解(持续更新)

0.前言

本人假期正在参加ICARCV-2024轮胎检测赛时有幸需要系统了解深度学习,所以本文章会不定期进行修改,以达到真正的通俗易懂,相较于其他教程,本文章更多的是以一种我们普通大学生能看懂的文字去介绍,去体会深度学习到底是怎么实现的。所以理论部分会很少甚至没有。

由于比赛用到了何凯明的MAE以及meta-learn等知识,所以在跟大家说基础的同时可能会带两句

由于深度学习对我而言学起来很有难度,所以更新会慢,再次热切希望各位同志批评指正

注:本人教程基于pytorch进行代码编写,其余的我也没有了解过

Q:深度学习到底是要做些什么/深度学习背后的原理是什么?

A:在我看来,深度学习其实就是将我们待解决的问题归类为数学问题,通过一系列数学运算达到我们要的结果。其中的原理,不同的问题(例如:二分类,多分类等)是有不同的数学原理的,不过总结起来就是一句话:通过回归模型(线性,非线性)计算出最优解。

Q:深度学习如何知道自己身处于最优解的位置?

A:最优解分为全局最优解和局部最优解两类。从简单的讲起,我们首先定义了损失函数(Loss),Loss越大,表明我们当前计算出的理论值和真实值差距过大(欧氏距离过大),也就证明我们当前算的值正确率小,那么如何增大我们的正确率呢?(怎么减小loss呢?)那就需要我们的数学式子进行迭代计算,在迭代的过程中我们的结果距离真实正确的结果是越来越近的。我们先引出梯度的概念,梯度表示损失函数相对于模型参数的变化率。我们对loss进行求导得到loss的梯度,其值越小,表示模型在当前参数下损失函数的变化越小,因此梯度下降过程越慢。梯度为0时,证明我们的模型已经达到最优解。

BUT!在真实解决问题的时候我们还需要注意一个问题——当前虽然梯度为零,是理论上的最优解,不过我们不知道这个最优解是局部最优解(鞍点)还是全局最优解,此时我们就需要引入惯性、改变初始点进行验证了

1.流程概述

看过很多深度学习的教程以及文章,但是我没有见到过系统介绍深度学习大体流程到底是什么,怎么写,所以本流程概述主要来解决这个问题。

建议看本文章的顺序:先粗看第一部分,细看第二部分的2.0基础部分,再回来看第一部分

1.1数据集收集

正常比赛或者做任务的话数据集都已经给到我们了,不过自己做一个项目的话需要收集数据集的,数据集在代码里面文件夹通常名为:“dataset”,在使用现有数据集时请注意大多数情况下需要我们签写一个使用协议(内容基本就是禁止商用,只可以学术使用什么的)。

如果自己去制作数据集的话需要保证如下几点:

1.dataset中所有图片的大小、长宽、通道数(彩色是3,黑白是1)要保持一致

2.dataset文件夹的构成要一致并且满足接下来任务的要求

        eg:1. n way- m shot  : 常常用在分类问题上,数据集构成是一个训练集中有n类物品,每类物品有m张图片供你训练,不过这么表达是有问题的,按照正常理解5 way 1shot 的一个训练集里应该有5张图片,但是也会出现10张的情况,比如说轮胎印与轮胎,所以说一个训练集中(train)还可能会包含query文件夹和train文件夹,下图为本次比赛的文件夹构成。

              

                2.训练集图像,训练集标签,测试集图像,测试集标签(参考MINIST数据集,具体参考[ 数据集 ] MINIST 数据集介绍-CSDN博客

1.2数据集预处理

我这里所说的预处理其实是数据增强的意思,数据集过少的情况下我们可以通过如下方式进行数据增强

镜像和翻转:进行水平或垂直翻转,创建镜像图像,增加数据多样性。

旋转和缩放:进行旋转、缩放或裁剪,以增加对不同尺度和角度的变化的模型鲁棒性。

加噪声处理:向数据中添加随机噪声,如高斯噪声、随机剪裁、色彩变换等,使模型更能应对现实世界中的噪声和变化。

数据插值:通过线性或非线性插值方法来填充数据,特别适用于时间序列数据和缺失值处理。(没用过)

生成对抗网络:使用生成对抗网络生成与原始数据相似但略有差异的数据,以扩展数据集。(没用过)

样本合成:基于现有数据样本的属性,创造新的合成数据样本。(不推荐)

1.3确定待解决问题并确定合适的模型

深度学习网络模型通常由以下几个核心组成部分构成:

1. 输入层(Input Layer)

这是神经网络的第一层,接受原始数据,如图像、文本或数值。

2. 隐藏层(Hidden Layers)

包括多层非线性处理单元,如卷积层(Convolutional Layers,用于图像)、循环层(Recurrent Layers,用于序列数据)或全连接层(Fully Connected Layers),每一层对前一层的特征进行变换和提取。(具体见第二部分的网络模型介绍)

3. 激活函数(Activation Functions)

作用:是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。(人话:将前面加权求和过的输入值变成输出值)

例如ReLU、sigmoid或tanh等,它们为每个神经元引入非线性,使模型能够学习复杂的关系。

4. 池化层(Pooling Layers)

对于图像处理,这可以降低数据维度并保留关键信息,常用于减小计算量。

5. 权重矩阵和偏置(Weights and Biases)

网络学习的参数,通过反向传播算法调整优化模型性能。

6. 输出层(Output Layer)

取决于任务类型,比如对于分类任务可能是 softmax 层,对于回归任务则是线性层。

7. 损失函数(Loss Function)

评估模型预测结果与真实值之间的差距,如交叉熵损失,MSE等。

8. 优化器(Optimizer)

如梯度下降法(Gradient Descent)或其他更先进的算法,用于最小化损失函数。

9. 正则化(Regularization)

防止过拟合的技术,如L1、L2正则化或Dropout。

根据实际问题的不同可以参考下表选择相应的激活函数和损失函数

1.4 根据上述流程编写网络模型

这是我在编写文章过程中发现的关于pytorch的教程,各位有兴趣可以看看PyTorch 基础 · 深度学习入门之 PyTorch (gitbooks.io)

具体的代码到底怎么写可以去哔哩哔哩搜一下相关的教程,可以先从复现已经有的模型开始,在编写过程中可以切实感受一个模型需要写些什么,为什么这么写。

2. 部分神经网络模型介绍

2.0 神经网络基础知识

2.0.1 正向/反向传播

正向传播就是将信息从输入层-->隐藏层-->输出层,按照编写的网络正方向传播

反向传播是指输出层将误差(loss)通过隐藏层传递给输入层,而这里的误差是指output的结果与input中x对应的真实结果的差距,我们可以看到下图x不止一个,所以误差也不止一个,但是!我们在分析函数loss,也就是编写误差函数的大多数时候是将所有误差值进行分析,而不是单独拿出来一个误差进行分析。

误差的具体分析方法见第四部分

2.0.2损失函数Loss/Error与梯度

Loss作用:衡量模型好坏的决定性因素,不同的任务需要用到不同的损失函数

梯度定义:表示损失函数相对于模型参数的变化率

误差的具体分析方法见第四部分

Loss与梯度的关系:

1. 梯度下降:梯度下降是一种优化算法,用于逐步调整模型参数,以最小化损失函数。在每次迭代中,梯度下降根据损失函数的梯度来更新模型参数。梯度越小,表示模型在当前参数下损失函数的变化越小,因此梯度下降过程越慢。梯度为零时,表示模型已达到最优解。

2. 梯度上升:与梯度下降相反,梯度上升算法是为了最大化损失函数。在梯度上升过程中,算法会根据损失函数的梯度来更新模型参数,使梯度方向与损失函数的增大方向一致。

3. 梯度消失和梯度爆炸:在深度学习过程中,梯度消失和梯度爆炸是两个常见问题。梯度消失是由于梯度在反向传播过程中逐渐减小,导致权重更新幅度较小,从而使优化过程变得非常缓慢。梯度爆炸则是由于梯度过大,导致权重更新幅度过大,可能使模型无法收敛。为解决这些问题,可以采用一些技巧,如使用梯度裁剪、调整学习率、使用残差网络(ResNet)等。

4. 损失函数的曲线:损失函数的曲线可以反映模型在训练过程中的性能。通常,随着训练轮数的增加,损失函数值会逐渐减小。在优化过程中,梯度的大小和方向决定了模型参数的更新,从而影响损失函数的曲线。通过观察损失函数曲线,可以初步判断模型的训练效果和过拟合情况。

总之,深度学习模型训练时,loss(损失函数)与梯度之间存在密切关系。梯度下降和梯度上升算法分别用于最小化和最大化损失函数,而梯度消失和梯度爆炸是需要关注和解决的问题。通过调整学习率、使用梯度裁剪等方法,可以优化模型训练过程,提高模型性能。

【深度学习】loss与梯度与交叉熵的关系_损失函数梯度增大-CSDN博客

2.0.3 感知机

概念&意义:

感知机是由美国学者Frank Rosenblatt在1957年提出来的。是分类方法之一。因为感知机也是作为神经网络(深度学习)的起源的算法。是神经网络的基础。在了解神经网络和深度学习之前学习感知机的构造是非常有必要的。

感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型,输入为实例的特征向量,取+1 , -1;

感知机分为原始形式与对偶

上图来自:​​​​​​机器学习——感知机_机器学习——感知机 欲游山河-CSDN博客

如果我们光看定义会感觉非常难懂,接下来我会以图的形式呈现感知机是如何工作的 

单层感知机:

首先我们看上述定义,我们会发现括号里有x——输入 w——权重 b——偏置

所以我们猜测当输入之有一个x的时候首先对其加权,在处理完x后再加偏置b,当输入为多个的时候我们设x为(x1+x2+...),此时括号内变为(w(x1+x2+...)+b)我们继续猜测,为了完成分类任务,每个输入的x所加权重肯定是不一样的,不然加他干嘛?所以式子变成(ΣWiXi+b)将不同的输入和权重相乘求和结束后,我们还需要一个激活函数将其激活,所以我们在Σ后加一个激活函数sigmoid(σ(x))。至此,恭喜你创造了单层感知机。如下图所示。

这个单层到底是哪个层呢——从权重开始到激活函数σ是一层,我理解的就是看Σ和σ有几个,有几个就几层

2.0.4 BP神经网络(BackPropagation——反向传播网络)

BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。

首先我们来看上图绿色文字泡部分:大体分为Input(输入层)、隐藏层(Hidden)、Output(输出层)三部分,几乎下属所有模型基本都是以此为基本构成进行编写的

BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

单个神经元结构

图像出处: 深度学习(3)之经典神经网络模型整理:神经网络、CNN、RNN、LSTM-CSDN博客

2.1 CNN模型

2.1.1 LeNet5 模型 

诞生于1994年,是最早也是最经典的神经网络模型之一,当时没有GPU帮助训练,所以为了提高训练速度,Yann LeCun采用以下方法提高训练速度

convoluiton:卷积  subsampling:二次抽样 fullconnection:全连接 gaussianconnections:高斯连接

我们仔细观察会发现,input图像原大小是32*32,卷积后变成28*28,C1经过二次抽样变为14*14,此时图像是越来越小的,以此减小计算量,我们知道图片跟语言不一样,图片所含的信息量很小很杂,与语言这种信息量高度凝练对比如果对图片每一处都进行处理的话会浪费时间,并且训练效果也是一坨。从S4到C5我们发现图像被打平了,这是深度学习的一种处理方法,将二维或高维的temsor(张量)打平再进行计算。具体原因我也不清楚

Lenet5特征能够总结为如下几点:
(1)卷积神经网络使用三个层作为一个系列:卷积、池化、非线性
(2)使用卷积提取空间特征
(3)使用映射到空间均值下采样
(4)激活函数:tanh 或 sigmoid函数
(5)多层神经网络(MLP)作为最后的分类器
(6)层与层之间的稀疏链接矩阵避免大的计算成本

2.1.2 AlexNet 模型(现在没多大意义)

上图分了两层是因为当时用了两块GPU(由于当时机能限制,现在如果一块GPU不能解决那只能说明你这个模型有点问题)

主要技术点:
(1)使用RELU作为CNN的激活函数,解决了sigmoid在网络较深时的梯度弥散问题。这个我们以后会进行详细说明为什么RELU不会出现这个问题
(2)训练时使用了Dropout随机忽略一部分神经元,以避免模型过拟合。
(3)在CNN中使用重叠的最大池化,步长小于池化核,这样输出之间会有重叠和覆盖,提升了特征的丰富性。此前CNN普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊性效果。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈比较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,用两块GTX 580
(6)使用数据增强

2.1.3 VGG 模型

2.1.4 GoogleNet 模型(现在不会去用)

2.1.5 ResNet 模型(力荐)

CNN面临的一个问题就是,随着层数的增加,CNN的效果会遇到瓶颈,甚至会不增反降。这往往是梯度爆炸或者梯度消失引起的。

ResNet就是为了解决这个问题而提出的,因而帮助我们训练更深的网络。 它引入了一个 residual block(残差块):

这个残差块把某一层的激活值,直接一把抓到了后面的某一层之前 ,这个过程称之为“skip connection(跳跃连接)”。 这个做法,相当于把前面的信息提取出来,加入到当前的计算中,论文作者认为,这样的做法,可以 使神经网络更容易优化。事实上确实是这样。

通过这种residual block,他们成功地搭建了一个拥有 152层的CNN

深度学习(3)之经典神经网络模型整理:神经网络、CNN、RNN、LSTM-CSDN博客

2.2 RNN模型(循环神经网络)

前言——RNN的特点:

2.3 LSTM模型

2.4 GRU模型

3. 部分激活函数介绍

4. 部分损失函数介绍

番外:深度学习常见术语

维护时间:

1.        2024.7.28——第一第二部分编写

2.        2024.7.31——前言、第二完善

  • 32
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

巴依捞爷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值