「完結」CV演算法工程師從入門到初級面試有多遠,大概是25篇文章
文/編輯 | 言有三
一直有同學希望我寫寫面試相關的東西,一直沒寫。我們不會開相關的板塊,因為沒有標準,容易引起爭議,而且可能會加重大家的浮躁和焦慮。
不過關於面試,有三還是有一些話可以說的,下面分兩部分道來。
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上面訓練模型的。
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簡單嗎?簡單。真的簡單嗎?看看大神們寫的專案吧。
4、影像基礎
深度學習有一個最大的問題,就是太好用了。導致什麼影像基礎和傳統演算法都不需要懂,也能專案做的風生水起。
但是如果沒有好的影像基礎,總有一天遇到CNN解決不了的問題,或者無法單獨解決的問題,就不知所措了。很多的新技術都是從傳統演算法中獲得靈感或者相互結合的,不懂影像基礎,就彷彿埋了一顆定 時 炸 彈 ,一般沒事,炸了就炸了。
5、OpenCV基礎
如果說影像處理領域有什麼庫是繞不過去的,那一定是OpenCV,這一個開源計算機視覺庫堪稱最優秀的計算機視覺庫,不僅可以學術和商業免費使用,而且跨平臺,高效能。需要掌握的基礎內容包括:如何部署,基本資料結構的熟悉與使用,基本模組的瞭解。
6、CMake編譯
python是指令碼語言,而當前大量的AI演算法都部署在移動端嵌入式平臺,需要使用c/c++/java語言,g++,CMake和Makefile正是Linux下編譯C系程式碼的工具。
實際上一些python,matlab開源專案也需要預編譯,更多的等到了工作崗位自然懂。
「AI白身境」只會用Python?g++,CMake和Makefile瞭解一下
7、爬蟲基礎
深度學習專案開發中最重要的是什麼,當然是資料!實際的專案你經常沒有足夠多的資料,這個時候就需要自己去想辦法獲取了。
網際網路是一個什麼資源都有的大寶庫,學會使用好爬蟲,你將可能成為時代裡最有“資源”的人,這也很可能是專案成功的開始。
本文最後的一個實際專案就需要用到。
8、資料視覺化
爬取完資料之後就應該進行處理了,一個很常用的手段是資料視覺化。在深度學習專案中,常需要的資料視覺化操作包括原始圖片資料的視覺化,損失和精度的視覺化等。
除了對資料視覺化,我們還需要對模型進行視覺化,方便除錯和感知。
9、數學基礎
雖然對於大部分來說,做專案不需要多麼強悍的數學基礎,但是你會需要看懂別人論文,也會經常需要進行簡單的推導和演算法改進。
從線性代數,機率論與統計學到微積分和最最佳化,都是需要掌握的。不過數學的學習是一個非常漫長的過程,不要急於求成,也不是靠跟著影片或者書本就能完全學會的,重要的是用起來。
「AI白身境」入行AI需要什麼數學基礎:左手矩陣論,右手微積分
10、計算機視覺研究方向
學習和做專案都需要一個方向,在前面這些基礎都掌握好了,就要好好了解一下計算機視覺的各大研究方向及其特點,方便自己選題和專案方案定型了。
從影像分類,分割,目標檢測,跟蹤,到影像濾波與降噪,增強,風格化,三維重建,影像檢索,GANs,相信總有你喜歡或者專案涉及的。
11、應用方向
學習最終是為了解決實際問題,AI已經滲入到了我們生活的方方面面。從自動駕駛汽車、影像美顏,到聊天機器人,金融支付等,因此好好了解下當前AI在各大領域的應用沒錯的,這次就不僅僅限於計算機視覺了。
12、認識學術大咖
要想真正融入行業圈子,緊跟技術發展,就必須要時刻了解大佬們的狀態,他們就是行業發展的風向標。
不管是學術界還是工業界,不管是老師傅還是青年才俊,讓我們一起見賢思齊吧。
我們開源了大佬研究方向的專案,歡迎follow。
「AI白身境」究竟誰是paper之王,全球前10的電腦科學家
13、人工智慧簡史
基礎打好了,接下來就是正式學習AI相關的知識,不管是在哪個課堂或者教材,都是讓大家先了解先賢們。
從圖靈與機器智慧,馮諾伊曼與類腦計算引發的人工智慧啟蒙,到三次浪潮的曲折和技術的成長史,值得每一個從事該行業的人閱讀。
14、神經網路基礎
深度學習研究問題的方法就是仿造大腦,根基是神經網路。從感受野,到MP模型,到感知機,到反向傳播,要很熟悉全連線神經網路的劣勢,卷積神經網路的特點,核心技術和優勢,這是學習深度學習最重要的基礎。
15、瞭解領域的突破
既然學深度學習,就必須要了解深度學習的重要進展。
在前深度學習時代,視覺機制的發現,第一個卷積神經網路Neocognitron的提出,反向傳播演算法的流行,促進了LeNet5和MNIST資料集的誕生。
隨著新理論的成熟,大資料的積累,GPU的普世,以卷積神經網路為代表的技術在影像分類,目標檢測等基礎領域取得重大突破,隨著AlphaGo的成功同時在業內和業外人士的心目中種下了深度學習/人工智慧技術的種子,從此煥發勃勃生機。
16、啟用函式
深度學習的機制模仿於人腦,人腦的細胞接受刺激從而產生活動需要一定的閾值,這便是啟用函式根本性的由來。
啟用函式肩負著網路非線性表達能力的提升,從早期平滑的sigmoid和tanh啟用函式,到後來的ReLU和各類ReLU的變種(LReLU,PReLU,RReLU,ELU,SELU,GELU等等),Maxout,研究者一直試圖讓網路擁有更好的表達能力。
隨著技術的發展,利用增強學習等演算法從函式池中學習新的啟用函式如swish等,成為了當下的研究主流,啟用函式也走上了資料驅動的道路。
啟用機制看似簡單,實則不易,大家一定多跟進了解了解。
17、引數初始化
引數初始化,一個看似很簡單的問題,卻實實在在地困住了神經網路的最佳化很久,2006年Hinton等人在science期刊上發表了論文“Reducing the dimensionality of data with neural networks”,揭開了新的訓練深層神經網路演算法的序幕,仍舊被認為是當前第三次人工智慧熱潮的紀元。
從全零初始化和隨機初始化,到標準初始化,Xavier初始化,He初始化,時至今日上千層網路的訓練都已經成為了現實,初始化似乎已經不再是那麼重要的課題了,但是誰說就沒有思考的空間了呢。
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方法。
沒有一個方法是完美的,訓練的時候總歸要試試。
21、泛化能力
如果一個模型只能在訓練集上起作用,那是沒有用的。
因此我們總是希望模型不僅僅是對於已知的資料(訓練集)效能表現良好,對於未知的資料(測試集)也表現良好,即具有良好的泛化能力,透過新增正則項來實現。
從直接提供正則化約束的引數正則化方法如L1/L2正則化,工程上的技巧如訓練提前終止和模型整合,以及隱式的正則化方法如資料增強等,研究人員在這方面投入的精力非常多,大家一定要時刻關注。
22、模型評估
口說無憑,用資料說話才是研究者們進行PK的正確姿態。計算機視覺的任務何其多,從分類,迴歸,質量評估到生成模型,我們當然需要掌握科學的評估方法。
23、損失目標
模型的學習需要指導,這正是損失函式的責任,它往往對模型最終表現如何影響巨大。
這一篇文章就重點總結分類問題,迴歸問題,生成對抗網路中使用的損失目標,為大家設計更好的最佳化目標奠定理論基礎。
24、如何開始訓練你的模型
磨刀不誤砍柴工,當我們開始訓練自己的模型的時候,總歸要想清楚一些事兒再動手。
第一步知道你要做的任務是一個什麼任務,找到競爭對手做好預期,想好你需要什麼樣的資料。第二步確定好框架,基準模型,準備好資料。然後才是第三步開始訓練,從輸入輸出,資料的預處理到維持正確地訓練姿勢。
這是我總結出來的經驗,想必總是有點用的。
25、認真做一個專案
到了最後,相信大家都擁有了基本技能了,那我們就來開始一個真正的專案吧,實現形色識花App的部分功能。
在這裡不會教大家如何完成,因為這個專案一點都不簡單,是個很難的分類專案,不是給一個現有的資料集和一個模型就能解決的,至少有以下問題需要考慮,每一個都有很多工程細節需要解決。
如果你能獨立將這個任務的整個流程完成,識別20種包含遠近景的花,做到95%的精度,那麼我相信你完全有能力去應聘計算機視覺演算法工程師了。
如果在框架上有什麼問題,可以參考我們開源的12個主流的開源框架在各類任務中的使用git專案。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2651204/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis從入門到精通:初級篇Redis
- iOS 從入門到中級iOS
- Docker從入門到精通(一)——初識Docker
- Charles 從入門到精通,看這篇文章就夠了
- grafana初級入門Grafana
- 演算法與資料結構,從入門到不放棄~演算法資料結構
- Redis從入門到精通:中級篇Redis
- Kafka從入門到放棄(一) —— 初識KafkaKafka
- hive從入門到放棄(一)——初識hiveHive
- Flutter入門實戰教程:從0到1仿寫web版掘金App (完結)FlutterWebAPP
- 企業級Redis開發運維從入門到實踐 (1)—Redis 初識Redis運維
- scala 從入門到入門+
- makefile從入門到入門
- SpringBoot從零單排 ------初級入門篇Spring Boot
- Flask框架從入門到精通之模板初識(五)Flask框架
- Dubbo 一篇文章就夠了:從入門到實戰
- 由淺到淺入門批量渲染(完)
- ButterKnife 從入門到精通 - 原始碼級分析(二)原始碼
- QT從入門到入土(四)——多執行緒QT執行緒
- 五線譜入門完結篇
- Java初級開發工程師面試題合集Java工程師面試題
- 前端面試總結篇(初級)前端面試
- 初級前端開發面試總結前端面試
- 機器學習從入門到放棄之KNN演算法機器學習KNN演算法
- kafka從入門到關門Kafka
- 初級演算法-連結串列演算法
- Java多執行緒系列——從菜鳥到入門Java執行緒
- [譯] 如何禁用連結:從入門到放棄
- [MySQL光速入門]032 完結撒花!!!MySql
- NUXT SSR初級入門筆記UX筆記
- Es6初級入門(一)
- 初級Linux運維工程師每天需要做什麼?入門必看Linux運維工程師
- 三週刷完《Python程式設計從入門到實踐》的感受Python程式設計
- Promise入門到精通(初級篇)-附程式碼詳細講解Promise
- 運維工程師從入門到放棄必備書籍運維工程師
- Thymeleaf從入門到精通
- LESS從入門到精通
- Git 從入門到精通Git