宣告:
1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。 2)本文僅供學術交流,非商用。所以每一部分具體的參考資料並沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,並聯系博主刪除。 3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。 4)此屬於第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。
〇、寫在前面
講道理,其實這個部落格我是懷著一個很嚴肅的心情準備寫的,但是吧,一談到【找工作】這個問題,我就很焦慮。。。。。。看到這個省略號了嘛?這就是我的心情 :|,尤其是在就業一年比一年難的情況下。為什麼這麼說?事實上19屆秋招演算法崗就有些【供過於求】了,頭條甚至發了 演算法勸退貼。而這很大程度上就是由於前幾年演算法就業形勢太好了,導致一大批人轉演算法,這導致的大泡沫其實還沒有消化掉,所以其實不是現在演算法突然不好找工作了,而是之前太容易了。其實你說公司真的不缺演算法工程師嘛?當然不是,公司也是有演算法工程師的缺口的,那為什麼出現這種情況?除了要勸退一部分盲目入行的同學;聽到、遇到的好幾個HR都說,收到幾百份簡歷,但是沒什麼匹配的。所以說做演算法的人多是真的,可是需要做演算法的人也是真的,而主要的矛盾點在於 供需不匹配。
所以在經歷過好多次心態崩裂,也問過很多前輩和大佬之後,參考了很多大佬的文章之後,我決定來總結一下如果想成為一個【深度學習演算法工程師】需要什麼學習能力和知識儲備。這個文章應該會是一個【記錄】性質的文章,期望看看自己這一路走來 學了什麼,準備學什麼,需要學什麼,希望和各位共勉。
一、程式設計能力
這真是個老生常談的問題,為什麼這麼說呢,自然是因為這個【程式設計能力】我聽過不下幾百遍,聽的腦瓜子都疼,可是沒法子,這就是 必備技能,必備到什麼程度?
這麼說吧,假如你想寫作文,如果你不會寫字,組詞,造句,我想你應該完全沒法完成這個創作過程。很形象吧,但是也確實如此,仔細想一想,招你進去是要幹活的,公司不會招聘一個只會 MATLAB 或者 python 都用不熟的人來做專案開發吧,做純演算法研究都不行。
- MATLAB 大家都懂的,做實驗室研究確實很棒,高效方便的矩陣和陣列運算,畫圖方面也相當不錯,但是工業應用還沒聽過誰說是用 MATLAB 實現的呢。
- python 你可能想問為什麼,可以這麼說,如果連 python 這樣比較簡單的語言還用不熟,那真是無話可說。
那麼 具體地說,程式設計能力需要哪些基本要求呢?
(1)熟練使用 linux
新手肯定都是用 Windows 起手的了,像我之前就是這樣,但是在學習過程中發現在 Windows 上搞不定了,一般也會先忍幾次,然後掉頭就去學 linux 了,一定是這樣的過程。哪些在 Windows 上真的搞不定呢?比如:最新論文中提出的視覺開源演算法等等。但是在條件上可能很多人都覺得不是太合適,比如實驗室條件,電腦條件等等,不過對我們而言,linux 並不需要了解太深。裝個 ubuntu 系統,常用的檔案操作、程式編譯等知道就OK了。剩下的完全是在使用的過程中現用現學,手邊常備一本書 《鳥哥的linux私房菜》,神書,你可以百度或者Google一下自然就知道這個書的強大了。在或者現在的網路比較強大了,資源也是很多,實驗樓 也是一個不錯的選擇,幫你搭配好的環境,直接使用就OK了。如果還是想自己搞一下,虛擬機器也是一個不錯的選擇,不會影響你電腦本來的環境配置,但是還滿足了要求。
個人計劃:
- 《鳥哥的linux私房菜》
- 實驗樓
(2)熟練使用 python
網路如此發達的今天,如果你說你找不到資源我是不相信的,但是如果你說你眼花繚亂了,我是毫不質疑的。因為我當時就就是這樣的,基礎部分看廖雪峰的 python教程 就可以了,我個人有看一些,但是真正入門的是一本書——《Python程式設計:從入門到實踐》,極其的基礎,但是對小白來說非常友好。有的同學會問是學 python2 還是 python3?這麼說吧,python 核心團隊計劃2020年停止支援 python2,也就是說 python2 馬上就要說再見了,肯定還是學 python3,遇到之前的 python2 的程式碼再查詢區別即可。python 學起來其實很簡單,看別人程式碼的過程就是學習的過程。對於不熟悉的用法多搜下官方文件,如 python,numpy,pandas,matplot,scikit-learn等等。
python 的開發環境值得說一下,因為有太多選擇,這裡比較建議使用 pycharm 和 jupyter notebook 吧,具體可以參考這個部落格——Windows10 下 Anaconda和 PyCharm 的詳細的安裝教程(圖文並茂)。
個人計劃:
- 《Python程式設計:從入門到實踐》
- 《瘋狂Python講義》
(3)流暢使用 C++
至於 C++,比較普遍的都是 《C++ primer》 或 《C++ primer plus》 這樣的大塊頭書,如果是入門的話應該還可以,倒是不如 《王道程式設計師求職寶典》 這類書實用。大塊頭書優點在於全面,同時也往往導致了重點不突出。如果想看視訊課程的話,推薦中國慕課上北大的《程式設計與演算法》,第1門課程是 C 語言程式設計,第2門課程是演算法基礎,第3門課程是 C++ 程式設計。看視訊課程一般比較慢,如果沒什麼基礎或者特別想把基礎學好的話,強烈推薦。個人計劃:
- 《C++ primer》
- 《C++ primer plus》
- 程式設計與演算法課程(一)
- 程式設計與演算法課程(三)
(4)良好的演算法基礎
其實沒做過檢測或者分割或者其他的,是很正常的,快速跟進就是了,這是公司開發的常態。但是如果一些網路結構基礎,影像的基礎概念,卷積神經網路的基礎——大話卷積神經網路CNN(乾貨滿滿),等等,這樣很可能會犯很多低階錯誤,可能會出現很多問題。這就要求開發能力必須過關,因為演算法效率在實際生產中還是有要求的。工業界用的演算法是滯後於學術界好幾年的,不要對公司所做的演算法有太多的幻想,現實資料比你想的質量差太多,現實用的演算法也沒有那麼高階,大部分時間都不是用在建模。
個人計劃:
- LeetCode
- 牛客網
- 《劍指offer》
python:
- 《演算法圖解》
- 《用Python解決資料結構與演算法問題》
- 《資料結構與演算法 Python語言描述》
C++:
- 《啊哈!演算法》
- 程式設計與演算法課程(二)
- 《演算法導論中文第三版》(這是本神書。。。)
(5)良好的程式設計習慣
這裡說的習慣有:多使用類,多利用函式封裝,寫好專案的目錄結構,良好的變數或者函式命名,善用程式的註釋功能,Python 程式語言需要遵循 PEP8 規範(雜談——Python程式碼寫得醜怎麼辦?autopep8來幫你)等等。這可以幫助你更好的和同事或者同行溝通,而且看著也舒服,就算好久不看程式了,依然可以做到很好的回溯記憶。二、深度學習理論
基於深度學習的計算機視覺是計算機視覺的兩大方向之一,另一個是 SLAM,機器學習包括深度學習裡的大部分演算法本質上都是用來做 分類 的。具體到計算機視覺領域一般就是 物體分類(Object Classification)、目標檢測(Object Detection)、語義分割(Image Semantic Segmentation) 等,當然也有一些很酷又好玩的東西比如 edges2cats、deepart 等等。我主要做一些【影像重建】或者【超解析度】相關的東西。其實一般是看一看論文,復現復現網路結構,或者直接跑一跑別人的程式碼,做一做網路結構修改,調一調超引數。前期的影像資料集製作,還有預處理才是主要的工作。深度學習為什麼這麼強?它比傳統的影像處理方法好嗎?它主要解決了什麼樣的問題呢?
個人比較認同是以下三點:學習特徵的能力很強,通用性強,開發優化維護成本低。存在的問題可能就是資料量,對 label 的精準性要求比較大。之前看過的一個文章寫得不錯,參見 為什麼深度學習幾乎成了計算機視覺研究的標配?。
關於這一部分理論的學習,漫天飛的各種資源。這裡推薦一些:
- 可以看一看李宏毅的一天搞懂深度學習課件;
- 李飛飛的CS231n課程,網易雲課堂有大資料文摘翻譯的 中文字幕版課程,知乎專欄 智慧單元 有CS231N課程翻譯(非常好);
- 吳恩達的 《DEEP LEARNING AI》,今年年底就要下線了,還有我個人依據課程寫的 深度學習入門筆記系列。
個人計劃:
- 《一天搞懂深度學習》
- CS231N課程
- Deep Learning AI課程
- 《DeepLearning深度學習花書》
- 《Tensorflow+實戰Google深度學習框架》
- 《圖解神經網路與深度學習》
- 《PyTorch深度學習實戰》
- 《Python 深度學習(Keras)》
- 《深度學習之Pytorch》
- 《深度學習框架PyTorch》
- 《PaddlePaddle與深度學習應用實戰》
- 《動⼿學深度學習》
- 《深度學習之PyTorch實戰計算機視覺》
- 經典深度學習論文
三、g++, CMake和Makefile
python 是指令碼語言,而當前大量的 AI 演算法都部署在移動端嵌入式平臺,需要使用 c / c++ / java 語言,g++,CMake 和 Makefile 正是 Linux 下編譯 C系程式碼 的工具,也是必備的基礎。實際上一些python,matlab開源專案也需要預編譯,更多的等到了工作崗位自然懂。個人計劃:
- g++
- CMake
- Makefile
四、shell,vim 和 git
Linux 下一個熟練的工程師,會比 Windows 下工作效率高很多,提高寫程式碼效率可以從終端多工管理,熟練使用 shell 命令,熟練使用 vim 等開發環境,熟練使用 git 命令等地方入手。- shell 命令是 Linux 的操作基礎,也是學習使用 Linux 的開始,而慢慢熟悉高階的 shell 命令在將來的工作中會帶來很大的效率提升。
- vim 是 Linux 下最常用的編輯器,從小白到高手都可以使用,而它的列編輯,查詢替換,自動補全等功能都是效率的保證,或許從visual studio等環境切換過來的同學剛開始會有些許不適應,但是時間久了就會越來越明白 vim 的好。
- git 是程式設計師必備的素養,慢慢學會維護幾個自己的程式碼庫,等到將來出問題的時候就明白了。
個人計劃:
- shell
- vim
- git
五、python 爬蟲
深度學習專案開發中最重要的就是 資料!!!或許是一句戲言,但是有一句話是這麼說的,深度學習在目前階段可以認為是一個資料的遊戲,你的資料更好,標記的更完美,你的執行結果就更棒。尤其是實際的專案經常沒有足夠多的資料,這個時候就需要自己去想辦法獲取了。除了公開的資料集之外,其他的資料怎麼獲得呢?網際網路是一個什麼資源都有的大寶庫,學會使用好爬蟲,你將可能成為時代裡最有資源的人,我想叫你金礦工,而且這也很可能是專案成功的開始。個人計劃:
- 網路爬蟲
- 《Python專案案例開發從入門到實戰——爬蟲、遊戲和機器學習》
六、資料視覺化
處理資料的一個常用的手段就是資料視覺化!在深度學習專案中,常需要的資料視覺化操作包括原始圖片資料的視覺化,損失和精度的視覺化等。除了對資料視覺化,還需要對模型進行視覺化,方便除錯和感知。這個方面我的建議是多打一些比賽,多看一看別人的程式碼和部落格,這樣就會很容易學會的。
個人計劃:
- Kaggle
- 天池
七、數學基礎
-
微積分:其實個人感覺涉及的微積分知識相對簡單,積分很少,微分也不是特別複雜,花一天時間學一學就行。
-
概率論與統計:這個比較高深,是應用在機器學習領域裡最重要的數序分支。應用比如:條件概率、相關係數、最大似然、大數定律、馬爾可夫鏈等等,還是得好好搞一下概率。
-
線性代數:數字影像本身就是以矩陣的形式呈現的,多個向量組成的樣本也是矩陣這種形式非常常見,大多機器學習演算法裡每個樣本都是以向量的形式存在的,多個矩陣疊加則是以張量(tensor)的形式存在 Google 深度學習庫 TensorFlow 的字面意思之一。
-
凸優化:這個需要單獨拎出來說一下。因為太多問題(尤其機器學習領域)都是優化問題(求最優),凸優化是裡面最簡單的形式,所以大家都在想辦法怎麼把一般的優化問題轉化為凸優化問題。至於單純的凸優化理論,好像已經比較成熟了。在機器學習裡,經常會看到什麼求對偶問題、KKT條件等,潛下心花兩天學一學。
數學知識真的沒必要系統學習,效率低又耗時,畢竟大家都有本科或者研究生的基礎了,這就足夠了。用的最多的就是矩陣論!!!或者用到的時候學,學完之後總結一下。再就是活學活用網上的搜尋資源,比如 CSDN、知乎等等。
個人計劃:
- 《矩陣論》
- 北大的《凸優化》課程
- 林軒田機器學習基石
- 林軒田機器學習技法
八、公眾號
時代變了,一百年前的人類絕對想像不出自己有了困惑不是去翻書或請教他人而是告訴身旁的一臺機器。如今,小學生做道算術題或小女生來個大姨媽都要問問電腦:這是怎麼回事。但這些與學視覺又有什麼關係呢?——答:沒有。好像跑偏的有點多了,再扯遠一點吧。跨越時間維度來思考一些新事物的發生及其與舊事物的聯絡,也許會給你一種想象的自由。比如電報、電話、視訊聊天和全息通話用 HoloLens 通話,再比如馬車、汽車、火車、飛機和火箭太空旅行,蒸汽機、電、網際網路和AI。所以活用資源,多看肯定沒錯,不過要有所選擇的看,不能啥都看,,,人的精力還是優先的。
先說明公眾號不是打廣告,推薦幾個自己看的而已(排名沒有先後順序)。
- 機器學習實驗室
- 磐創AI
- kaggle競賽寶典
- 有三AI
- 我愛計算機視覺
- Datawhale
- 計算機視覺life
- CVer
- 小小挖掘機
九、彩蛋
看一下目錄,你會發現它向一把小刀一樣,是不是?希望你我能劍鋒所指,所向披靡!!!
推薦一個自己寫的部落格——大話卷積神經網路CNN(乾貨滿滿),種樹從現在開始。
如果有幸幫到你,請幫我點個【贊】,給個【關注】!如果能順帶【評論】給個鼓勵,我將不勝感激。
如果想要更多的資源,歡迎關注 @我是管小亮,文字強迫症MAX~
回覆【福利】即可獲取我為你準備的大禮,包括C++,程式設計四大件,NLP,深度學習等等的資料。
回覆【資料結構】,即可獲得演算法與資料結構資料
想看更多文(段)章(子),歡迎關注微信公眾號「程式設計師管小亮」~