预备AI工程师升级必备:大厂常见图像分类面试题
圖像分類是深度學習計算機視覺技術中極其重要的應用場景和技術基礎,圖像檢測、語義分割等等各種任務場景都需要基于圖像分類的基礎能力。也是大家入門深度學習CV方向任務開發極好的切入點。
針對如此關鍵的圖像分類任務,飛槳PaddleClas團隊提煉、總結了在開發過程中常遇到的問題和一些巧妙的開發技巧(Trick),希望能幫助開發者更快、更好地獲得最佳的模型及應用效果。這門武功秘笈分為四篇:《基礎知識》、《模型訓練》、《數據大法》和《模型推理預測》,本文節選了其中10個小技巧,供各位大俠使用。
基礎知識篇
Q1:
圖像分類領域常用的評估指標有哪幾種?
A:
場景一:對于單標簽的圖像分類問題(僅包含1個類別與背景),評估指標主要有Precision、Recall和F-score等。
計算公式:
Precision = TP / (TP + FP)
Recall = TP / (TP + FN)
F-score = 2×Precision×Recall / ( Precision + Recall)
其中,TP(True Positive)表示將正類預測為正類;FP(False Positive)表示將負類預測為正類;TN(True Negative)表示將負類預測為負類;FN(False Negative)表示將正類預測為負類。
我們以一個例子來說明TP、FP、TN、FN(故事純屬虛構,如有雷同……)
富土康流水線三號質檢員張全蛋和趙鐵柱同時追求李小花的事兒在廠內鬧得沸沸揚揚,小花同志要如何選擇呢?思來想去,小花決定考驗一下他們的看家本領。
李小花找來100個產品,已知有20個次品,80個良品,讓全蛋和鐵柱將里面的次品挑選出來,誰的結果令小花滿意,小花就和誰處對象。結果全蛋挑選出50個他認為的次品,而實際情況是這50個里面,只有20個次品,剩余30個是良品;鐵柱挑選出了10個次品,而實際情況是這10個全部是次品。誰的技能更強一些呢?
小花委托相關部門用圖像分類的統計指標計算了一下。
張全蛋的數據統計結果
計算結果:
Precision=0.4,Recall=1,F-score =0.57
趙鐵柱的數據統計結果
計算結果:
Precision=1,Recall=0.5,F-score=0.66
從數據統計結果看,雖然鐵柱的F-score分值高于全蛋,但是全蛋的Recall卻高于鐵柱。最終,小花選擇了全蛋。小花說,作為手機質檢流水線的質檢員,必須保證不能有一個壞的手機流向市場,允許有誤檢、但是不能有漏檢的情況。于是乎幸福的全蛋抱得美人歸了。
場景二:對于類別數大于1的圖像分類問題,評估指標主要有Accuary和Class-wise Accuracy。
Accuary表示所有類別預測正確的圖像數量占總圖像數量的百分比;
Class-wise Accuracy是先對每個類別的圖像計算Accuracy,再對所有類別的Accuracy取平均。
Q2:針對不同的業務場景,如何選擇合適的模型進行訓練?
A:
說到選擇,很多人會有選擇困難癥,而究其原因,往往就是“窮“。當手里只有一兩個模型的時候,選擇什么都一樣。但當你擁有PaddleClas就不一樣了,它有24個系列模型,122個預訓練模型。
如果想在服務器端部署,推薦使用ResNet_vd、Res2Net_vd、DenseNet、Xception等適合于服務器端的系列模型;如果想在移動端側部署,則推薦使用MobileNetV3、GhostNet等適合于移動端的系列模型。下面兩張圖分別給出了服務端系列模型在T4 GPU上,以及移動端模型在驍龍855芯片上的精度-速度指標,在模型選取時,可以參考。
Q3:
針對深度神經網絡參數冗余的問題,目前有哪些比較好的解決方式?
A:
可以通過剪枝、量化、知識蒸餾等方法對模型進行壓縮,減少模型參數冗余。
模型剪枝:將權重矩陣中相對不重要的權值剔除,然后再重新對網絡進行微調;
模型量化:一種將浮點計算轉成低比特定點計算的技術,如:8 bit、4 bit等,可以有效的模型在推理過程中的計算復雜度,提高推理速度,降低推理計算的能耗。
知識蒸餾:使用教師模型(teacher model)去指導學生模型(student model)學習特定任務,保證小模型在參數量不變的情況下,性能有較大的提升,甚至獲得與大模型相似的精度指標。PaddleClas提供了一種簡單的知識蒸餾策略(Simple Semi-supervised Label Distillation, SSLD),基于ImageNet-1k驗證集,不同模型經過SSLD蒸餾均有3%以上的精度提升,更多細節可以參考SSLD知識蒸餾文檔:
https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/advanced_tutorials/distillation/distillation.md
模型訓練篇
Q1:
在目標檢測、圖像分割、關鍵點檢測等任務中,如何選擇合適的分類網絡做為骨干網絡?
A:
1. 在不考慮速度的情況下,對于大部分任務,推薦使用精度更高的預訓練模型和骨干網絡。PaddleClas開源了一系列的SSLD知識蒸餾預訓練模型,如ResNet50_vd_ssld、 Res2Net200_vd_26w_4s_ssld等,在模型精度和速度上非常有優勢;
2. 對于一些特定的任務,如圖像分割、關鍵點檢測等,對圖像分辨率的要求比較高,更推薦使用HRNet等能夠同時兼顧網絡深度和分辨率的神經網絡模型。PaddleClas提供了HRNet_W18_C_ssld、HRNet_W48_C_ssld等精度非常高的HRNet SSLD蒸餾系列預訓練模型。
大家可以使用這些精度更高的預訓練模型與骨干網絡,提升自己在其他任務上的模型精度。
Q2:
訓練過程中模型收斂很差,如何處理?
A:
建議您通過如下幾個維度進行檢查:
檢查數據標注,確保訓練集和驗證集的數據標注正確;
嘗試調整學習率(初期以10倍為單位進行調節),過大(訓練震蕩)或者過小(收斂太慢)的學習率都可能導致收斂效果差;
數據量太大,選擇的模型太小,難以學習所有數據的特征;
查看數據預處理的過程中是否使用了歸一化,如果沒有,會影響收斂速度;
如果數據量比較小,可以嘗試加載PaddleClas中提供的基于ImageNet-1k數據集的預訓練模型,可以大大提升訓練收斂速度;
數據集存在長尾問題,可以參考數據長尾問題解決方案。https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/faq.md#jump
Q3:
在模型訓練中,如何選擇合適的batch size?
A:
batch size是訓練神經網絡中的一個重要的超參數,該值決定了一次將多少數據送入神經網絡參與訓練。當batch size與學習率的值呈線性關系時,收斂精度幾乎不受影響。在基于ImageNet-1k數據集訓練神經網絡模型時,大部分的神經網絡選擇的初始學習率為0.1,batch size是256。在實際任務中,可以根據模型大小和顯存情況,將學習率設置為0.1k,batch_size設置為256k,并通過不斷調節學習率參數以獲得更優的性能。
Q4:在模型訓練過程中,有哪些調優的技巧?
A:
在模型訓練的過程中,通常會打印每一個epoch的訓練集準確率和驗證集準確率,二者刻畫了該模型在兩個數據集上的表現。
通常來說,訓練集的準確率比驗證集準確率微高或者二者相當是比較不錯的狀態。如果發現訓練集的準確率比驗證集高很多,說明在這個任務上已經過擬合,需要在訓練過程中加入更多的正則,如增大weight_decay的值、加入更多的數據增廣策略、加入label_smoothing策略等;如果發現訓練集的準確率比驗證集低一些,說明在這個任務上可能欠擬合,需要在訓練過程中減弱正則效果,如減小weight_decay的值、減少數據增廣方式、增大圖片RandomCrop區域面積、減弱圖片拉伸變換、去除label_smoothing等。
在PaddleClas中,可以很方便地在配置文件中對上面的參數進行配置,如下代碼。
use_mix:?True?#?是否使用混疊類數據增廣 ls_epsilon:?0.1?#?label?smoothing的epsilon值,該值不在(0,1)區間或者為None表示不使用label?smoothingOPTIMIZER:function:?'Momentum'params:momentum:?0.9regularizer:function:?'L2'factor:?0.000070?#?weight_decay的值TRAIN:transforms:-?DecodeImage:?#?讀入圖像并轉為RGB通道to_rgb:?Trueto_np:?Falsechannel_first:?False-?RandCropImage:?#?隨機裁剪size:?224scale:?[0.08,?1.0]?#?RandomCrop的區域面積比例范圍-?RandFlipImage:?#?隨機水平翻轉flip_code:?1-?AutoAugment:?#?使用自動增廣方式進行數據增廣(圖像變換類)-?NormalizeImage:?#?對圖像進行歸一化scale:?1./255.mean:?[0.485,?0.456,?0.406]std:?[0.229,?0.224,?0.225]order:?''-?RandomErasing:?#?使用隨機擦除的方法進行數據增廣(圖像裁剪類)EPSILON:?0.5sl:?0.02sh:?0.4r1:?0.3?????????????????????????????????????mean:?[0.,?0.,?0.]-?ToCHWImage:mix:?#?Mixup數據增廣,在use_mix設置為True時有效(圖像混疊類)-?MixupOperator:????alpha:?0.2?#?Mixup的超參數配置數據大法篇
Q1:
在數據不足的情況下,有哪些常見的數據增廣方法呢?
A:
數據增廣的目的是提升數據樣本的豐富度,PaddleClas將比較常見的數據增廣方法分為三大類:
圖像變換類:主要包括AutoAugment和RandAugment;
圖像裁剪類:主要包括CutOut、RandErasing、HideAndSeek和GridMask;
圖像混疊類:主要包括Mixup和Cutmix。
圖:數據增廣的可視化效果
更多數據增廣介紹可參考:PaddleClas教程→數據增廣。
https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/advanced_tutorials/image_augmentation/ImageAugment.md
Q2:
對于精度要求不是很高的圖像分類任務,需要準備多大的訓練數據集呢?
A:
訓練數據的數量往往和需要解決問題的復雜度有關,難度越大、精度要求越高,則數據集需求越大。通常情況下,訓練數據越多效果越好,但實際應用時,數據獲取往往比較困難,因此PaddleClas提供了一系列的預訓練模型,以降低用戶在自己的場景中,使用圖像分類模型時對數據的依賴。
如果您已經加載了PaddleClas中提供的預訓練模型,每個類別包括10-20張圖像即可保證基本的分類效果;
如果您沒有加載預訓練模型,每個類別需要至少包含100~200張圖像以保證基本的分類效果。
模型推理篇
Q1:
有哪些合適的預測方法可以進一步提升模型精度呢?
A:
PaddleClas在預測環節提供了多種提升模型精度方案,供開發者選用。
使用更大的預測尺度,比如說訓練時使用的是224,那么預測時可以考慮使用288或者320,這會直接帶來0.5%左右的精度提升;
使用測試時增廣的策略(Test Time Augmentation, TTA),將測試集通過旋轉、翻轉、顏色變換等策略,創建多個副本,并分別預測,最后將所有的預測結果進行融合,這可以大大提升預測結果的精度和魯棒性;
使用多模型融合的策略,將多個模型針對相同圖片的預測結果進行融合。
如果您在使用PaddleClas的遇到問題時,歡迎移步到ISSUE提問,有豐富經驗的飛槳資深工程師會及時幫你解決。
PaddleClas項目地址:(歡迎大家點Star支持!)
https://github.com/PaddlePaddle/PaddleClas
https://gitee.com/paddlepaddle/PaddleClas
如在使用過程中有問題,可加入飛槳官方QQ群進行交流:1108045677。
如果您想詳細了解更多飛槳的相關內容,請參閱以下文檔。
·飛槳開源框架項目地址·
GitHub:?
https://github.com/PaddlePaddle/Paddle?
Gitee:?
https://gitee.com/paddlepaddle/Paddle
·飛槳官網地址·
https://www.paddlepaddle.org.cn/
總結
以上是生活随笔為你收集整理的预备AI工程师升级必备:大厂常见图像分类面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python基础】为什么更改列表'y'
- 下一篇: 【论文解读】从BERT和XLNet到MP