1.pytorch和tensorflow的区别?
?? pytorch图形结构的创建是动态的,即图形是在运行过程中创建的,更容易调试pytorch代码 tensorflow图形结构的创建是静态的,即图形在运行前先编译。 (一个好的框架应该有三点: ——大计算图便于实现; ——导数可自动求变; ——操作简单GPU上; pytorch都做到了,但是现在很多公司都用了TensorFlow,而pytorch由于其灵活性,在学术研究中应用较多。我认为这是可能的,Google可能早点开始,但是Facebook作后来者,虽然灵活,但是很多公司已经入了TensorFlow坑,全部迁出还是很费力的;而且,,我认为这也是一个重要的原因。
?? pytorch是动态计算图,数据参数在CPU和GPU迁移非常灵活,调试简单 tensorflow是静态计算图,数据参数在CPU和GPU迁移麻烦,调试麻烦
?? :不需要手动调整,简单 TensorFlow设备管理非常有用。通常你不需要调整,因为默认设置很好。TensorFlow假设你想运行GPU上(如果有的话); TensorFlow设备管理的唯一缺点是默认情况下会占用一切GPU显存。简单的解决方案是指定CUDA_VISIBLE_DEVICES。有时人们会忘记这一点,所以GPU在空闲的时候,也会显得很忙。 :需要明确启用的设备启用CUDA一切都需要清楚地移入设备; 缺点:代码需要频繁检查CUDA是否可用,设备管理是否清晰,可以同时编写CPU和GPU特别是在上运行代码时
?? tensorflow强于pytorch tensorflow分布式训练比pytorch性能更好
?? PyTorch 声明数据并行:使用 torch.nn.DataParellel 包装任何模型,模型都可以在批处理维度上并行你就可以了; tensorflow并行手动调整数据 note: 两个框架都支持分布式执行,并提供定义集群的高水平界面
2. 什么是Tensorboard?
Tensorboard原本是Google TensorFlow可视化工具可用于记录训练数据、评估数据、网络结构、图像等web对神经网络的观察过程非常有帮助。 PyTorch还推出了自己的可视化工具——torch.utils.tensorboard。
3.pytroch实现多卡训练的方法
pytorch实现单机多卡最简单的方法就是用类,它几乎只使用一行代码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总结高频问题(详见此):
??把一个batch所有的所有数据都从非标准分布拉到正态分布。其优点是数据可以分布在激活函数的敏感区域,即梯度较大的区域,因此反向传输时反馈误差可以快速传输。
??统计机器学习的经典假设之一是源空间(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层是标准化每批培训数据,即使用每批数据的平均值和方差。(每批数据的方差和标准差不同)(使用全量培训集和方差容易拟合) ??在测试阶段,我们通常只输入一个测试样本,而不是batch概念。所以此时使用的平均值和方差是整个数据集训练后的平均值和方差。
??由于整个训练集的平均值和方差很容易过拟合,对于BN,事实上,每批数据标准化到相同的分布,每批数据的平均值和方差会有一定的差异,而不是固定值。这种差异可以增加模型的鲁棒性,并在一定程度上减少拟合。
??在CNN中,BN该层应用于非线性激活函数之前。由于神经网络隐藏层的输入是上一层非线性激活函数的输出,其分布在训练初期仍在剧烈变化。此时,不能很好地缓解一阶矩和二阶矩 Covaiate Shift;而BN的分布更接近正态分布,限制其一阶矩和二阶矩能使输入到激活函数的值分布更加稳定。
可以选择较大的初始学习率。因为这个算法收敛很快。 可以不用dropout,L2正则化。 不需要使用局部响应归一化。 可以把数据集彻底打乱。 模型更加健壮。 Batch Normalization非常依赖Batch的大小,当Batch值很小时,计算的均值和方差不稳定。 所以BN不适用于以下几个场景:小Batch,RNN等。、
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、 由图可以看出,由于点云的旋转非常的简单,只需要对一个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对于场景的分割效果十分一般,由于其网络直接暴力地将所有的点最大池化为了一个全局特征,因此局部点与点之间的联系并没有被网络学习到。在分类和物体的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原理与区别
首先先贴一下这几个损失函数的图像:
其中,yi是真实值,f(xi)是预测值,n是样本点个数
优缺点: 优点:无论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,具有较为稳健性的解 缺点:在中心点是折点,不能求导,梯度下降时要是恰好学习到w=0就没法接着进行了
什么时候用? 回归任务 简单模型 神经网络通常比较复杂,直接使用L1 loss作为损失函数的比较少
其中,yi是真实值,f(xi)是预测值,n是样本点个数
优缺点: 优点:各点都连续光滑,方便求导,具有较为稳定的解 缺点:不是特别的稳健,因为当函数的输入值距离真实值较远的时候,对应loss值很大在两侧,则使用梯度下降法求解的时候梯度很大,可能导致梯度爆炸
什么时候使用? 回归任务 数值特征不大(防止loss太大,继而引起梯度大,梯度爆炸) 问题维度不高(loss本身比较简单,高纬度的还是得要更复杂的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 ,所以着重介绍一下这个: SGD:随机梯度下降: 用样本中的一些例子来近似所有的样本,来调整,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,容易陷入到局部最优解中。
深度学习之动态调整学习率LR
深度网络模型是在一个未知且参数量很大的复杂函数上进行训练的,训练的目的是找到一套最优的参数,学习率 lr 控制了参数更新的速度,以及模型学习的速度。 其中 θ t + 1是第 t + 1次迭代后的参数值, θ t 是第 t次迭代后的参数值, l r是学习率, g ( θ t ) 是参数 θ 在第 t 次迭代时计算得到的梯度值。
因为一开始要让网络朝着正确的方向加速收敛,但是到接近目标的时候就要慢一点收敛,因此要动态地调整学习率。
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的区别
在各个网络模型中,ResNet,FPN等采用的element-wise add来融合特征,而DenseNet等则采用concat来融合特征。 concat是通道数的增加。 add是特征图的相加,通道数不变。
add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。 concat是通道数的合并,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加的。 add的计算量要比concat的计算量小很多。
比如说使用了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)越小,拟合能力却强(可能产生过拟合);反之,拟合能力越弱(可能产生欠拟合)。偏差越大,越偏离真实数据。
方差描述的是预测值的变化范围,离散程度,也就是离期望值的距离。方差越大,数据的分布越分散,模型的稳定程度越差
。
方差也反应了模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。由方差带来的误差通常体现在测试误差相对于训练误差的增量上。
方差通常是由于模型的复杂度相对于训练样本数过高导致的。方差越小,模型的泛化能力越高;反之,模型的泛化能力越低
。
如果模型在训练集上拟合效果比较优秀,但是在测试集上拟合效果比较差,则表示方差较大,说明模型的稳定程度较差,出现这种现象可能是由于模型对训练集过拟合造成的。