深度学习
- 主要参考博客
- 常用英语单词
- 概念
- 应用
- 神经网络基础
- 神经网络基本结构
- 超参数
- 超参数是什么
- 常用超参数
- 超参数搜索过程
- 常用超参数调优办法(通过问题复杂度和计算资源选择)
- 激活函数
- 介绍
- 为什么要使用激活函数
- 推荐博客
- sigmoid激活函数(使用较少)
- 数学表达式
- 什么情况下适合使用Sigmoid?
- Sigmoid有哪些缺点?
- ReLU激活函数(最常用)
- 介绍
- 数学表达式
- 优势
- 优化器
- 梯度下降思想
- 学习率
- SGD(随机梯度下降)
- 基本介绍
- SGD with momentum
- Adam(改进SGD)
- Adam-Adaptive + Momentum
- 损失函数
- Focal Loss(焦点损失)
- Dice Loss
- focal_loss和dice_loss总结
- 权重衰减weight_dacay--正则化技术
- 什么是权重衰减 (Weight Decay):
- 为什么使用权重衰减:
- CNN卷积神经网络
- 关键概念
- 主干网络
- VGG-16 结构
- VGG-16 训练过程
- ResNet
- BN层
- 有BN层时谨慎选取batch_size
- backbone
- 训练过程名词解释
- num_classes
- 训练轮次Epoch
- 训练步长step
- batch_size
- batch_size的设置:
- 关系
- 评价指标
- mIOU
- model_path
主要参考博客
参考博客1
参考博客2
参考博客3
常用英语单词
看论文时一些反复的单词(和DeepLearning知识点无关,可跳过)
resolution 分辨率,清晰度
annotate 给…作注解
corpus 语料库
augmentation 增强
segmentation 分割
margin (领先的)幅度
seamless 连续的
tile 视窗
stochastic 随机的
entropy 混乱,无序
概念
深度学习是机器学习的一个分支。
可以理解为具有多层结构的模型。具体的话,深度学习是机器学习中的具有深层结构的神经网络算法,即机器学习>神经网络算法>深度神经网络(深度学习)。
深度学习(deep learning,以下简称DL)是基于人工神经网络的机器学习。区别于传统的机器学习,DL需要更多样本,换来更少的人工标注和更高的准确率。
传统的BP神经网络一般指三层的全连接神经网络,而大于三层就成了DNN(深度神经网络)。
事实上,DNN能解决一些问题,但因为参数太多,逐步被其他网络模型取代:CNN(卷积神经网络)、RNN(循环神经网络)。二者目前最成功的实现分别是ResNet和LSTM。
下文只讨论CNN相关。
应用
-
计算机视觉:
-
图像分类:深度学习模型可以自动将图像分为不同的类别,例如识别猫、狗、汽车等。
-
目标检测:通过深度学习,我们可以检测图像中的多个物体,并确定它们的位置。
-
人脸识别:深度学习在人脸识别领域取得了巨大成功,例如用于解锁手机或安全门禁系统。
-
图像分割:将图像分成不同的区域,每个区域对应不同的物体或背景。
-
对话式 AI:
-
聊天机器人:深度学习模型可以理解用户的自然语言输入并生成有意义的回复。
-
智能助手:例如 Siri、Cortana 和 Google Assistant,它们使用深度学习来执行任务、回答问题和提供建议。
-
自然语言处理:深度学习用于文本分类、命名实体识别、情感分析等。
-
推荐系统:
-
个性化推荐:深度学习模型分析用户的历史行为,例如购买记录、点击率等,以提供个性化的推荐。
-
音乐推荐:通过分析用户的音乐偏好,深度学习可以推荐类似的歌曲或艺术家。
-
社交媒体:深度学习帮助社交媒体平台为用户推荐感兴趣的内容。
神经网络基础
参考博客
神经网络的结构通常由多个层组成,每一层都包含许多神经元(或节点)。
神经网络基本结构
-
输入层(Input Layer):接收原始数据作为输入,例如图像像素、文本向量等。每个输入特征对应一个输入神经元。
-
隐藏层(Hidden Layers):这些层位于输入层和输出层之间。每个隐藏层包含多个神经元,它们通过权重连接在一起。隐藏层的数量和大小可以根据任务和模型进行调整。
-
输出层(Output Layer):输出层通常用于分类、回归或其他任务。每个输出神经元对应一个类别或预测值。
-
连接权重(Weights):每个连接都有一个权重,用于调整输入信号在神经元之间的传递。这些权重在训练过程中进行优化。
-
激活函数(Activation Functions):激活函数决定神经元是否激活并传递信号。常见的激活函数包括ReLU、Sigmoid和Tanh。
-
反向传播(Backpropagation):通过计算损失函数的梯度,反向传播算法更新连接权重,以便网络逐渐优化预测结果。
超参数
参考博客
超参数是什么
超参数是在算法运行之前手动设置的参数,用于控制模型的行为和性能。超参数的选择会影响到模型的训练速度、收敛性、容量和泛化能力等方面。例如,学习率、迭代次数、正则化参数、隐藏层的神经元数量等都是常见的超参数。超参数的选择通常是一个试错的过程,需要根据经验和领域知识进行调整。
常用超参数
- 学习率(Learning Rate) 这是影响模型训练速度和稳定性的关键参数。学习率设置得过大可能会导致模型无法收敛,设置得过小则会使训练过程过于缓慢。
- 动量参数(Momentum) 这是用于加速梯度下降的参数,可以增加梯度的方向性,从而帮助模型更快地收敛。
- 网络层数(Number of Layers) 这是决定模型复杂度和表达能力的参数。一般来说,增加网络层数可以使模型更好地学习复杂的特征,但同时也增加了模型的参数数量和计算复杂度。
- 隐层节点数(Number of Hidden Nodes) 这是决定模型隐层大小和表达能力的参数。一般来说,增加隐层节点数可以使模型更好地学习复杂的特征,但同时也增加了模型的参数数量和计算复杂度。
- 学习率下降幅度(Learning Rate Decay) 这是用于控制学习率在训练过程中下降的参数。通过逐渐降低学习率,可以让模型在训练后期更加精细地逼近最优解。
- mini-batch大小(Mini-batch Size) 这是决定每次更新时使用梯度下降的样本数量的参数。一般来说,使用较大的mini-batch可以提高训练速度和稳定性,但可能会降低模型的泛化能力。
- 正则化参数(Regularization Parameters) 这是用于控制正则化效果的参数,可以防止过拟合现象的发生。常用的正则化方法包括L1正则化、L2正则化和Dropout等。
- 批处理次数(Number of Batches) 这是决定每次训练过程中进行梯度更新的次数的参数。一般来说,增加批处理次数可以提高训练速度和稳定性,但可能会增加计算资源和时间成本。
- 优化器选择(Optimizer) 这是用于优化神经网络权重的算法选择。常用的优化器包括梯度下降法、随机梯度下降法、Adam等。
- 初始权重设置(Initial Weights) 这是用于初始化神经网络权重的参数。不同的初始权重设置可能会影响模型的收敛速度和最终性能。
超参数搜索过程
超参数搜索一般过程:
- 将数据集划分成训练集、验证集及测试集。
- 在训练集上根据模型的性能指标对模型参数进行优化。
- 在验证集上根据模型的性能指标对模型的超参数进行搜索。
- 步骤 2 和步骤 3 交替迭代,在每组参数上训练模型,并使用交叉验证或测试集评估性能。选择性能最好的参数组合作为最终模型。
常用超参数调优办法(通过问题复杂度和计算资源选择)
- 网格搜索:穷举地在超参数空间中搜索,计算每组参数在验证集上的表现,并选择表现最好的参数组合。
- 随机搜索:随机采样一组参数,训练模型并计算验证集上的性能,重复多次,选择表现最好的参数组合。
- 贝叶斯优化:利用贝叶斯定理和最优化方法寻找全局最优解,适用于高维、高成本、有限样本的优化问题。
激活函数
介绍
激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端,旨在帮助网络学习数据中的复杂模式。
为什么要使用激活函数
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。使用激活函数能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,使深层神经网络表达能力更加强大,这样神经网络就可以应用到众多的非线性模型中。
- 引入非线性特性:如果没有激活函数,神经网络将只是一系列线性变换的组合,无法捕捉复杂的非线性关系。激活函数引入非线性,使神经元能够学习更复杂的函数。
- 解决梯度消失问题:激活函数的非线性性质有助于避免梯度消失。在反向传播过程中,梯度会逐层传递,如果没有非线性激活函数,梯度可能会迅速趋近于零,导致网络无法学习。
- 增加网络的表达能力:激活函数允许神经元对输入数据进行变换,从而增加了网络的表达能力。不同类型的激活函数可以捕捉不同的特征。
推荐博客
sigmoid激活函数(使用较少)
数学表达式
f ( x ) = 1 1 + e − x f(x)= \frac{1}{1+e^{-x}} f(x)=1+e−x1
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x)=f(x)(1-f(x)) f′(x)=f(x)(1−f(x))
什么情况下适合使用Sigmoid?
- Sigmoid 函数的输出范围是 0 到 1。非常适合作为模型的输出函数用于输出一个0~1范围内的概率值,比如用于表示二分类的类别或者用于表示置信度。
- 梯度平滑,便于求导,也防止模型训练过程中出现突变的梯度
Sigmoid有哪些缺点?
-
容易造成梯度消失。我们从导函数图像中了解到sigmoid的导数都是小于0.25的,那么在进行反向传播的时候,梯度相乘结果会慢慢的趋向于0。这样几乎就没有梯度信号通过神经元传递到前面层的梯度更新中,因此这时前面层的权值几乎没有更新,这就叫梯度消失。除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。如果初始化权重过大,可能很多神经元得到一个比较小的梯度,致使神经元不能很好的更新权重提前饱和,神经网络就几乎不学习。
-
函数输出不是以 0 为中心的,梯度可能就会向特定方向移动,从而降低权重更新的效率
-
Sigmoid 函数执行指数运算,计算机运行得较慢,比较消耗计算资源。
ReLU激活函数(最常用)
介绍
ReLU(Rectified Linear Unit)是一种常用的激活函数,全称为修正线性单元。它的主要作用是将输入值限制在一个非负的范围内。具体而言,当输入值小于0时,输出值为0;当输入值大于等于0时,输出值等于输入值本身。
数学表达式
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
优势
相比于传统的神经网络激活函数,如逻辑函数(Logistic sigmoid)和tanh等双曲函数,ReLU函数有以下几方面的优势
- 仿生物学原理:研究表明生物神经元的讯息编码通常是比较分散及稀疏的,而ReLU模拟了这种分散性。
- 更加有效率的梯度下降:避免了梯度爆炸和梯度消失问题。
- 简化计算过程:没有了其他复杂激活函数中诸如指数函数的影响,同时活跃度的分散性使得神经网络整体计算成本下降。
优化器
本代码使用了Adam优化
梯度下降思想
梯度下降是经典的优化算法,它的思想是:参数在更新时始终朝着目标函数(最小化问题)下降最快的方向移动,而这个方向就是梯度(梯度是上升最快的方向)的反方向,用公式可以表达为 θ t = θ t − 1 − η ∇ L ( θ t − 1 ) \theta_t = \theta_{t-1} - \eta\nabla L(\theta_{t-1}) θt=θt−1−η∇L(θt−1), ∇ L ( θ t − 1 ) \nabla L(\theta_{t-1}) ∇L(θt−1)是损失函数 L L L对第 t − 1 t-1 t−1时刻的参数 θ t − 1 \theta_{t-1} θt−1的梯度, η \eta η学习率是一个超参数,需要人为设定,通常设为0.001、0.01等。
算法的流程非常简单:初始化参数向量 θ 0 \theta_0 θ0,然后根据该公式不断更新梯度,使得损失函数收敛到较低水平时停止。
学习率
在机器学习和统计学中,学习率(英语:Learning rate)是优化算法中的一个可调参数,它决定了每次迭代的步长,使得优化向损失函数的最小值前进。学习率影响到新学习到的信息在多大程度上取代了旧信息,暗示了机器学习模型“学习”的速度。
具体来说,学习率在梯度下降法(Gradient Descent)或其变种(如随机梯度下降,Stochastic Gradient Descent, SGD)中扮演着核心角色。在每次迭代过程中,模型计算损失函数关于各个参数的梯度,这个梯度指示了参数应当朝着哪个方向调整以最小化损失。学习率就是这个调整过程中的“步伐”大小,即参数更新的量。
数学表达式通常如下所示:
θ t + 1 \theta_{t+1} θt+1= θ t \theta_{t} θt - η ⋅ ∇ θ J ( θ t ) \eta \cdot \nabla_{\theta} J(\theta_t) η⋅∇θJ(θt)
其中:
- θ t \theta_t θt 是在时间步 t t t 时模型的参数。
- η \eta η是学习率。
- ∇ J ( θ t ) \nabla J(\theta_t) ∇J(θt) 是在当前参数下损失函数 J J J 关于参数 θ t \theta_t θt 的梯度。
如果学习率设置得过大,模型参数可能会跨过最优解,导致震荡或发散,这被称为“振荡现象”或“不稳定性”。相反,如果学习率设置得太小,模型收敛到最优解的速度将会非常慢,而且可能会陷入局部极小点,而不是全局最优解。因此,选择合适的学习率对于模型的训练效果至关重要。
学习率参考博客
参考博客
SGD(随机梯度下降)
基本介绍
原理:SGD使用每个样本的梯度来更新模型参数,适用于大规模数据集。
优点:简单易用,内存占用小。
缺点:下降速度慢,可能在局部最优点附近震荡。
适用场景:当你有足够的时间和资源来精细调整学习率时,或者模型训练出现过拟合时,SGD可能更合适。
SGD with momentum
为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量: m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t = \beta_1\cdot m_{t-1} + (1-\beta_1)\cdot g_t mt=β1⋅mt−1+(1−β1)⋅gt
一阶动量是各个时刻梯度方向的指数移动平均值,约等于最近 1 1 − β 1 \frac{1}{1-\beta_1} 1−β11 个时刻的梯度向量和的平均值。也就是说,t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。
Adam(改进SGD)
原理:Adam是改进的SGD,结合了动量和自适应学习率。
优点:易于使用,收敛速度快,适用于复杂模型和计算资源有限的情况。
缺点:可能不收敛,也可能错过全局最优解。
适用场景:需要快速得到结果的场景,或者对稀疏数据具有优势。
Adam-Adaptive + Momentum
SGD的一阶动量: m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t = \beta_1\cdot m_{t-1} + (1-\beta_1)\cdot g_t mt=β1⋅mt−1+(1−β1)⋅gt
加上AdaDelta的二阶动量: V t = β 2 ⋅ V t − 1 + ( 1 − β 2 ) ⋅ g t 2 V_t = \beta_2\cdot V_{t-1} + (1-\beta_2)\cdot {g^2_t} Vt=β2⋅Vt−1+(1−β2)⋅gt2
优化算法里最常见的两个超参数 β 1 , β 2 \beta_1,\beta_2 β1,β2就都在这里了,前者控制一阶动量,后者控制二阶动量。
推荐机器学习博客
损失函数
参考博客
本代码在标注USB接口时主要使用了focal_loss和dice_loss两个函数(都是封装好的,可以直接调用)
Focal Loss(焦点损失)
用于处理类别不平衡和困难样本的问题,在多目标检测任务中表现良好。
- 适用场景:处理类别不平衡问题的多分类任务,特别是存在少数类别的情况下。
- 设计目标:解决类别不平衡问题,即某些类别的样本数量远远多于其他类别的情况。
- 计算方式:对于每个样本,它的损失由以下公式给出:
Focal Loss = − α ⋅ ( 1 − p t ) γ ⋅ log ( p t ) \text{Focal Loss} = -\alpha \cdot (1 - p_t)^\gamma \cdot \log(p_t) Focal Loss=−α⋅(1−pt)γ⋅log(pt)
其中:
p t p_t pt是预测的概率(softmax 输出)。
α \alpha α是平衡因子,用于调整不同类别的权重。
γ \gamma γ是焦点因子,用于调整易分样本和难分样本的权重。
Focal Loss(不太重要)
Dice Loss
主要用于图像分割任务中,适用于处理正负样本不平衡的情况。
- 设计目标:用于图像分割任务,特别是像素级别的分割。
- 适用场景:在分割任务中,例如语义分割、医学图像分割等。
- 计算方式:对于每个样本,它的损失由以下公式给出:
Dice Loss = 1 − 2 ⋅ ∑ i y i ⋅ y ^ i ∑ i y i 2 + ∑ i y ^ i 2 \text{Dice Loss} = 1 - \frac{2 \cdot \sum_{i} y_i \cdot \hat{y}_i}{\sum_{i} y_i^2 + \sum_{i} \hat{y}_i^2} Dice Loss=1−∑iyi2+∑iy^i22⋅∑iyi⋅y^i
其中:
y i y_i yi是真实标签的二进制值。
y ^ i \hat{y}_i y^i是预测的二进制值。
focal_loss和dice_loss总结
focal_loss
和 dice_loss
都是用于训练神经网络的损失函数,但它们的设计目标和计算方式有所不同。
focal_loss
用于解决类别不平衡问题,而 dice_loss
用于图像分割任务。选择哪个损失函数取决于具体问题和数据集。如果任务是图像分割,那么 dice_loss
可能更适合。如果任务是多类别分类,可以考虑使用 focal_loss
。
权重衰减weight_dacay–正则化技术
Weight Decay(权重衰减)是深度学习中常用的正则化技术之一,用于抑制模型的过拟合,从而提高模型的泛化性。
什么是权重衰减 (Weight Decay):
权重衰减通过给损失函数增加模型权重的L2范数惩罚(penalty)来实现的。目的是让模型权重不要太大,从而减小模型的复杂度,抑制过拟合。
具体来说,它在原始损失函数的基础上添加一个正则化项,惩罚模型参数的复杂度。这样可以使模型学习到更简单的表示,提高泛化性能。
为什么使用权重衰减:
在深度学习中,模型的权重越小,模型的复杂度越低。通过权重衰减,我们可以降低模型的复杂度,使其变得平滑,从而减小过拟合的风险。
通常,权重衰减的强度(λ)在 1 0 − 4 10^{-4} 10−4到 1 0 − 2 10^{-2} 10−2之间,可以根据任务和模型复杂度进行调整
CNN卷积神经网络
卷积神经网络(Convolutional Neural Network,简称CNN)是一种在计算机视觉领域取得巨大成功的深度学习模型¹。它的设计灵感来自于生物学中的视觉系统,旨在模拟人类视觉处理的方式。
关键概念
-
图像原理:图像在计算机中是一堆按顺序排列的数字,数值范围通常是0到255。这些数字表示像素的强度值。图像可以是灰度图(只有黑白颜色)或RGB图(红、绿、蓝三原色的组合)。在RGB图中,每个颜色通道都可以看作是一个矩阵,用宽、高和深度来描述。
-
为什么要学习卷积神经网络?:传统神经网络在识别不同位置的图像时可能会遇到问题,因为它们无法捕捉到图像中的局部特征。为了实现平移不变性,CNN使用卷积操作来捕捉局部特征,而不受其位置的影响。这使得CNN在图像识别、目标检测等任务中表现出色。
-
什么是卷积?:在CNN中,卷积操作是指将一个可移动的小窗口(数据窗口)与图像进行逐元素相乘然后相加的操作。这个小窗口包含一组固定的权重,也被称为滤波器或卷积核。卷积操作可以提取图像中的局部特征,而不受其位置的影响。这一操作是卷积神经网络名字的来源。
-
卷积神经网络的构造:CNN由多个卷积层、池化层和全连接层组成。卷积层用于提取特征,池化层减小特征图的大小,全连接层将特征映射转化为最终输出。多层堆叠的CNN可以逐渐提取更高级别的特征,用于分类、回归等任务。
-
卷积层:卷积层是CNN的核心组件。它使用卷积操作来提取图像中的局部特征。每个卷积层包含多个滤波器,每个滤波器都会在图像上滑动并计算卷积。这些滤波器可以捕捉不同方向、颜色和纹理的特征。卷积层的输出称为特征图。
-
池化层:池化层用于减小特征图的大小,同时保留重要的特征。最常见的池化操作是最大池化,它选择每个区域中的最大值作为输出。这有助于减少计算量,并使模型对平移更加稳定。
-
全连接层:在卷积层和池化层之后,我们通常添加一个或多个全连接层。全连接层将特征映射转化为最终的输出。例如,在图像分类任务中,全连接层将特征映射到不同类别的概率。
-
训练和优化:CNN的训练通常使用反向传播算法,通过最小化损失函数来调整权重。常用的优化算法包括随机梯度下降(SGD)、Adam等。
-
激活函数:在卷积层和全连接层之间,我们通常使用激活函数来引入非线性。常见的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid。它们有助于模型学习复杂的特征。
-
批量归一化(Batch Normalization):这是一种用于加速训练和提高模型性能的技术。它通过规范化每个批次的输入来稳定模型的训练过程。
-
迁移学习:迁移学习是指使用预训练的CNN模型(例如在ImageNet上训练的模型)作为基础,然后微调它以适应特定任务。这可以加快训练速度并提高模型的性能。
-
卷积神经网络的应用:除了图像处理,CNN还在自然语言处理、语音识别、医学图像分析等领域得到广泛应用。
主干网络
VGG-16 结构
VGG 网络的核心思想是通过堆叠多个卷积层来构建深度网络,从而提高图像识别性能。以下是 VGG-16 的详细结构:
- 输入层:接受一张大小为 224x224x3 的 RGB 图像。
- 卷积层:VGG-16 有 13 个卷积层,每个卷积层都使用 3x3 的卷积核。这些卷积层之间没有跳跃连接,因此网络非常深。
- 池化层:在每两个卷积层之间,VGG-16 使用最大池化层来减小特征图的尺寸。这有助于提取更高级别的特征。
- 全连接层:在卷积和池化之后,VGG-16 使用三个全连接层。最后一个全连接层输出分类的概率分布。
VGG-19 与 VGG-16 类似,但具有更多的卷积层(19 个)。这使得 VGG-19 更深,但也更复杂。
参考论文
VGG网络结构 ↑ \uparrow ↑
VGG-16 训练过程
-
获取数据集:首先,准备一个图像数据集,其中包含要识别的类别。这可以是自定义数据集,也可以是公共数据集,例如 ImageNet。
-
导入预训练模型:VGG16 已经在大规模图像数据上进行了预训练。可以从 Keras 或其他深度学习库中导入预训练的 VGG16 模型。这个模型已经学会了一些通用的图像特征。
-
微调模型:可以将预训练的 VGG16 模型用作起点,然后微调它以适应特定任务。微调包括以下步骤:
- 冻结预训练层:首先,冻结 VGG16 的卷积层,以防止它们在训练过程中被更新。
- 添加自定义层:在 VGG16 之上添加自定义的全连接层,用于输出类别。
- 训练:使用数据集对模型进行训练。可以使用梯度下降等优化算法来更新权重。
-
评估性能:在训练完成后,使用测试集评估模型的性能。可以计算准确率、精确度、召回率等指标。
-
调整超参数:根据评估结果,可以调整模型的超参数,例如学习率、批量大小等。
ResNet
参考博客1
参考博客2
ResNet是一种深度残差网络,用于图像分类和特征提取。
-
背景:在深度学习中,随着网络层数的增加,理论上其表达能力会增强。然而,实际上,随着网络层数的增加,分类性能不会提高,反而会导致网络收敛变慢、准确率下降。这被称为“退化问题”。
-
残差网络(ResNet)的解决方案:Kaiming 等人在 2015 年提出了残差网络(ResNet),用于解决退化问题。ResNet 引入了“残差块”,允许网络在不损失性能的情况下增加深度。
-
ResNet-50 结构:ResNet-50 是 ResNet 的一个变体,具有 50 层。它由四个大的 Block 组成,每个 Block 包含多个小的 Bottleneck 结构。具体来说,ResNet-50 有 3、4、6、3 个 Bottleneck,每个 Bottleneck 包含 Conv Block 和 Identity Block。Conv Block 用于改变网络维度,而 Identity Block 则直接将输入加到最后的 1×1 卷积输出上。
-
输入和输出:ResNet-50 的输入是 3×224×224 的图像,经过卷积、池化、多个 Block 后,最终通过全连接层和 softmax 实现分类回归。
BN层
-
原理:BN 层的核心思想是在每一个批次(batch)上对神经网络的内部参数进行归一化处理。具体来说,对于每一个批次中的每一个神经元,BN 层会计算其均值和方差,然后使用这些统计量对该神经元的输入进行标准化。这有助于解决内部协变量偏移问题,使每一层的特征分布更加稳定¹².
-
作用:BN 层的主要作用有以下几点:
- 加速收敛速度:通过标准化输入,BN 层可以加速神经网络的收敛速度,使训练过程更快。
- 简化调参:使用 BN 层后,对于初始化的要求不那么高,可以使用更大的学习率,而不会导致训练发散。
- 抑制过拟合:虽然存在争议,但 BN 层可以一定程度上抑制过拟合。
- 提高模型泛化能力:BN 层有助于网络的泛化能力,使其更好地适应新数据。
有BN层时谨慎选取batch_size
当使用ResNet-50这样的深度神经网络主干(backbone)时,BatchNormalization(BN)层的存在确实会影响适用的batch_size。
BatchNormalization(批归一化):
BN是一种用于加速深度神经网络训练的技术。它通过标准化每一层的输入,使其均值为0,方差为1,从而有助于梯度传播和收敛。
BN层通常放在卷积层或全连接层之后,但在激活函数之前。
BN的计算依赖于每个batch的统计信息,包括均值和方差。
影响batch_size的原因:
当batch_size为1时,BN层的统计信息(均值和方差)将完全由单个样本计算得出。这会导致以下问题:
不稳定性:单个样本的统计信息可能不足以准确估计整个数据分布的均值和方差,从而导致不稳定的训练过程。
过拟合:由于样本数量太少,BN层可能过于自信地调整网络参数,导致过拟合。
梯度估计不准确:梯度计算依赖于BN层的统计信息,如果这些信息不准确,梯度也会不准确。
推荐做法:
尽量避免将batch_size设置为1,特别是在使用BN层的情况下。
通常,较大的batch_size(例如32或更大)对于BN的效果更好,因为它更稳定且更准确地估计了数据分布的统计信息。
总之,当使用ResNet-50等具有BN层的模型时,建议选择适当的batch_size,以获得更好的训练效果和稳定性。
backbone
主干网络是神经网络的核心部分,负责从原始输入中提取特征。它通常由一系列卷积层和池化层组成,用于逐层处理图像或其他输入数据。主干网络的设计目标是能够捕获输入数据的语义信息和上下文相关性。主干网络的输出通常是一个高维特征图。
主干网络通常由多个卷积层和池化层组成,用于逐层处理输入数据。这些层可以提取不同尺度、不同抽象级别的特征。
参考博客
在深度学习领域,backbone通常是经过大量数据预训练得到的,能够提取丰富的特征信息。这些预训练模型可以在许多任务上提供很好的起点,通过微调,可以很快地适应新的任务,这大大减少了训练时间和数据需求。因此,backbone在迁移学习中扮演了非常重要的角色。
参考博客
训练过程名词解释
num_classes
在机器学习和深度学习中,num_classes是指分类问题中类别的数量。通常,我们需要将输入数据分为不同的类别,例如图像分类、文本分类等任务。num_classes就是指这些类别的数量。
在图像分类任务中,num_classes表示图像可以被分为多少个不同的类别,比如将图像分为猫、狗、鸟等不同的类别。
在文本分类任务中,num_classes表示文本可以被分为多少个不同的类别,比如将文本分为正面、负面、中性等不同的类别。
神经网络的输出层通常根据num_classes来设计,决定了输出层的神经元数量和激活函数的选择。例如,在二分类任务中,num_classes通常为2,输出层只需要一个神经元,并使用sigmoid激活函数。而在多分类任务中,num_classes通常大于2,输出层需要num_classes个神经元,并使用softmax激活函数
训练轮次Epoch
一个epoch表示所有训练样本运算学习一遍。
在每个epoch中,模型会遍历整个训练数据集一次,计算损失并更新权重。
增加epoch次数有助于更好地拟合数据,但也可能导致过拟合。
训练步长step
Step表示每运行一个迭代,就更新一次参数权重。
每次更新参数需要使用batch size个样本进行运算学习,然后根据运算结果调整参数。
例如,如果有20000个样本,batch size为200,epoch为1,那么总共会有100个step(即100次参数更新)。
batch_size
Batch size是一次迭代所使用的样本量。
较大的batch size可以占用更多的CPU或GPU资源,但也可以加速训练过程。
选择合适的batch size通常需要根据硬件资源和数据集大小进行权衡。
batch_size的设置:
在显卡能够接受的范围内,以大为好。显存不足与数据集大小无关,提示显存不足(OOM或者CUDA out of memory)请调小batch_size。
关系
每个训练世代(Epoch)包含若干训练步长(Step),每个训练步长(Step)进行一次梯度下降。训练好的权值文件保存在logs文件夹中,如果只是训练了几个Step是不会保存的
评价指标
mIOU
参考博客
mIoU(Mean Intersection over Union)是一种常用的语义分割模型评价指标,用于衡量模型对每个类别的实例分割效果。
-
交并比(IoU)理解:
在语义分割中,交并比是真实标签和预测值的交集与并集之比。具体来说:- TP(True Positives):预测正确,真正例,模型预测为正例,实际是正例。
- FP(False Positives):预测错误,假正例,模型预测为正例,实际是反例。
- FN(False Negatives):预测错误,假反例,模型预测为反例,实际是正例。
- TN(True Negatives):预测正确,真反例,模型预测为反例,实际是反例。
- IoU = TP / (TP + FN + FP)
-
mIoU计算:
mIoU是数据集中每个类别的交并比的平均值,计算公式如下:- 对于每个类别i,计算交并比: I o U i = T P i T P i + F N i + F P i IoU_i = \frac{TP_i}{TP_i + FN_i + FP_i} IoUi=TPi+FNi+FPiTPi
- 然后将所有类别的IoU求平均: m I o U = ∑ I o U i 类别数 mIoU = \frac{\sum IoU_i}{\text{类别数}} mIoU=类别数∑IoUi
在实际项目中,我们可以使用混淆矩阵来计算IoU和mIoU。混淆矩阵记录了每个类别的真实样本数量和预测为该类别的样本数量。
model_path
model_path 是指模型文件的路径。在机器学习和深度学习中,通常需要加载预训练的模型或保存训练好的模型。这个路径可以是本地文件系统上的路径,也可以是远程服务器上的路径。