面经自己汇总(三维视觉算法&机器学习&深度学习)——持续更新
算法面经
1.pytorch和tensorflow的区别?
1、首先是图的创建和调试
pytorch图结构的创建是动态的,即图是运行时创建的,更容易调试pytorch代码
tensorflow图结构的创建是静态的,即图首先被“编译”,然后再运行。
(一个好的框架应该要具备三点:
——方便实现大计算图;
——可自动求变量的导数;
——可简单的运行在GPU上;
pytorch都做到了,但是现在很多公司用的都是TensorFlow,而pytorch由于比较灵活,在学术科研上用得比较多一点。鄙人认为可能,Google可能下手早一些,而Facebook作后来者,虽然灵活,但是很多公司已经入了TensorFlow的坑了,要全部迁移出来还是很费功夫;而且,TensorFlow在GPU的分布式计算上更为出色,在数据量巨大时效率比pytorch要高一些,我觉得这个也是一个重要的原因吧。)
2、在灵活性方面
pytorch是动态计算图,数据参数在CPU和GPU之间迁移十分灵活,调试简便
tensorflow是静态计算图,数据参数在CPU和GPU之间迁移麻烦,调试麻烦
3、设备管理方面——(内存,显存)
tensorflow:不需要手动调整,简单
TensorFlow的设备管理非常好用。通常你不需要进行调整,因为默认的设置就很好。例如,TensorFlow会假设你想运行在GPU上(如果有的话);
TensorFlow设备管理唯一的缺点是,默认情况下,它会占用所有的GPU显存。简单的解决办法是指定CUDA_VISIBLE_DEVICES。有时候大家会忘了这一点,所以GPU在空闲的时候,也会显得很忙。
pytorch:需要明确启用的设备,启用CUDA时,需要明确把一切移入设备;
缺点:代码需要频繁的检查CUDA是否可用,及明确的设备管理,在编写能同时在CPU和GPU上运行的代码时尤其如此
4、在部署方面
tensorflow强于pytorch
tensorflow的分布式训练要比pytorch性能更好
5、数据并行方面
PyTorch 是声明式数据并行:用 torch.nn.DataParellel 封装任何模型,模型能在批处理维度上实现并行,这样你就可以毫不费力的使用多个 GPU;
tensorflow需要手动调整数据并行
note: 两个框架都支持分布式执行,提供用于定义集群的高水平界面
2. 什么是Tensorboard?
Tensorboard原本是Google TensorFlow的可视化工具,可以用于记录训练数据、评估数据、网络结构、图像等,并且可以在web上展示,对于观察神经网络的过程非常有帮助。
PyTorch也推出了自己的可视化工具——torch.utils.tensorboard。
3.pytroch多卡训练的实现方法
pytorch单机多卡最简单的实现方法就是使用nn.DataParallel类,其几乎仅使用一行代码net = torch.nn.DataParallel(net)就可让模型同时在多张GPU上训练。
4.C++中的虚函数
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。
虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。
5.C++中的static关键字
static是C++中的关键字之一,是常用的函数与变量(C++中还有类)的修饰符,它常被用来控制变量的存储方式和作用范围。
static可以修饰静态局部变量和静态全局变量
当static修饰局部变量时:
1.变量的存储区域由栈变为静态常量区
2.变量的生命周期由局部变为全局
3.变量的作用域不变
当 static 修饰全局变量时:
1.变量的存储区域在全局数据区的静态常量区。
2.变量的作用域由整个程序变为当前文件。(extern声明也不行)
3.变量的生命周期不变。
模型的参数怎么计算
首先,假设卷积核的尺寸是K×K,有C个特征图作为输入,每个输出的特征图大小为H × W,输出为M个特征图。
由于模型参数量主要由卷积,全连接层,BatchNorm层等部分组成,我们以卷积的参数量为例进行参数量的计算分析:
卷积核参数量:M×C×K×K,偏置参数量:M,总体的参数量:M×C×K×K+M
全连接层的作用
全连接层将卷积学习到的高维特征映射到label空间,可以作为整个网络的分类器模块。
虽然全连接层参数存在冗余的情况,但是在模型进行迁移学习时,仍然能够保持较大的模型性能。
目前很多模型使用全局平均池化(GAP)取代全连接层以减小模型参数,并且依然能够达到SOTA的性能。
正则化的本质和常用手段?
正则化是机器学习的核心主题之一。正则化本质是对某一问题加以先验的限制或约束以达到某种特定目的的一种操作。在机器学习中我们通过使用正则化方法,防止其过拟合,降低其泛化误差。
常用的正则化手段:数据增强、使用L范数约束、dropout、early stopping、对抗训练
卷积的特点
卷积主要有三大特点:
1.局部连接。比起全连接,局部连接会大大减少网络的参数。
2.权值共享。参数共享也能减少整体参数量。一个卷积核的参数权重被整张图片共享,不会因为图像内位置的不同而改变卷积核内的参数权重。
3.下采样。下采样能逐渐降低图像分辨率,使得计算资源耗费变少,加速模型训练,也能有效控制过拟合。
BN层面试高频问题大汇总(具体可以看这里):
首先是BN层的作用:
把一个batch内的所有数据,从不规范的分布拉到正态分布。这样做的好处是使得数据能够分布在激活函数的敏感区域,敏感区域即为梯度较大的区域,因此在反向传播的时候能够较快反馈误差传播。
BN层解决了什么问题?
统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,但是它们所能代表的label仍然是不变的,这便符合了covariate shift的定义。
因为神经网络在做非线性变换前的激活输入值随着网络深度加深,其分布逐渐发生偏移或者变动(即上述的covariate shift)。之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(比如sigmoid),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因(梯度在反向传播中是网络权重学习的速率)。而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,避免因为激活函数导致的梯度弥散问题。所以与其说BN的作用是缓解covariate shift,也可以说BN可缓解梯度弥散问题。
BN层训练和测试的不同:
在训练阶段,BN层是对每一批的训练数据进行标准化,即用每一批数据的均值和方差。(每一批数据的方差和标准差不同)(使用全量的训练集和方差容易过拟合)
而在测试阶段,我们一般只输入一个测试样本,并没有batch的概念。因此这个时候用的均值和方差是整个数据集训练后的均值和方差。
BN训练时为什么不用整个训练集的均值和方差?
因为用整个训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据标准化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是固定的值,这个差别能够增加模型的鲁棒性,也会在一定程度上减少过拟合。
BN层用在哪里?
在CNN中,BN层应该用在非线性激活函数前面。由于神经网络隐藏层的输入是上一层非线性激活函数的输出,在训练初期其分布还在剧烈改变,此时约束其一阶矩和二阶矩无法很好地缓解 Covariate Shift;而BN的分布更接近正态分布,限制其一阶矩和二阶矩能使输入到激活函数的值分布更加稳定。
BN层的优缺点
优点:
可以选择较大的初始学习率。因为这个算法收敛很快。
可以不用dropout,L2正则化。
不需要使用局部响应归一化。
可以把数据集彻底打乱。
模型更加健壮。
缺点:
Batch Normalization非常依赖Batch的大小,当Batch值很小时,计算的均值和方差不稳定。
所以BN不适用于以下几个场景:小Batch,RNN等。、
BN、LN、IN、GN:
Layer Nomalization
Instance Normalization
Group Normalization
激光雷达获取点云的原理:
激光雷达发射高密度的激光束,光束沿直行传播打到物体的表面,然后以相同的方向反射回去(忽略少量光线发生衍射现象),反射回去的光线由光电探测器(光敏传感器)检测收集,结合激光束往返传播的距离与方向信息就可以生成物体的3D几何形状。实际在使用过程中,激光发射器置于连续旋转的底座上,从而使得发射的激光束能以不同方向到达物体表面(前、后、左、右)。
点云数据处理汇总:
点云滤波
点云滤波,顾名思义,就是滤掉噪声。原始采集的点云数据往往包含大量散列点、孤立点。
点云滤波的主要方法有:双边滤波、高斯滤波、条件滤波、直通滤波、随机采样一致滤波、VoxelGrid滤波等,这些算法都被封装在了PCL点云库中。
特征与特征描述
如果要对一个三维点云进行描述,光有点云的位置还不够,常常需要计算一些额外的参数,比如法线方向、曲率、文理特征等等。如同图像的特征一样,我们需要使用类似的方式来描述三维点云的特征。
常用的特征描述算法:法线和曲率计算及特征值分析、PFH、FPFH、3D Shape Context、Spin Image等。
PFH:点特征直方图描述子,FPFH:跨苏点特征直方图描述子,FPFH是PFH的简化形式。
点云关键点提取
在二维图像上,有Harris、SIFT、SURF、KAZE这样的关键点提取算法,将特征点的思想推广到三维空间。从技术上来说,关键点的数量相比于原始点云或图像的数据量减小很多,与局部特征描述子结合在一起,组成关键点描述子用来形成原始数据的表示,而且不失代表性和描述性,从而加快了后续的识别,追踪等对数据的处理速度,关键点技术成为在2D和3D 信息处理中非常关键的技术。
常见的三维点云关键点提取算法有一下几种:ISS3D、Harris3D、NARF、SIFT3D
这些算法在PCL库中都有实现,其中NARF算法应用较为常见。
点云配准
点云配准的概念也可以类比于二维图像中的配准,相比二维图像配准获取得到的是x,y,alpha,beta等放射变化参数,二三维点云配准可以模拟三维点云的旋转和移动,也就是会获得一个旋转矩阵和一个平移向量,通常表达为一个4×3的矩阵,其中3×3是旋转矩阵,13是平移向量。严格说来是6个参数,因为旋转矩阵也可以通过罗格里德斯变换转变成13的旋转向量。
常用的点云配准算法有两种:正太分布变换和著名的ICP点云配准,此外还有许多其它算法,列举如下:
ICP:稳健ICP、point to plane ICP、point to line ICP、MBICP、GICP
NDT 3D、Multil-Layer NDT
FPCS、KFPSC、SAC-IA
Line Segment Matching、ICL
点云分类与分割
点云的分割与分类处理比二维图像的处理复杂很多,点云分割又分为区域提取、线面提取、语义分割与聚类等。同样是分割问题,点云分割涉及面太广,一般说来,点云分割是目标识别的基础。
分割:区域声场、Ransac线面提取、NDT-RANSAC、K-Means、Normalize Cut、3D Hough Transform(线面提取)、连通分析
分类:基于点的分类,基于分割的分类,监督分类与非监督分类。
三维重建
获取到的点云数据都是一个个孤立的点,从一个个孤立的点得到整个曲面就是三维重建的问题。
直接采集到的点云是充满噪声和孤立点的,三维重建算法为了重构出曲面,常常要应对这种噪声,获得看上去很光滑的曲面。
常用的三维重建算法和技术有:
泊松重建、Delauary triangulatoins
表面重建,人体重建,建筑物重建,输入重建
实时重建:重建纸杯或者龙作物4D生长台式,人体姿势识别,表情识别
点云数据集
已有的3D点云数据集主要有ModelNet40,ShapeNet,S3DIS,3D Match,KITTI,其中前3者主要应用于CAD模型,室内建筑物分割,室内场景配准等,KITTI数据集主要应用于自动驾驶、ADAS、外部场景视觉SLAM等。
点云处理深度学习方法
目前对于点云数据的分类与分割,深度学习方法已经成为主流。比较常见的有PointNet,PointNet++, DGCNN, PointCNN, PointSIFT, Point Transformer, and RandLANet等。其中以前两者应用居多。
1、PointNet
由图可以看出,由于点云的旋转非常的简单,只需要对一个N×D的点云矩阵乘以一个D×D的旋转矩阵即可,因此对输入点云学习一个3×3的矩阵,即可将其矫正;同样的将点云映射到K维的冗余空间后,再对K维的点云特征做一次校对,只不过这次校对需要引入一个正则化惩罚项,希望其尽可能接近于一个正交矩阵。
具体来说,对于每一个N×3的点云输入,对应于原始N个点的3D坐标信息,网络先通过一个T-Net将其在空间上对齐(旋转到正面),其中T-Net就像一个迷你型-point-net网络,可学习得到3×3仿射变换矩阵。再通过MLP将其映射到64维的空间上,再进行对齐,最后映射到1024维的空间上。这时对于每一个点,都有一个1024维的向量表征,而这样的向量表征对于一个3维的点云明显是冗余的,因此这个时候引入最大池化操作,将1024维所有通道上都只保留最大的那一个,这样得到的1×1024的向量就是N个点云的全局特征。
如果做的是分类的问题,直接将这个全局特征再进过MLP去输出每一类的概率即可;但如果是分割问题,由于需要输出的是逐点的类别,因此其将全局特征拼接在了点云64维的逐点特征上,网络能够同时利用局部和全局特征的几何和全局语义,最后通过MLP,输出逐点的分类概率。
2、PointNet++
从很多实验结果都可以看出,PointNet对于场景的分割效果十分一般,由于其网络直接暴力地将所有的点最大池化为了一个全局特征,因此局部点与点之间的联系并没有被网络学习到。在分类和物体的Part Segmentation中,这样的问题还可以通过中心化物体的坐标轴部分地解决,但在场景分割中,这就导致效果十分一般了。
进一步地研究人员提出了一个分层特征学习框架PointNet++来解决这个问题,从而改善PointNet的一些局限性。分层学习过程是通过一系列设定的抽象级别。每个集合抽象级别由一个采样组层、分组层和PointNet层。PointNet++网络结构
PointNet++中主要借鉴了CNN的多层感受野的思想。CNN通过分层不断地使用卷积核扫描图像上的像素并做内积,使得越到后面的特征图感受野越大,同时每个像素包含的信息也越多。而PointNet++就是仿照了这样的结构,具体如下:
其先通过在整个点云的局部采样并划一个范围,将里面的点作为局部的特征,用PointNet进行一次特征的提取。因此,通过了多次这样的操作以后,原本的点的个数变得越来越少,而每个点都是有上一层更多的点通过PointNet提取出来的局部特征,也就是每个点包含的信息变多了。文章将这样的一个层成为Set Abstraction。
一个Set Abstraction主要由三部分组成:
Sampling:利用FPS(最远点采样)随机采样点
Grouping:利用Ball Query划一个R为半径的圈,将每个圈里面的点云作为一簇
PointNet: 对Sampling+Grouping以后的点云进行局部的全局特征提取
对于正负样本不平衡问题怎么解决,解决方法又是怎么计算的?
通常使用focal loss损失函数来解决正负样本不平衡问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。
Focal loss是在交叉熵损失函数基础上进行的修改,首先二分类交叉熵损失函数是:
y撇是经过激活函数的输出,所以在0-1之间。由此可见普通交叉熵损失函数对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。所以Focal loss改进二分类交叉熵:
首先是引入gama因子,当gama=0时,就是二分类交叉熵函数,当gama>0时,会减少易分类样本的损失,使得更关注于困难的、错分的样本。
然后再加入平衡因子alpha,用来平衡正负样本本身的比例不均。但如果只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。
点云关键点提取、特征描述
ISS(Intrinsic Shape Signatures)
NARF
均匀采样,体素采样
Harris
SIFT
SUSAN
AGAST
常见的提高模型泛化能力的方法
1、Dropout
首先随机删掉网络中一半的隐藏神经元,输入输出神经元保持不变。然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b),然后继续重复这一过程。
Dropout简单来说是是模型节点随机失活,这样使之不会太依赖数据的某些局部特征。
2、正则化
模型的损失函数加入正则项可以防止参数过大,防止过分拟合从而提高泛化能力。
L1 loss、L2 loss、smooth L1 loss原理与区别
首先先贴一下这几个损失函数的图像:
L1 loss:
其中,yi是真实值,f(xi)是预测值,n是样本点个数
优缺点:
优点:无论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,具有较为稳健性的解
缺点:在中心点是折点,不能求导,梯度下降时要是恰好学习到w=0就没法接着进行了
什么时候用?
回归任务
简单模型
神经网络通常比较复杂,直接使用L1 loss作为损失函数的比较少
L2 loss:
其中,yi是真实值,f(xi)是预测值,n是样本点个数
优缺点:
优点:各点都连续光滑,方便求导,具有较为稳定的解
缺点:不是特别的稳健,因为当函数的输入值距离真实值较远的时候,对应loss值很大在两侧,则使用梯度下降法求解的时候梯度很大,可能导致梯度爆炸
什么时候使用?
回归任务
数值特征不大(防止loss太大,继而引起梯度大,梯度爆炸)
问题维度不高(loss本身比较简单,高纬度的还是得要更复杂的loss支撑)
Smooth L1 loss
分析一下,当预测值f(xi)和真实值yi差别较小的时候(绝对值差小于1),其实使用的是L2 loss;差别大的时候,使用的是L1 loss的平移。因此,Smooth L1 loss其实是L1 loss 和L2 loss的结合,同时拥有两者的部分优点:
真实值和预测值差别较小时(绝对值差小于1),梯度也会比较小(损失函数比普通L1 loss在此处更圆滑)
真实值和预测值差别较大时,梯度值足够小(普通L2 loss在这种位置梯度值就很大,容易梯度爆炸)
什么时候使用?
回归任务
特征中有较大数值
适合大多数问题(用的最多!)
三者的区别:
(1)L1 loss在零点不平滑,此处不可导,所以在w=0时没法接着梯度下降了,用的少
(2)L2 loss对离群点比较敏感,离群点处的梯度很大,容易梯度爆炸
(3)smooth L1 loss结合了L1和L2的优点,修改了零点不平滑问题,且比L2 loss对异常值的鲁棒性更强
55卷积核替换为两个级联33卷积核在参数和计算量上的影响(参考)
大尺寸的卷积核可以带来更大的感受野,同时也意味着更多的参数:
用33代替55有什么好处呢?
1、增加网络层数,层之间可以加入激活函数,增加了网络的非线性表达能力。
2、如果卷积核的通道为1,那么2个3 * 3卷积核有18个参数,1个5 * 5卷积核有25个参数(正常来讲还要考虑通道的数量)。
常见的梯度下降方法和原理
首先介绍一下梯度下降:
梯度是一个矢量,它告诉我们权重的方向。更准确地说,它告诉我们如何改变权重,使损失变化最快。我们称这个过程为梯度下降,因为它使用梯度使损失曲线下降到最小值。
如果我们能成功地训练一个网络做到这一点,它的权重必须以某种方式表示这些特征和在训练数据中表示目标之间的关系。除了训练数据,我们还需要两件事:
一个“损失函数”(loss function),用来衡量网络的预测有多好。
一个“优化器”(optimizer),可以告诉网络如何改变其权重。
常见的“优化器”有:SGD、Adam、BGD、momentum、Adagrad、NAG、(SGD和Adam的区别)
因为自己项目中用的是 SGD ,所以着重介绍一下这个:
SGD:随机梯度下降:
用样本中的一些例子来近似所有的样本,来调整,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,容易陷入到局部最优解中。
深度学习之动态调整学习率LR
1、什么是学习率:
深度网络模型是在一个未知且参数量很大的复杂函数上进行训练的,训练的目的是找到一套最优的参数,学习率 lr 控制了参数更新的速度,以及模型学习的速度。
其中 θ t + 1是第 t + 1次迭代后的参数值, θ t 是第 t次迭代后的参数值, l r是学习率, g ( θ t ) 是参数 θ 在第 t 次迭代时计算得到的梯度值。
2、为什么要动态调整学习率
因为一开始要让网络朝着正确的方向加速收敛,但是到接近目标的时候就要慢一点收敛,因此要动态地调整学习率。
3、动态调整学习率的方法
原理传送门
3.1 lr_scheduler.LambdaLR
3.2 lr_scheduler.StepLR
3.3 lr_scheduler.MultiStepLR
3.4 lr_scheduler.ExponentialLR
3.5 lr_scheduler.CosineAnnealingLR
3.6 lr_scheduler.ReduceLROnPlateau
3.7 lr_scheduler.CyclicLR
神经网络中concat和add的区别
如何理解concat和add的方式融合特征:
在各个网络模型中,ResNet,FPN等采用的element-wise add来融合特征,而DenseNet等则采用concat来融合特征。
concat是通道数的增加。
add是特征图的相加,通道数不变。
怎么理解?:
add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。
concat是通道数的合并,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加的。
add的计算量要比concat的计算量小很多。
concat与add的实例:
比如说使用了concat的Densenet:
优势:
(1)解决了深层网络的梯度消失问题
(2)加强了特征的传播
(3)鼓励特征重用
(4)减少了模型参数
(5)能够减少小样本的过拟合问题
缺点:
非常消耗显存
卷积神经网络的卷积时间复杂度和空间复杂度怎么计算:
目标检测中NMS的相关概念与计算
在目标检测中,我们可以利用非极大值抑制(NMS)对生成的大量候选框进行后处理,去除冗余的候选框
,得到最具代表性的结果,以加快目标检测的效率。
非极大值抑制(NMS)流程:
1.首先我们需要设置两个值:一个Score的阈值,一个IOU的阈值。
2.对于每类对象,遍历该类的所有候选框,过滤掉Score值低于Score阈值的候选框,并根据候选框的类别分类概率进行排序:A < B < C < D < E < F。
3.先标记最大概率矩形框F是我们要保留下来的候选框。
4.从最大概率矩形框F开始,分别判断A~E与F的交并比(IOU)是否大于IOU的阈值,假设B、D与F的重叠度超过IOU阈值,那么就去除B、D。
5.从剩下的矩形框A、C、E中,选择概率最大的E,标记为要保留下来的候选框,然后判断E与A、C的重叠度,去除重叠度超过设定阈值的矩形框。
6.就这样重复下去,直到剩下的矩形框没有了,并标记所有要保留下来的矩形框。
7.每一类处理完毕后,返回步骤二重新处理下一类对象。
数据类别不平衡怎么处理?
1.数据增强。
2.对少数类别数据做过采样,多数类别数据做欠采样。
3.损失函数的权重均衡。(不同类别的loss权重不一样,最佳参数需要手动调节)
4.采集更多少数类别的数据。
5.转化问题定义,将问题转化为异常点检测或变化趋势检测问题。 异常点检测即是对那些罕见事件进行识别,变化趋势检测区别于异常点检测,其通过检测不寻常的变化趋势来进行识别。
6.使用新的评价指标。
7.阈值调整,将原本默认为0.5的阈值调整到:较少类别/(较少类别+较多类别)。
什么是模型的偏差和方差?
误差(Error)= 偏差(Bias) + 方差(Variance) + 噪声(Noise),一般地,我们把机器学习模型的预测输出与样本的真实label之间的差异称为误差,其反应的是整个模型的准确度。
噪声(Noise):描述了在当前任务上任何机器学习算法所能达到的期望泛化误差的下界
,即刻画了当前任务本质的难度。
偏差(Bias):衡量了模型拟合训练数据的能力,偏差反应的是所有采样得到的大小相同的训练集训练出的所有模型的输出平均值和真实label之间的偏差
,即模型本身的精确度
。
偏差通常是由于我们对机器学习算法做了错误的假设所导致的,比如真实数据分布映射的是某个二次函数,但我们假设模型是一次函数。
偏差(Bias)越小,拟合能力却强(可能产生过拟合);反之,拟合能力越弱(可能产生欠拟合)。偏差越大,越偏离真实数据。
方差描述的是预测值的变化范围,离散程度,也就是离期望值的距离。方差越大,数据的分布越分散,模型的稳定程度越差
。
方差也反应了模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。由方差带来的误差通常体现在测试误差相对于训练误差的增量上。
方差通常是由于模型的复杂度相对于训练样本数过高导致的。方差越小,模型的泛化能力越高;反之,模型的泛化能力越低
。
如果模型在训练集上拟合效果比较优秀,但是在测试集上拟合效果比较差,则表示方差较大,说明模型的稳定程度较差,出现这种现象可能是由于模型对训练集过拟合造成的。
不同层次的卷积都提取什么类型的特征?
浅层卷积——>提取边缘特征
中层卷积——>提取局部特征
深层卷积——>提取全局特征
卷积核大小如何选取?
最常用的是 33 大小的卷积核,两个 33 卷积核和一个 55 卷积核的感受野相同,但是减少了参数量和计算量,加快了模型训练。与此同时由于卷积核的增加,模型的非线性表达能力大大增强。
不过大卷积核(77, 9*9)也有使用的空间,在GAN,图像超分辨率,图像融合等领域依然有较多的应用。
卷积感受野的相关概念
目标检测和目标跟踪很多模型都会用到RPN层,anchor是RPN层的基础,而感受野(receptive field,RF)是anchor的基础。
感受野的作用:
1、一般来说感受野越大越好,比如分类任务中最后卷积层的感受野要大于输入图像。
2、感受野足够大时,被忽略的信息就较少。
3、目标检测任务中设置anchor要对齐感受野,anchor太大或者偏离感受野会对性能产生一定的影响。
感受野计算:
增大感受野的方法:
1、使用空洞卷积
2、使用池化层
3、增大卷积核
网络每一层是否只能用一种尺寸的卷积核?
常规的神经网络一般每层仅用一个尺寸的卷积核,但同一层的特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征
,再把这些特征结合起来,得到的特征往往比使用单一尺寸卷积核的要好,如GoogLeNet 、Inception系列的网络,均是每层使用了多个不同的卷积核结构。如下图所示,输入的特征图在同一层分别经过 11 , 33, 5*5 三种不同尺寸的卷积核,再将各自的特征图进行整合,得到的新特征可以看作不同感受野提取的特征组合,相比于单一尺寸卷积核会有更强的表达能力。
1*1卷积的作用?
主要作用有以下三点:
1、实现特征信息的交互与整合。
2、对特征图通道数进行升维和降维,降维时可以减少参数量。
3、1*1卷积 + 激活函数 ——> 可以增加非线性,提升网络的表达能力。
1*1 卷积首发于NIN(Network in Network),后续也在GoogLeNet和ResNet等网络中使用。
全连接层的作用?
全连接层将卷积学习到的高维特征映射到label空间,可以作为整个网络的分类器模块。
目前很多模型使用全局平均池化(GAP)取代全连接层以减小模型参数,并且依然能达到SOTA的性能。
这里插入一个基础知识点:
全局平均池化(GAP)通过池化操作把多维矩阵转化为特征向量,以顶替全连接(FC)。
优点:
1、减少了FC中的大量参数,使得模型更加健壮,抗过拟合,当然也可能会出现欠拟合的情况。
2、GAP在特征图与最终的分类间转换更加自然。
GAP工作原理如下图所示:
再插入一个:
为什么使用全局平均池化代替全连接层后,网络的收敛速度会变慢
?
1、CNN+FC结构的模型,对于训练过程而言,整个模型的学习压力主要集中在FC层(FC层的参数量占整个模型参数量的80%),此时CNN层学习到的特征更倾向于低层的通用特征,即使CNN层学习到的特征比较低级,强大的FC层也可以通过学习调整参数做到很好的分类
2、CNN+GAP结构的模型,因为使用GAP代替了FC,模型的参数量骤减,此时模型的学习压力全部前导到CNN层,相比于CNN+FC层,此时的CNN层不仅仅需要学习到低层的通用特征,还要学习到更加高级的分类特征,学习难度变大,网络收敛变慢
但是:综上所述,全局平均池化代替全连接层虽然可以减少模型的参数量,防止模型发生过拟合,但不利于模型的迁移学习
,因为CNN+GAP的结构使得很多参数“固化”在卷积层中
,增加新的分类时,意味着相当数量的卷积层特征需要重新进行调整(学习难度较大);而全连接层则可以更好的进行迁移学习,因为它的参数调整很大一部分是在全连接层中,迁移的时候虽然卷积层的参数也会调整,但是相对来说要小很多
CNN中池化的作用?
池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。
按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它们分别提取感受野内最大、平均与总和的特征值作为输出,最常用的是最大池化和平均池化。
有哪些方法能提升CNN模型的泛化能力?
1、采集更多的数据:数据决定算法的上限。
2、优化数据分布:数据类别均衡。
3、选用合适的目标函数。
4、设计合适的网络结构。
5、数据增强。
6、权值正则化。
7、使用合适的优化器等。
One-stage目标检测与Two-stage目标检测的区别?
Two-stage目标检测算法
:先进行区域生成(region proposal,RP)(一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。其精度较高,速度较慢。
主要逻辑:特征提取——>生成RP——>分类/定位回归。
常见的Two-stage目标检测算法有:Faster R-CNN系列和R-FCN等。
One-stage目标检测算法
:不用RP,直接在网络中提取特征来预测物体分类和位置。其速度较快,精度比起Two-stage算法稍低。
主要逻辑:特征提取—>分类/定位回归。
常见的One-stage目标检测算法有:YOLO系列、SSD和RetinaNet等。
哪些方法可以提升小目标检测的效果?
1、提高图像分辨率。小目标在边界框中可能只包含几个像素,那么能通过提高图像的分辨率以增加小目标的特征的丰富度。
2、提高模型的输入分辨率。这是一个效果较好的通用方法,但是会带来模型inference速度变慢的问题。
3、平铺图像。
4、数据增强。小目标检测增强包括随机裁剪、随机旋转和镶嵌增强等。
5、自动学习anchor。
6、类别优化。
ResNet模型的特点以及解决的问题?
模型的特点则是设计了残差结构,其对模型输出的微小变化非常敏感。
为什么加入残差模块会有效果呢?
我就直接截图了:
什么是过拟合,解决过拟合的方法有哪些?
过拟合
:模型在训练集上拟合的很好,但是模型连噪声数据的特征都学习了,丧失了对测试集的泛化能力。
解决过拟合的方法
:
1、重新清洗数据,数据不纯会导致过拟合,此类情况需要重新清洗数据或重新选择数据。
2、增加训练样本数量。使用更多的训练数据是解决过拟合最有效的手段。我们可以通过一定的规则来扩充训练数据,比如在图像分类问题上,可以通过图像的平移、旋转、缩放、加噪声等方式扩充数据;也可以用GAN网络来合成大量的新训练数据。
3、降低模型复杂程度。适当降低模型复杂度可以避免模型拟合过多的噪声数据。在神经网络中减少网络层数、神经元个数等。
4、加入正则化方法,增大正则项系数。给模型的参数加上一定的正则约束,比如将权值的大小加入到损失函数中。
5、采用dropout方法,dropout方法就是在训练的时候让神经元以一定的概率失活。
6、提前截断(early stopping),减少迭代次数。
7、增大学习率。
8、集成学习方法。集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险,如Bagging方法。
什么是欠拟合,解决欠拟合的方法有哪些?
欠拟合
:模型在训练集和测试集上效果均不好,其根本原因是模型没有学习好数据集的特征。
解决欠拟合的方法
:
1、可以增加模型复杂度。对于神经网络可以增加网络层数或者神经元数量。
2、减小正则化系数。正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要有针对性地减小正则化系数。
正则化的本质以及常用正则化手段?
正则化是机器学习的核心主题之一。正则化本质是对某一问题加以先验的限制或约束以达到某种特定目的的一种操作。
在机器学习中我们通过使用正则化方法,防止其过拟合,降低其泛化误差。
常用的正则化手段:
1、数据增强
2、使用L范数约束
3、dropout
4、early stopping
5、对抗训练
L范数的作用?
L范数主要起到了正则化(即用一些先验知识约束或者限制某一抽象问题
)的作用,而正则化主要是防止模型过拟合。
范数主要用来表征高维空间中的距离,故在一些生成任务中也直接用L范数来度量生成图像与原图像之间的差别。
下面列出深度学习中的范数:
Dropout的作用?
Dropout是在训练过程中以一定的概率使神经元失活,也就是输出等于0。从而提高模型的泛化能力,减少过拟合。
我们可以从两个方面去直观地理解Dropout的正则化效果
:
1)在Dropout每一轮训练过程中随机丢失神经元的操作相当于多个模型进行取平均
,因此用于预测时具有vote的效果。
2)减少神经元之间复杂的共适应性。当隐藏层神经元被随机删除之后,使得全连接网络具有了一定的稀疏化
,从而有效地减轻了不同特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同作用,而通过Dropout的话,就有效地避免了某些特征在其他特征存在下才有效果的情况,增加了神经网络的鲁棒性。
Dropout在训练和测试时的区别
:Dropout只在训练时产生作用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合风险。而在测试时,应该用整个训练好的模型,因此不需要Dropout。
Softmax激活函数的定义和作用
在二分类问题中,我们可以使用sigmoid函数将输出映射到【0,1】区间中,从而得到单个类别的概率。当我们将问题推广到多分类问题时,可以使用Softmax函数,对输出的值映射为概率值。
其定义为:
其中a代表了模型的输出。
交叉熵定义和作用
交叉熵(cross entropy)常用于深度学习中的分类任务,其可以表示预测值与ground truth之间的差距。
交叉熵是信息论中的概念。其定义为:
P代表gt的概率分布,q代表预测值的概率分布。交叉熵从相对熵(KL散度)演变而来,log代表了信息量,q越大说明可能性越大,其信息量就越大。通过不断地训练优化,逐步减小交叉熵损失函数地值来达到缩小p和q距离的目的。
模型参数的计算:
首先,假设卷积核的尺寸是K×K,有C个特征图作为输入,每个输出的特征图大小为H×W,输出为M个特征图。
由于模型参数量主要由卷积,全连接层,BatchNorm层等部分组成,我们以卷积的参数量为例进行参数量的计算分析:
卷积核参数量:M×C×K×K
偏置参数量:M
总体参数量:M×C×K×K+M
模型训练时常用的插值算法?
模型训练时Resize图像常用的插值算法有:最近邻插值,双线性插值以及双三次插值等。
最近邻插值
:没考虑其他相邻像素点的影响,因而重新采样后灰度值有明显的不连续性,图像质量损失较大,存在马赛克和锯齿现象。
双线性插值
:也叫一阶插值,它是利用了待求像素点在源图像中4个最近邻像素之间的相关性,通过两次线性插值得到待求像素点的值。
双三次插值
:也叫立方卷积插值,它是利用了待求像素点在源图像中相邻的16个像素点的值,即这16个像素点的加权平均。
常用图像预处理操作?
一般先对数据进行归一化(Normalization)处理[0,1],再进行标准化(Standardization)操作,用大数定理将数据转化为一个标准正态分布
,最后再进行一些数据增强处理。
归一化后,可以提升模型精度
。不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。标准化后,可以加速模型收敛
。最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。
反向传播算法(BP)的概念及简单推导
反向传播(Backpropagation,BP)算法是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见算法。
BP算法对网络中所有权重计算损失函数的梯度,并将梯度反馈给最优化方法,用来更新权值以最小化损失函数。该算法会先按前向传播方式计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。
目标检测中AP,AP50,AP75,mAP等指标的含义
AP:PR曲线下的面积。
AP50: 固定IoU为50%时的AP值。
AP75:固定IoU为75%时的AP值。
AP@[0.5:0.95]:把IoU的值从50%到95%每隔5%进行了一次划分,并对这10组AP值取平均。
mAP:对所有的类别进行AP的计算,然后取均值。
mAP@[.5:.95](即mAP@[.5,.95]):表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。
K-means算法逻辑?
K-means算法是一个实用的无监督聚类算法,其聚类逻辑依托欧式距离,当两个目标的距离越近,相似度越大。
对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
K-means的主要算法步骤:
K-Means的主要优点:
1、原理简单,实现容易,收敛速度快。
2、聚类效果较优
3、算法的可解释度比较强
4、主要需要调参的参数仅仅是簇数k
K-Means的主要缺点:
1、K值需要人为设定,不好把握。
2、对初始的簇中心敏感,不同选取方式会得到不同的结果。
3、对于不是凸的数据集比较难收敛。
4、如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
5、迭代结果只是局部最优。
6、对噪音和异常点比较敏感。
K近邻算法逻辑?
K近邻(K-NN)算法计算不同数据特征值之间的距离进行分类
。存在一个样本数据集合,也称作训练数据集,并且数据集中每个数据都存在标签,即我们知道每一个数据与所属分类的映射关系。接着输入没有标签的新数据后,在训练数据集中找到与该新数据最邻近的K个数据,然后提取这K个数据中占多数的标签作为新数据的标签(少数服从多数逻辑
)。
K近邻算法的主要步骤:
- 计算新数据与各个训练数据之间的距离。
- 按照距离的递增关系进行排序。
- 选取距离最小的K个点。
- 确定前K个点所在类别的出现频率。
- 返回前K个点中出现频率最高的类别作为新数据的预测分类。
K近邻算法的结果很大程度取决于K的选择。其距离计算一般使用欧氏距离或曼哈顿距离等经典距离度量。
K近邻算法的主要优点:
- 理论成熟,思想简单,既可以用来做分类又可以做回归。
- 可以用于非线性分类。
- 对数据没有假设,准确度高,对异常点不敏感。
- 比较适用于数据量比较大的场景,而那些数据量比较小的场景采用K近邻算法算法比较容易产生误分类情况。
K近邻算法的主要缺点:
- 计算复杂性高;空间复杂性高。
- 样本不平衡的时候,对稀有类别的预测准确率低。
- 是慵懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢。
- 可解释性不强。
三维点云数据处理方法
1.点云滤波(数据预处理)
点云滤波,顾名思义,就是滤掉噪声。
点云滤波的主要方法有:双边滤波、高斯滤波、条件滤波、直通滤波、随机采样一致滤波、VoxelGrid滤波等,这些算法都被封装在了PCL点云库中。
2.点云关键点
我们都知道在二维图像上,有Harris、SIFT、SURF、KAZE这样的关键点提取算法,这种特征点的思想可以推广到三维空间。从技术上来说,关键点的数量相比于原始点云或图像的数据量减小很多,与局部特征描述子结合在一起,组成关键点描述子常用来形成原始数据的表示,而且不失代表性和描述性,从而加快了后续的识别,追踪等对数据的处理了速度,故而,关键点技术成为在2D和3D 信息处理中非常关键的技术。
常见的三维点云关键点提取算法有一下几种:ISS3D、Harris3D、NARF、SIFT3D
3.特征和特征描述
如果要对一个三维点云进行描述,光有点云的位置是不够的,常常需要计算一些额外的参数,比如法线方向、曲率、文理特征等等。如同图像的特征一样,我们需要使用类似的方式来描述三维点云的特征。
常用的特征描述算法有:法线和曲率计算、特征值分析、PFH、FPFH、3D Shape Context、Spin Image等。
PFH:点特征直方图描述子,FPFH:跨苏点特征直方图描述子,FPFH是PFH的简化形式。
4.点云配准
点云配准的概念也可以类比于二维图像中的配准,只不过二维图像配准获取得到的是x,y,alpha,beta等放射变化参数,点云配准可以模拟成三维点云的移动和对齐,也就是会获得一个旋转矩阵和一个平移向量,通常表达为一个4×3的矩阵,其中3×3是旋转矩阵,1×3是平移向量。严格说来是6个参数,因为旋转矩阵也可以通过罗格里德斯变换转变成1×3的旋转向量。
常用的点云配准算法有两种:正太分布变换和著名的ICP点云配准,此外还有许多其它算法,列举如下:
ICP:稳健ICP、point to plane ICP、point to line ICP、MBICP、GICP
NDT 3D、Multil-Layer NDT
FPCS、KFPSC、SAC-IA
Line Segment Matching、ICL
5.点云分割与分类
点云的分割与分类也算是一个大Topic了,这里因为多了一维就和二维图像比多了许多问题,点云分割又分为区域提取、线面提取、语义分割与聚类等。同样是分割问题,点云分割涉及面太广,确实是三言两语说不清楚的。只有从字面意思去理解了,遇到具体问题再具体归类。一般说来,点云分割是目标识别的基础。
分割:区域声场、Ransac线面提取、NDT-RANSAC、K-Means、Normalize Cut、3D Hough Transform(线面提取)、连通分析
分类:基于点的分类,基于分割的分类,监督分类与非监督分类
6.SLAM图优化
SLAM又是大Topic,SLAM技术中,在图像前端主要获取点云数据,而在后端优化主要就是依靠图优化工具。而SLAM技术近年来的发展也已经改变了这种技术策略。在过去的经典策略中,为了求解LandMark和Location,将它转化为一个稀疏图的优化,常常使用g2o工具来进行图优化。下面是一些常用的工具和方法。
g2o、LUM、ELCH、Toro、SPA
SLAM方法:ICP、MBICP、IDC、likehood Field、 Cross Correlation、NDT
7.目标识别检索
这是点云数据处理中一个偏应用层面的问题,简单说来就是Hausdorff距离常被用来进行深度图的目标识别和检索,现在很多三维人脸识别都是用这种技术来做的。
8.变化检测
当无序点云在连续变化中,八叉树算法常常被用于检测变化,这种算法需要和关键点提取技术结合起来,八叉树算法也算是经典中的经典了。
9.三维重建
我们获取到的点云数据都是一个个孤立的点,如何从一个个孤立的点得到整个曲面呢,这就是三维重建的topic。
在玩kinectFusion时候,如果我们不懂,会发现曲面渐渐变平缓,这就是重建算法不断迭代的效果。我们采集到的点云是充满噪声和孤立点的,三维重建算法为了重构出曲面,常常要应对这种噪声,获得看上去很舒服的曲面。
常用的三维重建算法和技术有:
泊松重建、Delauary triangulatoins
表面重建,人体重建,建筑物重建,输入重建
实时重建:重建纸杯或者龙作物4D生长台式,人体姿势识别,表情识别
10.点云数据管理
点云压缩,点云索引(KDtree、Octree),点云LOD(金字塔),海量点云的渲染
Ransac拟合平面
随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。
RANSAC算法本质上由两步组成,不断进行循环:
- 从输入数据中随机选出能组成数学模型的最小数目的元素,使用这些元素计算出相应模型的参数。选出的这些元素数目是能决定模型参数的最少的。
- 检查所有数据中有哪些元素能符合第一步得到的模型。超过错误阈值的元素认为是离群值(outlier),小于错误阈值的元素认为是内部点(inlier)。
这个过程重复多次,选出包含点最多的模型即得到最后的结果。
RANSAC具体到空间点云中拟合平面:
1、从点云中随机选取三个点。
2、由这三个点组成一个平面。
3、计算所有其他点到该平面的距离,如果小于阈值T,就认为是处在同一个平面的点。
3、如果处在同一个平面的点超过n个,就保存下这个平面,并将处在这个平面上的点都标记为已匹配。
4、终止的条件是迭代N次后找到的平面小于n个点,或者找不到三个未标记的点。
点云常见滤波器
1.直通滤波器
原理:在点云的指定维度上设置一个阈值范围,将这个维度上的数据分为在阈值范围内与不在阈值范围内,从而选择过滤与否。能够快速过滤掉用户自定义区间范围内的点云。
在实际应用中,由于激光扫描采集的距离较远,但是根据功能需求的不同可能只关心一定区域内的数据,比如低速物流车的运营场景,可能在X方向只关心前后60米,Y方向只关心左右20米的范围。此时就可以利用直通滤波器提取出感兴趣区域,可较快剔除部分点云,达到第一步粗处理的目的。
特点:根据人工设定的先验范围约束或者借助外部约束,直观的缩小关注的空间范围,减少后续计算量。
2.条件滤波器
原理:通过设定滤波条件进行滤波,类似于分段函数,判断点云是否在规则的范围则中,如果不在则舍弃。上述的直通滤波器就是一种较简单的条件滤波器。
如下图所示:采用直通滤波器或者条件滤波器均能够完成提取感兴趣区域的功能。
或者在自己的机器人项目中,点云剪裁也可以看成是条件滤波
。
3.高斯滤波器
原理:采用加权平均方式的一种非线性滤波器,在指定域内的权重是根据欧式距离的高斯分布,通过权重加权平均的方式得到当前点的滤波后的点。
特点:利用标准差去噪,适用于呈正态分布的数据平滑效果较好,但是边缘角点也会被较大的平滑。
4.双边滤波器
原理:通过取邻近采样点的加权平均来修正当前采样点的位置,在高斯滤波器只考虑空间域点的位置基础上,增加了维度上的权重。一定程度上拟补了高斯滤波的缺点。
特点:既有效地对空间三维模型表面进行降噪,又可以保持点云数据中的几何特征信息,避免三维点云数据被过渡光滑。但是只适用于有序点云。
5. 体素滤波器
6. 统计滤波器
7. 半径滤波器
8. 频率滤波器
–这些就不赘述了
SSD和yolo的区别
- SSD网络和YOLO都是单阶段目标检测方法,即直接从图像中预测目标框和类别,而不需要候选区域或锚点。
- SSD网络和YOLO的一个主要区别是
SSD利用了多个尺度的特征图进行检测
,而YOLO只利用了最高层的特征图
。这样可以提高SSD对小目标的检测能力
。 - SSD网络和YOLO的另一个主要区别是SSD不会预测目标存在的概率,而是直接预测每个类别在每个默认框中的概率。而YOLO会预测目标存在的概率和每个类别的概率,并将它们相乘得到分类置信度。
- SSD网络和YOLO还有一些其他细节上的区别,例如SSD使用了默认框(default box)作为先验框,而YOLO使用了聚类得到的锚点(anchor)作为先验框;
SSD使用了L2正则化损失函数,而YOLO使用了二值交叉熵损失函数
;SSD使用了非极大值抑制(NMS)来去除重叠的检测结果
,而YOLO使用了非极大值抑制(NMS)或者非极大值抑制(NMS)+门限过滤来去除重叠或低置信度的检测结果等。
损失函数
- 损失函数是用于衡量模型所作出的预测值和真实值之间的偏离程度的函数。
- 损失函数的作用,就是计算模型每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。
- 损失函数越小,通常模型的性能越好。常用的损失函数有均方误差、交叉熵、对比损失等。
监督学习和非监督学习有啥区别
- 监督学习和非监督学习的区别
主要在于输入数据是否有标签
。 - 标签是指数据的真实类别或值,例如图片中的猫或狗,文本中的情感或主题等。
- 监督学习是利用有标签的数据来训练模型,使模型能够对新的数据进行预测或分类。例如,通过给定一些人脸图片和对应的姓名,训练一个人脸识别模型。
- 非监督学习是利用无标签的数据来训练模型,使模型能够发现数据中的隐藏结构或规律。例如,通过给定一些新闻文章,训练一个聚类模型来分析文章的主题。
yolo3和yolo5有什么区别
- yolov3和yolov5都是基于YOLO系列的目标检测方法,但它们有不同的网络结构、精度、速度和灵活性。
yolov3是一个三层卷积神经网络,使用了残差模块、上采样模块和特征融合模块来提取多尺度的特征图,并在每个特征图上预测目标框和类别
。- yolov5是一个全新的网络结构,使用了深度可分离卷积、自注意力机制、CSPNet等技术来提高效率和性能,并提供了四种不同大小的模型(yolov5s, yolov5m, yolov5l, yolov5x)来满足不同场景的需求。
- 在相同速度时,yolov5优于yolov3,在相同精度时,yolov4优于yolov3和yolov5。但是,由于yolov4和yolov5使用了不同的评估指标(mAP@0.5:0.95vs mAP@0.5),所以它们之间的比较并不公平。
- yolov3和yolov5在锚点匹配机制上也有一些区别,例如yolov3使用了聚类得到的9个锚点作为先验框,并根据IOU来匹配最佳锚点;而yolov5使用了k-means++算法得到6个锚点作为先验框,并根据wh损失来匹配最佳锚点。
更多推荐
所有评论(0)