如何系統性學習深度學習計算機視覺

文/編輯 | 言有三

一直有同學希望我寫寫面試相關的東西,一直沒寫。我們不會開相關的板塊,因為沒有標準,容易引起爭議,而且可能會加重大家的浮躁和焦慮。

不過關於面試,有三還是有一些話可以說的,下面分兩部分道來。

1 老闆喜歡什麼人

假如我是老闆或者誠心為公司招聘優秀人才的面試官,我會喜歡擁有以下特質的人。這裡說的是招聘一個算法工程師,一個能夠為公司創造收益的人,簡單起見就不分社招校招。

1、忠誠度,這很重要。一個不忠誠的員工,能力再大,也不能要。所以如果看到一份簡歷滿滿當當的都是跳槽和實習簡歷,兩個月換一個實習,半年換一份工作,除非你說出很充分客觀的理由,否則我可能不會通過這份簡歷。

2、編碼能力,這是一切的前提。前面說了,我們這裡要招聘的是一個計算機視覺領域(CV)算法工程師,招進來是要幹活的。公司不會招聘一個只會Matlab或者python都用不熟的人來做項目開發,做純算法研究都不行,一個不能實現自己想法的牛人我還沒見過。見過的牛人不僅算法好,編程能力也強大。

說起編程能力,有幾點基本要求:

(1) linux得熟。

現在不是若干年前開源項目還不多的時代,大家還在Windows下面吭哧吭哧用Matlab和VS仿真,都9102年了,Linux都不熟,效率如何讓老大放心。

(2) python得熟,c++得會。

如果連python這樣簡單的語言還用不熟,那真是無話可說。c/c++ 這是一門基礎課吧,理工科的學校沒開過應該很罕見,CV領域的工業界部署和算法優化都離不開C++。

(3) 編程習慣得好。

雖然說代碼寫的爛,不會真有同事拿gun突突突你,但是好的編程習慣不僅僅提高效率,而且看著也舒服,不會被別人鄙視。

這裡說的習慣包括:多寫寫類和函數封裝,組織好項目目錄結構,好好命名等等。可以不會寫多麼牛逼炫酷的代碼,但是要保證代碼具有良好的可拓展性,方便他人閱讀移植,具體要求以後再說。

3、算法基礎,這決定了潛力。沒做過檢測?沒事,沒做過分割?沒事。邊做邊學,快速跟進就是了,這本就是公司開發的常態。

人的精力有限,沒做過的多了去了。但是如果CNN的一些基礎傻傻說不清楚,圖像的基礎概念一問三不知,這就有事了。因為你交給他一個項目,可能會犯一些低級錯誤而不自知,老大心裡也慌,還要陪著檢查和普及基礎知識。

以上就是三個基本要求,每一家公司肯定都是這樣要求的,我覺得如果通過了這三個考驗,那至少就是一個可以培養的候選人,我會願意給他機會進入下一輪的PK。

踏實(基礎好),靠譜(穩定),能幹活(能寫代碼),這3個基本前提比什麼都重要,其他的都可以在項目學習。

2 準備哪些知識

接下來就該說說具體怎麼辦了,這就是我開《AI修行之路》這個專欄的原因了,如果你有耐心,不妨接著看下去,我們也是再重新回顧總結一下之前的文章,每一篇文章的開設都有充分的理由。

1、為什麼要用Linux

在以前,你可能覺得Linux並非剛需,用著自己的Windows電腦,也不需要與人共享操作系統,硬件和磁盤。但是如果你們團隊一起使用服務器,不可能不用Linux。

所以這是對還沒有在Linux上面真正進行日常開發工作的小朋友說的,要正式進入AI行業發展,Linux是必備和唯一的操作系統,“軟”兵器,我還沒有聽過哪家公司在Windows或者Mac上面訓練模型的。

「AI白身境」深度學習從棄用windows開始

2、使用shell,vim,git提高開發效率

編程習慣,工作效率很重要,很重要!Linux下一個熟練的工程師,會比Windows下工作效率高很多,提高寫代碼效率可以從終端多任務管理,熟練使用shell命令,熟練使用vim等開發環境,熟練使用git命令等地方入手。

shell命令是Linux的操作基礎,也是學習使用Linux的開始,而慢慢熟悉高級的shell命令在將來的工作中會帶來很大的效率提升。

vim是Linux下最常用的編輯器,從小白到高手都可以使用,而它的列編輯,查找替換,自動補全等功能都是效率的保證,或許從visual studio等環境切換過來的同學剛開始會有些許不適應,但是時間久了就會越來越明白VIM的好。

git是程序員必備的素養,慢慢學會維護幾個自己的代碼庫,等到將來出問題的時候就明白了。

如何系統性學習深度學習計算機視覺

「AI白身境」Linux幹活三板斧,shell、vim和git

3、python基礎和編程習慣

在機器學習領域,python可謂是一騎絕塵,學習python需要掌握好基礎的語法包括函數,類設計,掌握大量的開源矩陣庫Numpy等。

python簡單嗎?簡單。真的簡單嗎?看看大神們寫的項目吧。

如何系統性學習深度學習計算機視覺

「AI白身境」學AI必備的python基礎

4、圖像基礎

深度學習有一個最大的問題,就是太好用了。導致什麼圖像基礎和傳統算法都不需要懂,也能項目做的風生水起。

但是如果沒有好的圖像基礎,總有一天遇到CNN解決不了的問題,或者無法單獨解決的問題,就不知所措了。很多的新技術都是從傳統算法中獲得靈感或者相互結合的,不懂圖像基礎,就彷彿埋了一顆定時炸彈,一般沒事,炸了就炸了。

如何系統性學習深度學習計算機視覺

「AI白身境」深度學習必備圖像基礎

5、OpenCV基礎

如果說圖像處理領域有什麼庫是繞不過去的,那一定是OpenCV,這一個開源計算機視覺庫堪稱最優秀的計算機視覺庫,不僅可以學術和商業免費使用,而且跨平臺,高性能。需要掌握的基礎內容包括:如何部署,基本數據結構的熟悉與使用,基本模塊的瞭解。

如何系統性學習深度學習計算機視覺

「AI白身境」搞計算機視覺必備的OpenCV入門基礎

6、CMake編譯

python是腳本語言,而當前大量的AI算法都部署在移動端嵌入式平臺,需要使用c/c++/java語言,g++,CMake和Makefile正是Linux下編譯C系代碼的工具。

實際上一些python,matlab開源項目也需要預編譯,更多的等到了工作崗位自然懂。

如何系統性學習深度學習計算機視覺

「AI白身境」只會用Python?g++,CMake和Makefile瞭解一下

7、爬蟲基礎

深度學習項目開發中最重要的是什麼,當然是數據!實際的項目你經常沒有足夠多的數據,這個時候就需要自己去想辦法獲取了。

互聯網是一個什麼資源都有的大寶庫,學會使用好爬蟲,你將可能成為時代裡最有“資源”的人,這也很可能是項目成功的開始。

本文最後的一個實際項目就需要用到。

如何系統性學習深度學習計算機視覺

「AI白身境」學深度學習你不得不知的爬蟲基礎

8、數據可視化

爬取完數據之後就應該進行處理了,一個很常用的手段是數據可視化。在深度學習項目中,常需要的數據可視化操作包括原始圖片數據的可視化,損失和精度的可視化等。

除了對數據可視化,我們還需要對模型進行可視化,方便調試和感知。

如何系統性學習深度學習計算機視覺

「AI白身境」深度學習中的數據可視化

9、數學基礎

雖然對於大部分來說,做項目不需要多麼強悍的數學基礎,但是你會需要看懂別人論文,也會經常需要進行簡單的推導和算法改進。

從線性代數,概率論與統計學到微積分和最優化,都是需要掌握的。不過數學的學習是一個非常漫長的過程,不要急於求成,也不是靠跟著視頻或者書本就能完全學會的,重要的是用起來。

如何系統性學習深度學習計算機視覺

「AI白身境」入行AI需要什麼數學基礎:左手矩陣論,右手微積分

10、計算機視覺研究方向

學習和做項目都需要一個方向,在前面這些基礎都掌握好了,就要好好了解一下計算機視覺的各大研究方向及其特點,方便自己選題和項目方案定型了。

從圖像分類,分割,目標檢測,跟蹤,到圖像濾波與降噪,增強,風格化,三維重建,圖像檢索,GANs,相信總有你喜歡或者項目涉及的。

如何系統性學習深度學習計算機視覺

「AI白身境」一文覽盡計算機視覺研究方向

11、應用方向

學習最終是為了解決實際問題,AI已經滲入到了我們生活的方方面面。從自動駕駛汽車、圖像美顏,到聊天機器人,金融支付等,因此好好了解下當前AI在各大領域的應用沒錯的,這次就不僅僅限於計算機視覺了。

如何系統性學習深度學習計算機視覺

https://dwz.cn/Gj18HPHd

12、認識學術大咖

要想真正融入行業圈子,緊跟技術發展,就必須要時刻了解大佬們的狀態,他們就是行業發展的風向標。

不管是學術界還是工業界,不管是老師傅還是青年才俊,讓我們一起見賢思齊吧。

我們開源了大佬研究方向的項目,歡迎follow。

https://github.com/longpeng2008/Awesome_DNN_Researchers
如何系統性學習深度學習計算機視覺

「AI白身境」究竟誰是paper之王,全球前10的計算機科學家

13、人工智能簡史

基礎打好了,接下來就是正式學習AI相關的知識,不管是在哪個課堂或者教材,都是讓大家先了解先賢們。

從圖靈與機器智能,馮諾伊曼與類腦計算引發的人工智能啟蒙,到三次浪潮的曲折和技術的成長史,值得每一個從事該行業的人閱讀。

如何系統性學習深度學習計算機視覺

「AI初識境」從3次人工智能潮起潮落說起

14、神經網絡基礎

深度學習研究問題的方法就是仿造大腦,根基是神經網絡。從感受野,到MP模型,到感知機,到反向傳播,要很熟悉全連接神經網絡的劣勢,卷積神經網絡的特點,核心技術和優勢,這是學習深度學習最重要的基礎。

如何系統性學習深度學習計算機視覺

「AI初識境」從頭理解神經網絡-內行與外行的分水嶺

15、瞭解領域的突破

既然學深度學習,就必須要了解深度學習的重要進展。

在前深度學習時代,視覺機制的發現,第一個卷積神經網絡Neocognitron的提出,反向傳播算法的流行,促進了LeNet5和MNIST數據集的誕生。

隨著新理論的成熟,大數據的積累,GPU的普世,以卷積神經網絡為代表的技術在圖像分類,目標檢測等基礎領域取得重大突破,隨著AlphaGo的成功同時在業內和業外人士的心目中種下了深度學習/人工智能技術的種子,從此煥發勃勃生機。

如何系統性學習深度學習計算機視覺

「AI初識境」近20年深度學習在圖像領域的重要進展節點

16、激活函數

深度學習的機制模仿於人腦,人腦的細胞接受刺激從而產生活動需要一定的閾值,這便是激活函數根本性的由來。

激活函數肩負著網絡非線性表達能力的提升,從早期平滑的sigmoid和tanh激活函數,到後來的ReLU和各類ReLU的變種(LReLU,PReLU,RReLU,ELU,SELU,GELU等等),Maxout,研究者一直試圖讓網絡擁有更好的表達能力。

隨著技術的發展,利用增強學習等算法從函數池中學習新的激活函數如swish等,成為了當下的研究主流,激活函數也走上了數據驅動的道路。

激活機制看似簡單,實則不易,大家一定多跟進了解了解。

如何系統性學習深度學習計算機視覺

「AI初識境」激活函數:從人工設計到自動搜索

17、參數初始化

參數初始化,一個看似很簡單的問題,卻實實在在地困住了神經網絡的優化很久,2006年Hinton等人在science期刊上發表了論文“Reducing the dimensionality of data with neural networks”,揭開了新的訓練深層神經網絡算法的序幕,仍舊被認為是當前第三次人工智能熱潮的紀元。

從全零初始化和隨機初始化,到標準初始化,Xavier初始化,He初始化,時至今日上千層網絡的訓練都已經成為了現實,初始化似乎已經不再是那麼重要的課題了,但是誰說就沒有思考的空間了呢。

如何系統性學習深度學習計算機視覺

「AI初識境」什麼是深度學習成功的開始?參數初始化

18、歸一化

我們總是希望所研究的統計問題能夠滿足固定的分佈,而且這樣也的確會降低問題的難度。

在深度學習中,因為網絡的層數非常多,如果數據分佈在某一層開始有明顯的偏移,隨著網絡的加深這一問題會加劇,進而導致模型優化的難度增加。

歸一化便是致力於解決這個問題,從數據到權重,從限定在同一樣本的一個特徵通道到不同樣本的所有通道,各類歸一化方法以簡單的方式,優雅地解決了深度學習模型訓練容易陷入局部解的難題,順帶提升訓練速度提高泛化能力,這是一定要掌握的理論和工程技巧。

如何系統性學習深度學習計算機視覺

「AI初識境」深度學習模型中的Normalization,你懂了多少?

19、池化

大腦學習知識靠抽象,從圖像中抽象知識是一個“從大到小”過濾提煉信息的過程。從視覺機制中來的pooling即池化,正是對信息進行抽象的過程。

池化增加了網絡對於平移的不變性,提升了網絡的泛化能力,大家已經習慣了使用均值池化mean pooling和最大池化(max pooling),雖然可以用帶步長的卷積進行替代。

儘管池化究竟起到了多大的作用開始被研究者懷疑,但是池化機制仍然是網絡中必備的結構,所以你一定要熟悉它,而且基於數據驅動的池化機制值得研究。

如何系統性學習深度學習計算機視覺

「AI初識境」被Hinton,DeepMind和斯坦福嫌棄的池化到底是什麼?

20、最優化

模型的學習需要通過優化方法才能具體實現。深度學習模型的優化是一個非凸優化問題,儘管一階二階方法都可以拿來解決它,但是當前隨機梯度下降SGD及其各類變種仍然是首選。

從SGD開始,有的致力於提高它的優化速度如Momentum動量法和Nesterov accelerated gradient法,有的致力於讓不同的參數擁有不同的學習率如Adagrad,Adadelta與Rmsprop法,有的希望大家從調參中解脫如Adam方法及其變種,有的致力於讓收斂過程更加穩定如Adafactor方法和Adabound方法。

沒有一個方法是完美的,訓練的時候總歸要試試。

如何系統性學習深度學習計算機視覺

「AI初識境」為了圍剿SGD大家這些年想過的那十幾招

21、泛化能力

如果一個模型只能在訓練集上起作用,那是沒有用的。

因此我們總是希望模型不僅僅是對於已知的數據(訓練集)性能表現良好,對於未知的數據(測試集)也表現良好,即具有良好的泛化能力,通過添加正則項來實現。

從直接提供正則化約束的參數正則化方法如L1/L2正則化,工程上的技巧如訓練提前終止和模型集成,以及隱式的正則化方法如數據增強等,研究人員在這方面投入的精力非常多,大家一定要時刻關注。

如何系統性學習深度學習計算機視覺

「AI初識境」如何增加深度學習模型的泛化能力

22、模型評估

口說無憑,用數據說話才是研究者們進行PK的正確姿態。計算機視覺的任務何其多,從分類,迴歸,質量評估到生成模型,我們當然需要掌握科學的評估方法。

如何系統性學習深度學習計算機視覺

「AI初識境」深度學習模型評估,從圖像分類到生成模型

23、損失目標

模型的學習需要指導,這正是損失函數的責任,它往往對模型最終表現如何影響巨大。

這一篇文章就重點總結分類問題,迴歸問題,生成對抗網絡中使用的損失目標,為大家設計更好的優化目標奠定理論基礎。

如何系統性學習深度學習計算機視覺

「AI初識境」深度學習中常用的損失函數有哪些?

24、如何開始訓練你的模型

磨刀不誤砍柴工,當我們開始訓練自己的模型的時候,總歸要想清楚一些事兒再動手。

第一步知道你要做的任務是一個什麼任務,找到競爭對手做好預期,想好你需要什麼樣的數據。第二步確定好框架,基準模型,準備好數據。然後才是第三步開始訓練,從輸入輸出,數據的預處理到維持正確地訓練姿勢。

這是我總結出來的經驗,想必總是有點用的。

如何系統性學習深度學習計算機視覺

「AI初識境」給深度學習新手做項目的10個建議

25、認真做一個項目

到了最後,相信大家都擁有了基本技能了,那我們就來開始一個真正的項目吧,實現形色識花App的部分功能。

如何系統性學習深度學習計算機視覺

在這裡不會教大家如何完成,因為這個項目一點都不簡單,是個很難的分類項目,不是給一個現有的數據集和一個模型就能解決的,至少有以下問題需要考慮,每一個都有很多工程細節需要解決。

如何系統性學習深度學習計算機視覺

如果你能獨立將這個任務的整個流程完成,識別20種包含遠近景的花,做到95%的精度,那麼我相信你完全有能力去應聘計算機視覺算法工程師了。

如果在框架上有什麼問題,可以參考我們開源的12個主流的開源框架在各類任務中的使用git項目。

https://github.com/longpeng2008/yousan.ai

相關推薦

推薦中...