python算法面试题

这是我年前做技术面试官,搜集的面试题,从python基础-机器学习-NLP-CV-深度学习框架-Linux-yolo都有一些题目。针对不同方向的应试者问相应方向的问题。
基本上都是面试八股文,收集记录一下,以后自己也会用的到。

面试题

python基础:

1,一行代码实现1–100之和

2,谈下python的GIL
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

3、一句话解释什么样的语言能够用装饰器?
函数可以作为参数传递的语言,可以使用装饰器

4、简述with方法打开处理文件帮我我们做了什么?
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open
写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close
(当然还有其他自定义功能,有兴趣可以研究with方法源码)

5、python中copy和deepcopy区别
1、复制不可变数据类型,不管copy还是deepcopy,都是同一个地址当浅复制的值是不可变对象(数值,字符串,
时和=“赋值”的情况一样,对象的id值与浅复制原来的值相同。
2、复制的值是可变对象(列表和字典)
浅拷贝copy有两种情况:
第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。
深拷贝deepcopy:完全复制独立,包括内层列表和字典

6,请将[i for i in range(3)]改成生成器

9、静态方法和类方法区别?
Python的类就是个语法糖。一个函数写在类里面和写在类外面没有区别,唯一的区别就是参数,所谓实例方法就是第一个参数是self,所谓类方法就是第一个参数是class,而静态方法不需要额外的参数,所以必须区分。

1、简述面向对象的三大特性。
封装: 封装指的是把一堆数据属性与方法数据放在一个容器中,这个容器就是对象。让对象可以通过 “.” 来调用对象中的数据属性与方法属性。
继承: 继承指的是子类可以继承父类的数据属性与方法属性,并可以对其进行修改或使用。
多态: 在python中的多态指的是让多种类若具备类似的数据属性与方法属性,都统一好命名规范,这样可以提高开发者的代码统一性,使得调用者更方便去理解。

Python机器学习:

1.有监督学习和无监督学习有什么区别?
有监督学习:对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。(LR,SVM,BP,RF,GBDT)
无监督学习:对未标记的样本进行训练学习,比发现这些样本中的结构知识。(KMeans,DL)

4.线性分类器与非线性分类器的区别以及优劣
如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是。
常见的线性分类器有:LR,贝叶斯分类,单层感知机、线性回归
常见的非线性分类器:决策树、RF、GBDT、多层感知机
SVM两种都有(看线性核还是高斯核)
线性分类器速度快、编程方便,但是可能拟合效果不会很好
非线性分类器编程复杂,但是效果拟合能力强

扫描二维码关注公众号,回复: 14945528 查看本文章

5.为什么一些机器学习模型需要对数据进行归一化?
归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

1)归一化后加快了梯度下降求最优解的速度。等高线变得显得圆滑,在梯度下降进行求解时能较快的收敛。如果不做归一化,梯度下降过程容易走之字,很难收敛甚至不能收敛

2)把有量纲表达式变为无量纲表达式, 有可能提高精度。一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)
逻辑回归等模型先验假设数据服从正态分布。

7.哪些机器学习算法不需要做归一化处理?
概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。而像adaboost、gbdt、xgboost、svm、lr、KNN、KMeans之类的最优化问题就需要归一化。

8.标准化与归一化的区别
简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。

15.Gradient boosting算法(GBM)和随机森林都是基于树的算法,它们有什么区别?
最根本的区别是,随机森林算法使用bagging技术做出预测;而GBM是采用boosting技术做预测的。在bagging技术中,数据集用随机采样的方法被划分成n个样本。然后,使用单一的学习算法,在所有样本上建模。接着利用投票或者求平均来组合所得到的预测。bagging是平行进行的,而boosting是在第一轮的预测之后,算法将分类出错的预测加高权重,使得它们可以在后续一轮中得到校正。这种给予分类出错的预测高权重的顺序过程持续进行,一直到达到停止标准为止。随机森林通过减少方差(主要方式)提高模型的精度。生成树之间是不相关的,以把方差的减少最大化。在另一方面,GBM提高了精度,同时减少了模型的偏差和方差。

NLP面试题

6: CRF和HMM的区别.
1.HMM模型存在隐马假设, 而CRF不存在, 因此HMM的计算速度要比CRF模型快很多, 适用于对预测性能要求较高的场合.
2.同样因为隐马假设, 当预测问题中隐含序列单元并不是只与上一个单元有关时, HMM的准确率会大大降低, 而CRF不受这样限制, 准确率明显高于HMM.

7:CRF是如何训练的? 损失函数是什么?
(1)CRF层能从训练数据中获得约束性的规则.
(2)CRF层可以为最后预测的标签添加一些约束来保证预测的标签的合法性.
在训练数据训练的过程中, 这些约束可以通过CRF层自动学习到.从而大大降低标签序列在预测中非法序列出现的概率。
损失函数:
CRF损失函数由实际路径分数和所有可能路径的总分数组成。
(1)对于输入序列X对应的输出tag序列y, 定义分数如下(本质上就是发射概率和转移概率的累加和)
(2)利用softmax函数, 为每一个正确的tag序列y定义一个概率值, 在真实的训练中, 只需要最大化似然概率p(y|X)即可, 具体使用对数似然如下
(3)真实路径在所有可能的路径中有最高的分数。在训练过程中,模型的参数值将会一次又一次的更新,以继续增加真实路径的分数百分比。

6: CRF和HMM的区别.
1.HMM模型存在隐马假设, 而CRF不存在, 因此HMM的计算速度要比CRF模型快很多, 适用于对预测性能要求较高的场合.
2.同样因为隐马假设, 当预测问题中隐含序列单元并不是只与上一个单元有关时, HMM的准确率会大大降低, 而CRF不受这样限制, 准确率明显高于HMM.

5: batch_size参数是如何影响模型的训练效果? 收敛速度? 过拟合的? 出现对应的问题你是如何解决的? 你用过哪些方法?
答:模型每次更新时,计算梯度是计算整个Batch的平均梯度,大的batch_size减少训练时间,提高稳定性。但是过大的batch_size泛化能力下降,在一定范围内,增加batchsize有助于收敛的稳定性,但是随着batchsize的增加,模型的性能会下降,收敛速度变慢。通过对训练步数的影响,小的batch_size使模型迭代次数增多,提前到达拟合点,但是epoch没结束,继续学习训练数据,容易导致过拟合于原始数据。
解决方法:增加了BN 层,dropout,更换了梯度下降的优化方法

4: 我们一直在说ReLU比sigmoid好, 但是你能说说ReLU有什么问题呢? 你说的问题请深入到数学本质来阐述你的解释.
答: 虽说ReLU比sigmoid好,但是ReLU也有不可避免的缺陷,它有一个被称为 “ReLU 死区” 的问题:在训练过程中,一些神经元会“死亡”,即它们停止输出 0 以外的任何东西。在某些情况下,你可能会发现你网络的一半神经元已经死亡,特别是使用大学习率时。 在训练期间,如果神经元的权重得到更新,使得神经元输入的加权和为负,则它将开始输出 0 。当这种情况发生时,由于当输入为负时,ReLU函数的梯度为0,神经元就只能输出0了。

3: 请说明Bert的注意力和seq2seq的注意力不同之处?
答:bert 的根基源于Transformer,所以其注意力机制是多头注意力机制,相比传统的RNN等模型更加高效,可以并行化处理同时能捕捉长距离的语义和结构依赖.提取的特征也更加丰富,而seq2seq的注意力Encoder端的所有信息压缩成一个固定长度的语义向量中, 用这个固定的向量来代表编码器端的全部信息. 这样既会造成信息的损耗, 也无法让Decoder端在解码的时候去用注意力聚焦哪些是更重要的信息,也无法并行处理问题

2: Bert为啥能解决一词多意?怎么做到的?
答:同一个字在转换为bert的输入,虽然embedding的向量是一样,但是通过bert中的多层transformer encoder之后,attention关注不同的上下文,就会导致不同句子输入到bert之后,相同字输出的字向量是不同的,这样就解决了一词多义的问题。

(1)介绍dropout,为什么可以起到防止过拟合的作用

6.下列哪些技术能被用于计算两个词向量之间的距离?
B. 欧氏距离(Euclidean Distance)
C. 余弦相似度(Cosine Similarity)

56.NLP中的停用词是什么?
句子中出现的常见单词会给句子增加分量,被称为停用词。这些停用词充当桥梁,并确保句子在语法上是正确的。简单来说,在处理自然语言数据之前被过滤掉的单词被称为停用词,它是一种常见的预处理方法。

59.处理文本数据时,RNN比CNN有什么特点?
传统文本处理任务的方法一般将TF-IDF向量作为特征输入,这样实际上丢失了输入的文本系列中每个单词的顺序。
CNN一般会接收一个定长的向量作为输入,然后通过滑动窗口加池化的方法将原来的输入转换为一个固定长度的向量表示。这样做可以捕捉到文本中的一些局部特征,但是两个单词之间的长距离依赖关系难以学习。

RNN能够很好处理文本数据变长并且有序的输入序列。将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力。
在文本分类任务中,激活函数f可以选取Tanh或ReLU函数,g可以采用Softmax函数。
通过不断最小化损失误差(即输出的y与真实类别之间的距离),可以不断训练网络,使得得到的循环神经网络可以准确预测文本类别。相比于CNN,RNN由于具备对序列信息的刻画能力,往往能得到更加准确的结果。

60.RNN为什么会出现梯度消失或梯度爆炸?有哪些改进方案?
RNN的求解可以采用BPTT(Back Propagation Through Time)算法实现。实际上是BP的简单变种。RNN设计的初衷在于捕捉长距离输入之间的依赖关系,然而使用BPTT的算法并不能成功捕捉远距离依赖关系,这一现象源于深度神经网络中的梯度消失问题。

由于预测误差沿神经网络每一层反向传播,当雅克比矩阵最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸。反之若最大特征值小于1,梯度大小会指数减小,产生梯度消失。梯度消失意味着无法通过加深网络层数来提升预测效果,只有靠近输出的几层才真正起到学习的作用,这样RNN很难学习到输入序列中的长距离依赖关系。


梯度爆炸可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值的时候,对梯度进行等比缩放。而梯度消失问题需要对模型本身进行改进。深度残差网络是对前馈神经网络的改进。通过残差学习的方式缓解了梯度消失的现象,从而可以学习到更深层的网络表示。对于RNN来说,长短时记忆模型及其变种门控循环单元等模型通过加入门控机制,很大程度上缓解了梯度消失带来的损失。

在CNN中采用ReLU激活函数可以有效改进梯度消失,取得更好收敛速度和收敛结果,

64.常见的概率图模型中,哪些是生成式模型,哪些是判别式模型?

首先需要弄清楚生成式模型与判别式模型的区别。
假设可观测的变量集合为X,需要预测的变量集合为Y,其他的变量集合为Z。生成式模式是对联合概率分布P(X,Y,Z)P(X,Y,Z)P(X,Y,Z)进行建模,在给定观测集合X的条件下,通过计算边缘分布来求得对变量集合Y的推断。

判别式模型是直接对条件概率分布P(Y,Z∣X)P(Y,Z|X)P(Y,Z∣X)进行建模,然后消掉无关变量Z就可以得到对变量集合Y的预测,即常见的概率图模型由朴素贝叶斯、最大熵模型、贝叶斯网络、隐马尔可夫模型、条件随机场、pLSA、LDA等。

其中朴素贝叶斯、贝叶斯网络、pLSA、LDA属于生成式。
最大熵模型属于判别式。
隐马尔可夫模型、条件随机场是对序列数据进行建模的方法,其中隐马尔可夫属于生成式,条件随机场属于判别式

CV面试题

3、神经网络是生成模型还是判别模型?
判别模型,直接输出类别标签,或者输出类后验概率p(y|x)

5、模型压缩的主要方法有哪些?
(1)从模型结构上来说分为:模型剪枝,模型蒸馏,NAS自动学习模型结构等。
(2)模型参数量化上包括数值精度量化到FP16等。
注:模型剪枝的例子很多出现在轻量化网络上面,比如mobilenet v3里面出现的group conv,更改网络末端计算量大的层。深度分离卷积等。
模型蒸馏就是迁移学习。
参数量也在mobilenet v3里面有体现,减少网络头部的卷积核的数量。

11、dropout的原理,为什么可以防止过拟合?
dropout的原理就是在网络前向传播的时候,让神经元的激活值以一定的概率变为零,这样可以使模型的泛化性能更强。

前向:训练时,利用伯努利分布,随机选出一个只包含0,1的mask矩阵,然后用这个mask矩阵去对应乘上每个输入得到的就是Dropout后的结果,再除以(1-p);测试的时候不用Dropout
反向:训练时根据mask来求对应的梯度,测试时无Dropout

dropout为什么可以防止过拟合呢?
1、dropout其实相当于我们日常用到的基于平均的ensemble,ensemble有两种方式,基于平均的ensemble和投票的ensemble。对于网络中的部分神经元进行概率暂时舍弃,这样相当于训练了多个网络。
2、dropout还取消了神经元之间的共适应关系,使得网络的输出不依赖于网络中的某些隐含节点的固定作用,使模型的鲁棒性更好。
3、类似于生物进化的角色,环境的变化不会对物种造成毁灭性的影响。

15、简述一下数据增强的方法
主要分为离线增强和在线增强的方法。
离线增强是指数据集在本地进行处理。
在线增强:翻转(水平,垂直),旋转,缩放,裁剪,平移,添加噪声等。

17.如何理解卷积、池化等、全连接层等操作
卷积的作用:相当于滤波器,提取图片不同的特征,生成feature_map
激活函数的作用:引入非线性因素
池化的作用:1、减少特征维度大小,使特征更加可控,减少参数个数,从而控制过拟合程度,增加网络对略微变换后的图像的鲁棒性;2、达到一种不变性,包括translation,rotation,scale等。3、会造成梯度稀疏,丢失信息,GAN网络中通常使用带步长的卷积,进行下采样来替代pooling。
全连接的作用:对提取到的特征进行分类和回归。

18.1x1大小的卷积核的作用
通过控制卷积核个数实现升维或者降维,从而减少模型参数
对不同特征进行归一化操作(BN),增加非线性(relu)
用于不同channel上特征的融合

19.常见激活函数特点
激活函数分为两类,饱和激活函数和不饱和激活函数。
饱和激活函数的代表是sigmoid,tanh。特点是:收敛慢,容易梯度消失。
非饱和激活函数的特点是:收敛快,抑制梯度消失,抑制过拟合。
sigmoid:计算量大。梯度消失,会改变原始数据分布。
tanh:计算量大,梯度消失比sigmoid好点
relu:计算简单,有效防止了梯度消失和梯度爆炸,会出现神经元死亡。
leakrelu:解决了神经元死亡的问题,但是多了一个参数a
ELU:避免dying神经元,并且处处连续,从而加速SGD,但是计算比较复杂

23、在机器学习中为什么经常使用梯度下降而不使用牛顿法?
1、牛顿法的目标函数是二阶导数,在高维的情况下这个矩阵非常大,计算和储存都是问题。
2、在小批量的情况下,牛顿法对噪声的估计太大。
3、在目标函数非凸的情况下,牛顿法易受到鞍点和极大值点的吸引。

32、SGD、Momentum、Adagard、Adam
首先由于病态曲率的存在会导致训练减慢以及局部极小值的问题。所以有了接下来的优化函数。
详解看我的博文
1、SGD算法在训练过程中很有可能选择被标记错误的标记数据,或者与正常数据差异很大的数据进行训练,那么使用此数据求得梯度就会有很大的偏差,因此SGD在训练过程中会出现很强的随机现象。SGD一次只进行一次更新,没有冗余,可以新增样本。但是SGD更新会造成严重的震荡。
所以出现了mini-batch梯度下降。
2、在随机梯度的学习算法中,每一步的步幅都是固定的,而在动量学习算法中,每一步走多远不仅依赖于本次的梯度的大小还取决于过去的速度。速度v是累积各轮训练参的梯度。动量法可以加速SGD,并且抑制震荡,使得梯度方向不变的维度更新更快,梯度方向改变的维度更新变慢,可以加快收敛,减少震荡,但是需要一定的先验知识。
3、前面的随机梯度和动量随机梯度算法都是使用全局的学习率,所有的参数都是统一步伐的进行更新的。AdaGrad其实很简单,就是将每一维各自的历史梯度的平方叠加起来,然后更新的时候除以该历史梯度值即可。所以Adagrad对低频的参数有较大的更新,对高频的参数有较小的更新,因此,对于稀疏的数据他的表现很好。缺点是Adagrad的学习率会不断收缩,最终变得非常小。
4、虽然AdaGrad在理论上有些较好的性质,但是在实践中表现的并不是很好,其根本原因就是随着训练周期的增长,学习率降低的很快。而RMSProp算法就在AdaGrad基础上引入了衰减因子
5、虽然动量加速了我们对最小值方向的搜索,但RMSProp阻碍了我们在振荡方向上的搜索.Adam通过名字我们就可以看出他是基于动量和RMSProp的微调版本,该方法是目前深度学习中最流行的优化方法。

如果数据是稀疏的就用自适应的方法,比如说:Adagrad,Adam,RMSprop等,大多数情况下Adam都可以取得比较好的效果,但是SGD在有比较好的初始化条件下,可以更快的收敛,也可以找到最小点。

pytorh面试题

八. pytorch中train和eval有什么不同
(1). model.train()——训练时候启用
启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为True
(2). model.eval()——验证和测试时候启用
不启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为False

train模式会计算梯度,eval模式不会计算梯度。

8,可视化工具使用的是什么

9,如何使用GPU训练模型
使用GPU加速模型非常简单,只要将模型和数据移动到GPU上。核心代码只有几行
# 定义模型

device = torch.device(“cuda:0” if torch.cuda.is_available() else “cpu”)
model.to(device) # 移动模型到cuda
# 训练模型

features = features.to(device) # 移动数据到cuda
labels = labels.to(device) # 或者 labels = labels.cuda() if torch.cuda.is_available() else labels

10,如何查看GPU 使用情况,运存情况
nvidia-smi

11,矩阵变换时concat ,和 stack的区别。
和numpy类似,可以用concat和stack方法对多个张量进行合并,可以用tf.split方法把一个张量分割成多个张量。

12,神经网络训练过程中GPU占用率低怎么处理。

75、pytorch的函数
1、DataLoader()加载数据
2、初始化权重和bais
3、optim 优化方式,学习率学习方式
4、损失函数 torch.nn.
5、Conv,pool,relu,dropout,FC等
6、反向传播 loss.backword
7、保存模型 torch.save 加载模型 torch.load

tensorflow面试题

tensorflow1.x和2.x区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Re7Yh0oS-1675147990479)(…/AppData/Roaming/Typora/typora-user-images/image-20221024092557715.png)]

Autograph是TensorFlow2.0的机制。

	动态计算图运行效率相对较低。

​ 可以用@tf.function装饰器将普通Python函数转换成和TensorFlow1.0对应的静态计算图构建代码。

​ 在TensorFlow1.0中,使用计算图分两步,第一步定义计算图,第二步在会话中执行计算图。

​ 在TensorFlow2.0中,如果采用Autograph的方式使用计算图,第一步定义计算图变成了定义函数,第二步执行计算图变成了调用函数。

​ 不需要使用会话了,一些都像原始的Python语法一样自然。

​ 实践中,我们一般会先用动态计算图调试代码,然后在需要提高性能的的地方利用@tf.function切换成Autograph获得更高的效率。

tf.print() 和print() 有什么不同

Autograph机制可以将动态图转换成静态计算图,兼收执行效率和编码效率之利。

当然Autograph机制能够转换的代码并不是没有任何约束的,有一些编码规范需要遵循,否则可能会转换失败或者不符合预期。

​ 1,被@tf.function修饰的函数应尽可能使用TensorFlow中的函数而不是Python中的其他函数。例如使用tf.print而不是print,使用tf.range而不是range,使用tf.constant(True)而不是True.

​ (解释:Python中的函数仅仅会在跟踪执行函数以创建静态图的阶段使用,普通Python函数是无法嵌入到静态计算图中的,所以 在计算图构建好之后再次调用的时候,这些Python函数并没有被计算,而TensorFlow中的函数则可以嵌入到计算图中。使用普通的Python函数会导致 被@tf.function修饰前【eager执行】和被@tf.function修饰后【静态图执行】的输出不一致。)

​ 2,避免在@tf.function修饰的函数内部定义tf.Variable.

​ (解释:如果函数内部定义了tf.Variable,那么在【eager执行】时,这种创建tf.Variable的行为在每次函数调用时候都会发生。但是在【静态图执行】时,这种创建tf.Variable的行为只会发生在第一步跟踪Python代码逻辑创建计算图时,这会导致被@tf.function修饰前【eager执行】和被@tf.function修饰后【静态图执行】的输出不一致。实际上,TensorFlow在这种情况下一般会报错。)

​ 3,被@tf.function修饰的函数不可修改该函数外部的Python列表或字典等数据结构变量。

​ (解释:静态计算图是被编译成C++代码在TensorFlow内核中执行的。Python中的列表和字典等数据结构变量是无法嵌入到计算图中,它们仅仅能够在创建计算图时被读取,在执行计算图时是无法修改Python中的列表或字典这样的数据结构变量的。)

Linux面试题

6、列举几个常用的Linux命令。
答:

列出文件列表:ls【参数 -a -l】

创建目录和移除目录:mkdir rmdir

用于显示文件后几行内容:tail,例如: tail -n 1000:显示最后1000行

打包:tar -xvf

打包并压缩:tar -zcvf

查找字符串:grep

显示当前所在目录:pwd创建空文件:touch

编辑器:vim vi

7,查看进程的命令
ps

20、怎么使一个命令在后台运行?
答:

一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)

22, “<”“<<”“>>”>" 的区别含义

23,如何停止进程。

项目相关的问题

1,人脸检测系统,每新增一个人就需要重新训练一边,影响效率,你有没有什么好的想法。

11.给你一个有1000列和1百万行的训练数据集,这个数据集是基于分类问题的。经理要求你来降低该数据集的维度以减少模型计算时间,但你的机器内存有限。你会怎么做?(你可以自由做各种实际操作假设。)
你的面试官应该非常了解很难在有限的内存上处理高维的数据。以下是你可以使用的处理方法:

1.由于我们的RAM很小,首先要关闭机器上正在运行的其他程序,包括网页浏览器等,以确保大部分内存可以使用。
2.我们可以随机采样数据集。这意味着,我们可以创建一个较小的数据集,比如有1000个变量和30万行,然后做计算。
3.为了降低维度,我们可以把数值变量和分类变量分开,同时删掉相关联的变量。对于数值变量,我们将使用相关性分析;对于分类变量,我们可以用卡方检验。
4.另外,我们还可以使用PCA(主成分分析),并挑选可以解释在数据集中有最大偏差的成分。
5.利用在线学习算法,如VowpalWabbit(在Python中可用)是一个不错的选择。
6.利用Stochastic GradientDescent(随机梯度下降法)建立线性模型也很有帮助。
7.我们也可以用我们对业务的理解来估计各预测变量对响应变量的影响的大小。但是,这是一个主观的方法,如果没有找出有用的预测变量可能会导致信息的显著丢失。

python开发面试题

1.Django创建项目的命令

django-admin startproject 项目名称

​ python manage.py startapp 应用app名

3.对 MVC,MVT 解读的理解

​ M:Model,模型,和数据库进行交互

​ V:View,视图,负责产生 Html 页面

​ C:Controller,控制器,接收请求,进行处理,与 M 和 V 进行交互,返回应答。

img

MVT:

​ M:Model,模型,和 MVC 中的 M 功能相同,和数据库进行交互。

​ V:view,视图,和 MVC 中的 C 功能相同,接收请求,进行处理,与 M 和 T 进行交互,返回应答。

​ T:Template,模板,和 MVC 中的 V 功能相同,产生 Html 页面.

10.Python 中三大框架各自的应用场景

​ django:

​ 主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000, 如果要实现高并发的话,就要对 django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 socket 实现 http 的通信,底层用纯 c,c++写提升效率,ORM 框架给干掉,自己编写封装与数据库交互的框架,因为啥呢,ORM 虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询;

​ flask:

​ 轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都需要用第三方的扩展来实现。比如可以用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。

​ 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。Python 最出名的框架要数 Django,此外还有 Flask、Tornado 等框架。虽然 Flask 不是最出名的框架,但是 Flask 应该算是最灵活的框架之一,这也是 Flask 受到广大开发者喜爱的原因。

​ Tornado:

​ Tornado 是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

​ 得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado是实时 Web 服务的一个 理想框架。

yolo面试题

​ yolo的思想:将整张图片作为输入,直接在输出层回归bounding box的位置及其所属类别

​ 和RCNN、faster-RCNN的不同:这两者也是将整张图片作为输入,但是faster-RCNN采用RCNN的proposal+classifier思想。将提取proposal的步骤放在CNN中,而yolo则采用直接回归的思想

1,介绍YOLO,并且解释一下YOLO为什么可以这么快?
yolo是单阶段检测算法的开山之作,最初的yolov1是在图像分类网络的基础上直接进行的改进,摒弃了二阶段检测算法中的RPN操作,直接对输入图像进行分类预测和回归,所以它相对于二阶段的目标检测算法而言,速度非常的快,但是精度会低很多;但是在迭代到目前的V4、V5版本后,yolo的精度已经可以媲美甚至超过二阶段的目标检测算法,同时保持着非常快的速度,是目前工业界内最受欢迎的算法之一。yolo的核心思想是将输入的图像经过backbone特征提取后,将的到的特征图划分为S x S的网格,物体的中心落在哪一个网格内,这个网格就负责预测该物体的置信度、类别以及坐标位置。

  1. 介绍一下NMS和IOU的原理;
    NMS全称是非极大值抑制,顾名思义就是抑制不是极大值的元素。在目标检测任务中,通常在解析模型输出的预测框时,预测目标框会非常的多,其中有很多重复的框定位到了同一个目标,NMS的作用就是用来除去这些重复框,从而获得真正的目标框。而NMS的过程则用到了IOU,IOU是一种用于衡量真实和预测之间相关度的标准,相关度越高,该值就越高。IOU的计算是两个区域重叠的部分除以两个区域的集合部分,简单的来说就是交集除以并集。

在NMS中,首先对预测框的置信度进行排序,依次取置信度最大的预测框与后面的框进行IOU比较,当IOU大于某个阈值时,可以认为两个预测框框到了同一个目标,而置信度较低的那个将会被剔除,依次进行比较,最终得到所有的预测框。

  1. 对于小目标检测,你有什么好的方案或者技巧?
    图像金字塔和多尺度滑动窗口检测(MTCNN)
    多尺度特征融合检测(FPN、PAN、ASFF等)
    增大训练、检测图像分辨率;
    超分策略放大后检测;

猜你喜欢

转载自blog.csdn.net/qq_58832911/article/details/128817297