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、K

——持续更新&spm=1001.2101.3001.5002&articleId=125562974&d=1&t=3&u=e25e688a326a40a4aa08ede140611d8d)
7290

被折叠的 条评论
为什么被折叠?



