面试的岗位大部分是计算机视觉算法工程师,少部分算法优化、部署岗。总的来说,大部分公司的技术面试都分为这几个部分:项目描述和细节提问、深度学习+目标检测算法、数据结构和算法代码及编程语言相关。下面是我面试当中问到的一些问题。
主要是描述项目背景、项目实现的功能及使用的方法和流程,面试官会针对他感兴趣的点问一些技术细节,基本上只要能把项目流利的描述出来就问题不大。
1,两阶段检测网络(Faster RCNN
系列)和一阶段检测网络(YOLO
系列)有什么区别?以及为什么两阶段比一阶段精度高?
bbox
初次回归以及类别分类和 bbox
二次回归。YOLO
算法更简单粗暴,使用 backbone
对输入图像提取特征后,将特征图划分成 的网格,物体的中心坐标落在哪个网络内,该网格(grid
)就负责预测目标的置信度、类别和 bbox
;YOLOv2-v5
通过 卷积输出特定通道数的特征图来,特征图有 N
个通道,对应的每个 grid
都会有 N
个值,分别对应置信度、类别和 bbox
坐标。个人感觉这种问题不好回答,也没有标准答案,可能会出现你答的点不是面试官想要的。
可参考 你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上) 和 一文读懂Faster RCNN 文章,理解典型的双阶段检测网络和单阶段检测网络。
2,说说你对 Focal Loss
的理解,为什么能解决分类问题中的类别不平衡问题?
作者认为一阶段检测网络的精度不高的原因主要在于:极度不平衡的正负样本比例,从而导致梯度(gradient
)被容易样本(easy example
)的损失主导。
作者通过 Focal Loss
公式让置信度高(即容易样本)的样本的损失衰减的更厉害,从而降低容易样本的 Loss
权重,从而让模型在后期尽量去学习那些 hard
的样本。
3,如何在模型训练的时候判断是否过拟合,及模型过拟合问题如何解决?
将训练数据划分为训练集和验证集,80%
用于训练集,20%
用于验证集(训练集和验证集一定不能相交);训练的时候每隔一定 Epoch
比较验证集但指标和训练集是否一致,如果不一致,并且验证集指标变差了,即意味着过拟合。
数据增强
, 增加数据多样性;L1, L2
正则化;Bagging
和其他集成方法;BN
(batch normalization)层或者 dropout
层(现在基本不用);Early Stopping
(提前终止训练)。4,如何在模型训练的时候判断是否欠拟合,及模型欠拟合问题如何解决?
underfitting
欠拟合的表现就是模型不收敛,即训练过程中验证集的指标比较差,Loss
不收敛。欠拟合的原因有很多种,这里以神经网络拟合能力不足问题给出以下参考解决方法:
He
正态分布初始化 he_normal
,深度学习框架都内置了很多权重初始化方法;ReLu
,循环神经网络中的循环层使用的激活函数一般为 tanh
,或者 ReLu
;SGD
优化器速度慢但是会达到最优.5,描述以下 YOLOv3
算法及 YOLOv4、YOLOv5
的改进点,及为什么 CIoU Loss
比 IoU Loss
效果好?
YOLOv3
相比前代主要的改进点如下:
Backbone
从 DarkNet19
升级为 DarkNet53
。FPN
的多尺度检测网络,解决小目标检测精度低的问题。softmax
函数。ground truth
对象只分配一个边界框。6,描述下 RoI Pooling
过程和作用,以及 RoI Align
的改进点。
参考这篇文章 Understanding Region of Interest — (RoI Align and RoI Warp)
7,YOLOv3
的标签编码解码过程,以及正负样本采样策略。
和 YOLOv2
一样,YOLOv3
依然使用 K-means
聚类的方法来挑选 anchor boxes
作为边界框预测的先验框。每个边界框都会预测 个偏移坐标 。假设 为 grid
的左上角坐标,、 是先验框(anchors
)的宽度与高度,那么网络预测值和边界框真实位置的关系如下所示:
假设某一层的
feature map
的大小为 , 那么grid cell
就有 个,则第 行第 列的grid cell
的坐标 就是 。
正负样本的确定:
GT
的 IOU
最大的框。GT
的 IOU<0.5
的框。GT
的 IOU>0.5
但不是最大的框。8,详细讲解下 Faster RCNN
和 Mask RCNN
算法过程。
参考以下两篇文章理解 Faster RCNN
和 Mask RCNN
模型:
9,最新的目标检测算法有哪些?
YOLOv4-v5
、Scaled YOLOv4
和 Anchor-free
的算法:CenterNet
。
10,手写 Soft NMS
和 Focal Loss
。
1,BN 的作用及 BN 工作流程,以及训练和推理的区别?
2,普通卷积层、分组卷积、深度可分离卷积的 FLOPs 计算公式。
3,普通卷积层、分组卷积、深度可分离卷积的 MAC 计算公式。
4,详细描述下你知道的轻量级网络:MobileNetV1、ShuffleNetv1-v2。
5,何谓正则化?
通过给模型的代价函数(损失函数)添加被称为正则化项(regularizer
)的惩罚,这称为将模型(学习函数为 )正则化。正则化是一种思想(策略),给代价函数添加惩罚只是其中一种方法。
6,L2
正则化(权重衰减)原理,为什么它能防止模型过拟合?系数 如何取值?
L2
正则化(权重衰减)是另外一种正则化技术,通过加入的正则项对参数数值进行衰减,得到更小的权值。当 较大时,会使得一些权重几乎衰减到零,相当于去掉了这一项特征,类似于减少特征维度。假设待正则的网络参数为 ,L2
正则化为各个元素平方和的 次方,其形式为:
实际使用时,一般将正则项加入目标函数,通过整体目标函数的误差反向传播,从而实现正则化影响和指导模型训练的目的。
7,L1
正则化原理,系数 如何取值?
L1
范数: 为向量 x
各个元素绝对值之和。L1
正则化可以使权值参数稀疏,方便特征提取。
8,Pytorch
的 conv2d
函数的参数有哪些?以及模型输出大小计算公式,并解释为什么公式是这样。
9,Pytorch
的 DataLoader
原理。
10,普通卷积过程描述下。
1,浮点数在计算机中的表示方式?
2,描述下你知道的模型量化知识。
3,知识蒸馏原理,及温度系数如何取值?
4,通用矩阵乘(GEMM
)优化算法有哪些?
二维矩阵相乘的 C++
代码如下;
vector<vector<int>> matrix_mul(vector<vector<int>> A, vector<vector<int>> B){
/*二维矩阵相乘函数,时间复杂度 O(n^3)
*/
// vector<vector<int>> A_T = matrix_transpose(A);
assert((*A.begin()).size()==B.size()); //断言,第一个矩阵的列必须等于第二个矩阵的行
int new_rows = A.size();
int new_cols = (*B.begin()).size();
int L = B.size();
vector<vector<int>> C(new_rows, vector<int>(new_cols,0));
for(int i=0; i<new_rows; i++){
for(int j=0; j<new_cols;j++){
for(int k=0; k<L; k++){
C[i][j] += A[i][k]*B[k][j];
}
// C[i][j] = vector_mul(A[i], get_col(B, j));
}
}
return C;
}
对这样的矩阵乘的算法优化可分为两类:
Strassen
算法和 Coppersmith–Winograd
算法。1,虚函数原理及作用?
2,C++
构造函数和析构函数的初始化顺序。
3,智能指针描述下?
4,static
关键字作用?
5,STL
库的容器有哪些,讲下你最熟悉的一种及常用函数。
6,vector
和 数组的区别?vector
扩容在内存中是怎么操作的?
7,引用和指针的区别?
8,C++ 中定义 int a = 2,; int b = 2 和 Python 中定义 a = 2 b=3 有什么区别?
9,OpenCV
读取图像返回后的矩阵在内存中是怎么保存的?
10,内存对齐原理描述,为什么需要内存对齐?
11,散列表的实现原理?
12,虚拟地址和物理内存的关系?
1,二分查找算法 + 可运行代码。
2,白板写链表反转。
3,包含 min 函数的栈 + 可运行代码(剑指 Offer 30. 包含min函数的栈)
4,最长回文子串 + 时间复杂度
5,TOP k 问题-最小的 K 个数 + 说下你知道哪几种解法,及各自时间复杂度
6,返回转置后的矩阵(逆时针)
7,冒泡排序及优化
8,求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引
9,手写快速排序
10,手写 softmax
算子 + 解释代码及衍生问题
12,无重复字符的最长子串
13,N 皇后问题
14,求最大的第 k 个数
更多内容,请参考 github 仓库-CV 算法工程师成长之路。
或者关注我的公众号,阅读更多干货文章。