- 社招面經
- 一,專案
- 二,深度學習、模型部署
- 2.1,目標檢測相關
- 2.2,深度學習相關
- 2.3,模型部署相關
- 2.4,編程語言相關
- 三,資料結構與演算法 coding
個人背景:碩士畢業1年,面試的崗位大部分是計算機視覺演算法工程師,少部分演算法優化、部署崗,然后這個面經是去年寫的,今天突然看到了,就發出來防止丟失,
社招面經
總的來說,大部分公司的技術面試都分為這幾個部分:專案描述和細節提問、深度學習+目標檢測演算法、資料結構和演算法代碼及編程語言相關,下面是我面試當中問到的一些問題,
一,專案
主要是描述專案背景、專案實作的功能及使用的方法和流程,面試官會針對他感興趣的點問一些技術細節,基本上只要能把專案流利的描述出來就問題不大,
二,深度學習、模型部署
2.1,目標檢測相關
1,兩階段檢測網路(Faster RCNN 系列)和一階段檢測網路(YOLO 系列)有什么區別?以及為什么兩階段比一階段精度高?
- 雙階段網路演算法更精細,把任務分成了正負樣本分類、
bbox初次回歸以及類別分類和bbox二次回歸, - 而
YOLO演算法更簡單粗暴,使用backbone對輸入影像提取特征后,將特征圖劃分成 \(S\times S\) 的網格,物體的中心坐標落在哪個網路內,該網格(grid)就負責預測目標的置信度、類別和bbox;YOLOv2-v5通過 \(1 \times 1\) 卷積輸出特定通道數的特征圖來,特征圖有N個通道,對應的每個grid都會有N個值,分別對應置信度、類別和bbox坐標,
個人感覺這種問題不好回答,也沒有標準答案,可能會出現你答的點不是面試官想要的,
可參考 你一定從未看過如此通俗易懂的YOLO系列(從v1到v5)模型解讀 (上) 和 一文讀懂Faster RCNN 文章,理解典型的雙階段檢測網路和單階段檢測網路,
2,說說你對 Focal Loss 的理解,為什么能解決分類問題中的類別不平衡問題?
作者認為一階段檢測網路的精度不高的原因主要在于:極度不平衡的正負樣本比例,從而導致梯度(gradient)被容易樣本(easy example)的損失主導,
作者通過 Focal Loss 公式讓置信度高(即容易樣本)的樣本的損失衰減的更厲害,從而降低容易樣本的 Loss 權重,從而讓模型在后期盡量去學習那些 hard 的樣本,
3,如何在模型訓練的時候判斷是否過擬合,及模型過擬合問題如何解決?
將訓練資料劃分為訓練集和驗證集,80% 用于訓練集,20% 用于驗證集(訓練集和驗證集一定不能相交);訓練的時候每隔一定 Epoch 比較驗證集但指標和訓練集是否一致,如果不一致,并且驗證集指標變差了,即意味著過擬合,
資料增強, 增加資料多樣性;- 正則化策略:如 Parameter Norm Penalties (引數范數懲罰),
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 作為邊界框預測的先驗框,每個邊界框都會預測 \(4\) 個偏移坐標 \((t_x,t_y,t_w,t_h)\),假設 \((c_x, c_y)\) 為 grid 的左上角坐標,\(p_w\)、\(p_h\) 是先驗框(anchors)的寬度與高度,那么網路預測值和邊界框真實位置的關系如下所示:
\[b_x = \sigma(t_x) + c_x \\\\ b_y = \sigma(t_y) + c_y \\\\ b_w = p_{w}e^{t_w} \\\\ b_h = p_{h}e^{t_h} \]假設某一層的
feature map的大小為 \(13 \times 13\), 那么grid cell就有 \(13 \times 13\) 個,則第 \(n\) 行第 \(n\) 列的grid cell的坐標 \((x_x, c_y)\) 就是 \((n-1,n)\),

正負樣本的確定:
- 正樣本:與
GT的IOU最大的框, - 負樣本:與
GT的IOU<0.5的框, - 忽略的樣本:與
GT的IOU>0.5但不是最大的框, - 使用 \(t_x\) 和 \(t_y\) (而不是 \(b_x\) 和 \(b_y\) )來計算損失,
8,詳細講解下 Faster RCNN 和 Mask RCNN 演算法程序,
參考以下兩篇文章理解 Faster RCNN 和 Mask RCNN 模型:
- 二階段目標檢測網路-Faster RCNN論文解讀
- 二階段目標檢測網路-Mask RCNN網路理解
9,最新的目標檢測演算法有哪些?
YOLOv4-v5、Scaled YOLOv4 和 Anchor-free 的演算法:CenterNet,
10,手寫 Soft NMS 和 Focal Loss,
2.2,深度學習相關
1,BN 的作用及 BN 作業流程,以及訓練和推理的區別?
2,普通卷積層、分組卷積、深度可分離卷積的 FLOPs 計算公式,
3,普通卷積層、分組卷積、深度可分離卷積的 MAC 計算公式,
4,詳細描述下你知道的輕量級網路:MobileNetV1、ShuffleNetv1-v2,
5,何謂正則化?
通過給模型的代價函式(損失函式)添加被稱為正則化項(regularizer)的懲罰,這稱為將模型(學習函式為 \(f(x; θ)\))正則化,正則化是一種思想(策略),給代價函式添加懲罰只是其中一種方法,
6,L2 正則化(權重衰減)原理,為什么它能防止模型過擬合?系數 $\lambda $ 如何取值?
L2 正則化(權重衰減)是另外一種正則化技術,通過加入的正則項對引數數值進行衰減,得到更小的權值,當 \(\lambda\) 較大時,會使得一些權重幾乎衰減到零,相當于去掉了這一項特征,類似于減少特征維度,假設待正則的網路引數為 \(w\),L2 正則化為各個元素平方和的 \(1/2\) 次方,其形式為:
實際使用時,一般將正則項加入目標函式,通過整體目標函式的誤差反向傳播,從而實作正則化影響和指導模型訓練的目的,
7,L1 正則化原理,系數 $\lambda $ 如何取值?
L1 范數: 為向量 x 各個元素絕對值之和,L1 正則化可以使權值引數稀疏,方便特征提取,
8,Pytorch 的 conv2d 函式的引數有哪些?以及模型輸出大小計算公式,并解釋為什么公式是這樣,
9,Pytorch 的 DataLoader 原理,
10,普通卷積程序描述下,
2.3,模型部署相關
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演算法, - 基于軟體優化的方法:根據計算機存盤系統的層次結構特性,選擇性地調整計算順序,主要有回圈拆分向量化、記憶體重排等,
2.4,編程語言相關
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,虛擬地址和物理記憶體的關系?
三,資料結構與演算法 coding
1,二分查找演算法 + 可運行代碼,
2,白板寫鏈表反轉,
3,包含 min 函式的堆疊 + 可運行代碼(劍指 Offer 30. 包含min函式的堆疊)
4,最長回文子串 + 時間復雜度
5,TOP k 問題-最小的 K 個數 + 說下你知道哪幾種解法,及各自時間復雜度
6,回傳轉置后的矩陣(逆時針)
7,冒泡排序及優化
8,求陣列中比左邊元素都大同時比右邊元素都小的元素,回傳這些元素的索引
9,手寫快速排序
10,手寫 softmax 算子 + 解釋代碼及衍生問題
12,無重復字符的最長子串
13,N 皇后問題
14,求最大的第 k 個數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538949.html
標籤:其他
