【AI初识境】给深度学习新手开始项目时的10条建议
這是專欄《AI初識境》的第12篇文章。所謂初識,就是對相關技術有基本了解,掌握了基本的使用方法。
在成為合格的深度學習算法工程師,尤其是工業(yè)界能夠實戰(zhàn)的調參選手之前,總會踏足很多的坑。
今天就來說說那些需要掌握的基本技巧,如何避開那些新手常見的坑,以計算機視覺中的圖像分類任務為例。
請注意,這篇文章不是教你如何調參,而是教你不要在調參之前胡搞。
作者&編輯 | 言有三
?
1 項目開發(fā)之前應該做什么
在你真正開始擼代碼之前,送大家一句話,“磨刀不誤砍柴工”。
拿到一個任務的時候,先不要上來就開始訓模型,而是做好三件事。
1.1、知道你要做的任務是一個什么任務。
以圖像分類為例,貓狗分類是一個分類任務,隨便找個什么模型都能完成。
鳥類分類也是一個分類任務,但是不簡單,不是隨隨便便拿個模型就能搞定。
表情識別最終也是一個分類,但是這不僅僅是一個分類問題,而是檢測+分類問題。
產(chǎn)品經(jīng)理們只會告訴你要實現(xiàn)什么功能,而不會告訴你用什么方案,對于簡單任務來說這可能不需要思考,但是復雜任務一定要先充分調研認識。
你說上面的這個例子很簡單,一眼就明白,那么我再舉出幾個例子,你是否一下子就能明白背后的核心技術?
1.2、找到競爭對手,做好預期。
比如你要做一個表情識別API,要做一個美顏算法,一定要先看看你的競爭對手做的怎么樣了,就算最后你做出來跟別人還差十萬八千里,也不至于到最后一刻才發(fā)覺。這叫知人之明和自知之明,一定要先有。
在這個過程中,基本上就能確定要走的路,第一條路是追隨模仿別人,第二條路是超越別人,這兩者是不一樣的。
前者,只要把已有成熟的資料收集到位,經(jīng)驗足夠豐富,必定能成功,否則就是個人能力和資源問題。這樣的一條路,相信老大們會給你布置一個明確的時間節(jié)點。
比如表情識別,很成熟,那你做出來也不能比別人差太多。
如果是第二條路,那么就意味著沒有參考者,或者參考者做的也不行。那么最難的是什么,就是預期能做到什么水平。
可能技術已經(jīng)成熟了,沒人做,恭喜你,趕緊搞。
可能技術比較前沿,能做技術儲備,但是還無法落地。
可能根本就還做不了。
1.3、想好你需要什么樣的數(shù)據(jù),從源頭上降低任務的難度。
在公司干了四年活,大部分項目都需要自己準備數(shù)據(jù),不會有現(xiàn)成的數(shù)據(jù)可以使用,而如何準備數(shù)據(jù),這是需要經(jīng)驗的。
舉個最簡單的例子,假如我們需要開發(fā)一個分類算法來分析一張圖片中的人是不是在笑,圖像可能是這樣。
你會爬取或者從數(shù)據(jù)集中拿到很多不同表情的數(shù)據(jù)然后就直接開干嗎?顯然那是錯誤的路子。
開始一個任務后我們首先就應該想怎么降低任務的難度,對于此任務,起作用的只有嘴唇這塊區(qū)域,那么我們完全可以基于嘴唇區(qū)域來訓練一個分類模型。
高精度成熟的人臉檢測和關鍵點檢測算法是很多的,所以你可能需要準備的訓練數(shù)據(jù)是這樣的。當然,如果你直接基于關鍵點的結果來做也是可以的,這就回到了第一個問題了。
這樣至少有兩個好處,(1) 明顯這個分類更加簡單了。(2) 可以使用更小的輸入圖完成任務,計算代價也更低。
?
2 訓練模型從哪里開始
很少有一個任務可以拿現(xiàn)有的模型使用,你通常是需要訓練自己的模型的,那么在訓練一個模型的時候,應該怎么樣開始。
這里牽涉到3個問題,框架,基準模型和數(shù)據(jù),其中任何一環(huán)都有可能有問題。
2.1、首先確定框架
沒有一個深度學習任務不需要一個框架來訓練,很多的時候你不得不在不同的框架之間進行切換。比如做分類分割或者檢測,caffe都很好用。做風格化搞GAN,就得上tensorflow或者pytorch了,你一定要先選擇一個工具,不然很可能會陷入找到了很多中github方案,這個試了遇到困難換下一個,下一個又遇到困難。
有自己最拿手的一個框架,選定項目就堅定地干,遇到了問題就去解決。
關于框架,大家可以從我們的系列文章中開始快速上手。
【Keras速成】Keras圖像分類從模型自定義到測試
【paddlepaddle速成】paddlepaddle圖像分類從模型自定義到測試
【pytorch速成】Pytorch圖像分類從模型自定義到測試
【tensorflow速成】Tensorflow圖像分類從模型自定義到測試
【caffe速成】caffe圖像分類從模型自定義到測試
【mxnet速成】mxnet圖像分類從模型自定義到測試
【cntk速成】cntk圖像分類從模型自定義到測試
【DL4J速成】Deeplearning4j圖像分類從模型自定義到測試
【chainer速成】chainer圖像分類從模型自定義到測試
【MatConvnet速成】MatConvnet圖像分類從模型自定義到測試
2.2、然后確定基準模型
最終工業(yè)級部署的時候,你往往需要一個效率更高的模型。但是除非你是老司機,否則不應該在還沒有確定方案是否可行的時候就想自己的模型,而是應該從一個絕對可靠的模型開始,比如resnet18,比如mobilenet,正確地使用好它們,得到還不錯的結果,將它的結果作為你自己算法要PK的對象。
關于基準模型,我們已經(jīng)把最主要的模型全部解讀了一遍,可以從中選擇。
【完結】總結12大CNN主流模型架構設計思想
【模型解讀】從LeNet到VGG,看卷積+池化串聯(lián)的網(wǎng)絡結構
【模型解讀】network in network中的1*1卷積,你懂了嗎
【模型解讀】GoogLeNet中的inception結構,你看懂了嗎
【模型解讀】說說移動端基準模型MobileNets
【模型解讀】pooling去哪兒了?
【模型解讀】resnet中的殘差連接,你確定真的看懂了?
【模型解讀】“不正經(jīng)”的卷積神經(jīng)網(wǎng)絡
【模型解讀】從“局部連接”回到“全連接”的神經(jīng)網(wǎng)絡
【模型解讀】深度學習網(wǎng)絡只能有一個輸入嗎
【模型解讀】“全連接”的卷積網(wǎng)絡,有什么好?
【模型解讀】從2D卷積到3D卷積,都有什么不一樣
【模型解讀】淺析RNN到LSTM
【模型解讀】歷數(shù)GAN的5大基本結構
2.3、最后準備好數(shù)據(jù)
在前面你想好自己需要的數(shù)據(jù)了,接下來就是去采集到這些數(shù)據(jù)。完成一個項目,就是不斷迭代模型和數(shù)據(jù)的過程。
剛開始的時候,你不需要數(shù)據(jù)都到位,但是要考慮好以下因素。這里我們不管數(shù)據(jù)是自己采集的還是從公開數(shù)據(jù)集中獲取的。
(1) 準備大小合適的數(shù)據(jù)量。以二分類任務為例,你不能拿500張圖就開始干,沒任何意義。你不能苛求一開始就有50000萬數(shù)據(jù),也不合理,萬一搞失敗了還浪費資源。筆者先后做過10余個分類任務,完成任務上線從3000到10萬都用過,我的建議是,盡量先準備個3000數(shù)據(jù)再開干,不然就太沒誠意了。
(2) 從簡單數(shù)據(jù)開始。以人臉識別為例,各種公開數(shù)據(jù)集不要混著用,分布不一致難度也不相同,你應該先專注簡單的屬于同一個分布的,比如找10000個正臉或者姿態(tài)小的數(shù)據(jù),方案驗證通過之后再增加難度。
很多的時候,你還要考慮覆蓋各種場景(光照,背景)等。以上的這些東西,書不會告訴你,培訓也沒法教你,需要的是自己的積累,厚積薄發(fā)。
培養(yǎng)對數(shù)據(jù)的敏感性,可以從咱們的數(shù)據(jù)相關的文章開始看。
【數(shù)據(jù)】深度學習從“數(shù)據(jù)集”開始
【技術綜述】深度學習中的數(shù)據(jù)增強(下)
[綜述類] 一文道盡深度學習中的數(shù)據(jù)增強方法(上)
?
3 正確訓練模型的基本常識
終于講到訓練模型了,程序員干活從來不會一帆風順,你的小模型不會這么聽話,以下是一些必須要注意的事項,不管用什么框架都適用。
3.1 注意網(wǎng)絡的輸入大小
你極有可能是從finetune其他的模型開始,以圖像分類為例,公開的模型大多是以224*224為尺度,而你的任務未必也需要這樣。
如果你想要區(qū)分不同種類的鳥,那么因為細節(jié)在鳥的局部身體部位,你的輸入恐怕是要更大一些才能提取到好的特征,比如放大一倍,用448*448,這也是論文中常用的。
如果你只是要區(qū)分不同表情,用上了上面的嘴唇數(shù)據(jù),那224*224純屬浪費,你可能只需要一個48*48的輸入就足以很高準確率完成任務。
對于圖像分割和目標檢測,標準又不太一樣。究竟使用多大的輸入,這需要你依靠經(jīng)驗來確定,而且還和能給你多少資源,以及自己優(yōu)化模型的能力相關。
3.2 注意特征輸出大小
前面說了輸入,這里再說輸出,包括最后一層卷積的大小和通道數(shù)等。
首先看大小,對于一個分類任務來說,最后卷積層抽象為一個k*k的特征圖,然后進行池化,全連接。如果這個特征圖太大,知識根本就沒有抽象出來,如果太小,表征能力又可能不夠。
根據(jù)不同的難度,3*3,5*5,7*7我都用過,但是沒有用過9*9以上的,試過分類性能會下降,計算量還增加。imagenet競賽的那些網(wǎng)絡基本上都是7*7,兼顧了性能。
這個輸出大小,就由輸入大小和網(wǎng)絡的全局stride來決定,不斷遇到很多同學沒有注意這個問題,結果模型性能很差的,這是基本素質。
3.3 正確地使用數(shù)據(jù)
前面已經(jīng)準備了一些好的數(shù)據(jù),別在用的時候卻搞錯了,對于圖像分類來說有以下幾個準則
(1) 隨機打亂你的數(shù)據(jù)。
否則每個batch給的是同樣類別的數(shù)據(jù),不一定能保證模型學的正常。
(2) 在線做一些基本的數(shù)據(jù)預處理和增強。
圖像縮放操作,你要想好是用有變形的縮放,即統(tǒng)一縮放到固定大小。還是等比例縮放,即把短邊縮放到一定尺度。
裁剪操作,隨機裁剪是最簡單有效的數(shù)據(jù)增強方案,一開始就可以做起來,比如256*256隨機裁剪224*224,不必要過于復雜。
鏡像操作,也就是mirror參數(shù),不是所有的任務都可以翻轉的,根據(jù)自己任務使用。
減均值和歸一化操作,其實這一步倒并非必要,因為網(wǎng)絡自然可以學習到這一點。不過你做一下,通常不會有副作用。
更多的數(shù)據(jù)增強先不要急著做,因為那會增加網(wǎng)絡優(yōu)化的難度和時間。
這些操作都要在線做而不是離線準備好存入本地文件,這是很低效的。
3.4 正確地進行訓練
接下來就開始訓練,你可能會遇到各種與自己期望不相符的結果,其中一些很可能是你自己的錯誤造成的,因此有一些基本的訓練參數(shù)需要注意。
(1) 用好學習率策略。
如果你沒有經(jīng)驗,就不要一開始就使用SGD,雖然它可能取得更好的結果。直接用Adam,并且使用它的默認參數(shù)m1=0.9,m2=0.999,lr=0.001,學習率可以調整,其他兩個參數(shù)基本不需要動。更多比較可以參考我們之前的文章。如果你的學習率搞的不好,很可能出現(xiàn)梯度爆炸或者不收斂。
【模型訓練】如何選擇最適合你的學習率變更策略
【模型訓練】SGD的那些變種,真的比SGD強嗎
(2) 正確使用正則項。
weight decay是一個非常敏感的參數(shù),如果你不是很有經(jīng)驗,從一個很小或者為0的值開始。
訓練的時候可以用dropout,測試的時候是不需要用的。
(3) 正確使用BN層。
Batch Normalization是一個好東西,加快訓練速度降低過擬合,但是你要注意它在訓練的時候和測試的時候是不一樣的。
use_global_stats這個參數(shù)在訓練時是false,測試時是true,如果你沒用對,那么可能訓練無法進行,或者測試結果不對。
在訓練過程中,你可能會遇到各種各樣奇葩的問題。
比如網(wǎng)絡loss不正常,怎么調都不管用。
比如訓練好好的,測試就是結果不對。
bug天天有,深度學習算法工程師遇到的特別多,如果你想交流更多,就來有三AI知識星球實時提問交流吧,大咖眾多,總有能解決你問題的。
初識境界到此基本就結束了,這一系列是為大家奠定扎實的深度學習基礎,希望學習完后大家能有收獲。a
AI白身境系列完整閱讀:
第一期:【AI白身境】深度學習從棄用windows開始
第二期:【AI白身境】Linux干活三板斧,shell、vim和git
第三期:【AI白身境】學AI必備的python基礎
第四期:【AI白身境】深度學習必備圖像基礎
第五期:【AI白身境】搞計算機視覺必備的OpenCV入門基礎
第六期:【AI白身境】只會用Python?g++,CMake和Makefile了解一下
第七期:【AI白身境】學深度學習你不得不知的爬蟲基礎
第八期:?【AI白身境】深度學習中的數(shù)據(jù)可視化
第九期:【AI白身境】入行AI需要什么數(shù)學基礎:左手矩陣論,右手微積分
第十期:【AI白身境】一文覽盡計算機視覺研究方向
第十一期:【AI白身境】AI+,都加在哪些應用領域了
第十二期:【AI白身境】究竟誰是paper之王,全球前10的計算機科學家
AI初識境系列完整閱讀
第一期:【AI初識境】從3次人工智能潮起潮落說起
第二期:【AI初識境】從頭理解神經(jīng)網(wǎng)絡-內行與外行的分水嶺
第三期:【AI初識境】近20年深度學習在圖像領域的重要進展節(jié)點
第四期:【AI初識境】激活函數(shù):從人工設計到自動搜索
第五期:【AI初識境】什么是深度學習成功的開始?參數(shù)初始化
第六期:【AI初識境】深度學習模型中的Normalization,你懂了多少?
第七期:【AI初識境】為了圍剿SGD大家這些年想過的那十幾招
第八期:【AI初識境】被Hinton,DeepMind和斯坦福嫌棄的池化,到底是什么?
第九期:【AI初識境】如何增加深度學習模型的泛化能力
第十期:【AI初識境】深度學習模型評估,從圖像分類到生成模型
第十一期:【AI初識境】深度學習中常用的損失函數(shù)有哪些?
第十二期:【AI初識境】給深度學習新手開始項目時的10條建議
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續(xù)內容將會不定期奉上,歡迎大家關注有三公眾號 有三AI!
總結
以上是生活随笔為你收集整理的【AI初识境】给深度学习新手开始项目时的10条建议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【AI初识境】给深度学习新手做项目的10
- 下一篇: 【杂谈】从GitHub上星星最多的男人开