問題集錄--新手入門深度學習,選擇TensorFlow 好嗎?

新手入門深度學習,選擇 TensorFlow 有哪些益處?

佟達:首先,對於新手來講,TensorFlow的環境配置包裝得真心很是好。相較之下,安裝Caffe要痛苦的多,若是還要再CUDA環境下配合OpenCV使用,對於新手來講,基本上不折騰個幾天是很難搞定的。 java

其次,基於TensorFlow的教學資源很是多,中英文的都有,這對於新手也是很是有幫助的。Google作社區很是有一套,在中國有專門的一羣人,會在第一時間把Google的開發者相關的進展翻譯成中文。python

另外,因爲有Google背書,TensorFlow從長期演進來看,基本上能夠保證這個技術不會曇花一現。對於一個深度學習新手來講,學習任何一個工具,都有成本,若是剛學會,這個工具就沒人用了,這個沉沒成本仍是很高的。git

白髮川:TensorFlow分爲圖和session兩個部分,由於構建和執行在不一樣的階段,因此很好的支持了模型的分佈式,因此學習TF能夠比較好的理解模型的分佈式計算,另外TF支持直接從分佈式文件系統,例如HDFS系統讀取數據,因此能夠說TF是接通機器學習和大數據的一個橋樑。github

新人上手 TensorFlow 常常會遇到哪些問題或困難?

 佟達:第一個困難應該是來自編程範式的變化,由於TensorFlow是聲明式開發方式,經過Session真正執行程序,這和常見的開發語言編程範式不太同樣。若是是曾經有過函數式編程的Lazy Evaluation經驗,接受起來會好一點。web

 當掌握了基本的TensorFlow操做以後,就要使用TensorFlow作些真正有意義的事情。這時候的一大困難在於,TensorFlow的報錯信息不那麼直觀,若是執行出錯,新手很難從一大堆調用棧中找到有用的信息。編程

白髮川:首選遇到的應該是數學的知識,TF自己是一個深度學習的框架,和咱們常規的程序框架例如Spring,Hibernate之類的框架定位不太同樣,會偏向數學部分一點,例如矩陣計算,求導等,雖然TF已經封裝了對應的計算的API,可是咱們仍是須要知道這些概念性的知識,這樣才知道應該用什麼API。 api

其次TF經過圖的構建和計算部分分離實現模型的分佈式,這一塊的理解對初學者來講有時候也不太容易。性能優化

學習遇到困難以後,有哪些途徑能夠尋求幫助?網絡

 佟達:若是身邊有人能夠提供指導,直接尋求幫助必定是最有效的。若是身邊沒有這樣的人能夠提供幫助,那麼StackOverflow是在線尋求幫助的首選。Google的TensorFlow開發團隊會有人專門在StackOverflow上回答問題,固然除了Google的人,還有不少熱心的開發者提供幫助,好比說我(笑)。session

白髮川:目前TF的中文資料相對匱乏,因此優先的參考途徑確定是TF的官方doc文檔,目前極客學院對TF官方文檔作了漢化翻譯,不過相對會比官方的延後一點。

 有沒有推薦的學習資源?

 佟達:資源太多了,好比Udacity的Deep Learning課程,Coursera上的Machine Learning課程,還有Stanford提供的課程錄像,好比CS231n和CS224n。另外,被稱爲深度學習聖經的《Deep Learning》也在網上(deeplearningbook.org)免費提供。

白髮川:Stanford目前有不少針對機器學習的課程,例如CS231N,還有針對TF的CS20SI,這些都是很好的課程。

是否推薦新手從 Keras 入手?除 Keras,還有哪些適配 TensorFlow 的第三方工具推薦新手使用?

佟達: TensorFlow的API比較底層,有時候要作一件很簡單的事情,要寫不少輔助代碼。而Keras的接口設計很是簡潔,作一樣的事情,Keras的代碼大概是TensorFlow的三分之一到五分之一。不過我認爲新手對二者都應該學習一下,這樣對於理解原理更有幫助。事實上,我甚至推薦連TensorFlow都不用,先用純Python本身作一個簡單的神經網絡。 

除了Keras以外,tf slim,tflearn等都是早期嘗試簡化TensorFlow的工具,不過自從1.0開始,TensorFlow官方支持Keras,估計之後Keras會成爲主流。 

另外,TensorBoard是新手必須學會使用的,這個工具備很是好的可視化輔助工具,幫助工程師調試模型以及訓練過程。tfdbg是1.0以後發佈的調試工具,能夠在每個step中實時查看數據變化。不過這個工具目前能作的還很少,並且還有性能問題,開調試模式和非調試模式內存相差好幾倍,因此還有很大的提高空間。

白髮川:Keras相比TF來講封裝的更好,能夠說API更加工程化,因此若是說對於機器學習徹底沒有概念,Keras是一個不錯的選擇。目前有不少圍繞TF進行封裝的框架或者工具,例如Keras自己就是對TF的包裝,其次TF Learn等也可嘗試。

能不能講講大家當初上手 TensorFlow 的經歷?學習過程當中都遇到了哪些困難,又是如何解決的?

 佟達:我在使用TensorFlow以前,使用過其餘一些機器學習/深度學習框架,好比主要用於語音識別的Kaldi,圖像識別的Caffe,還有Spark MLlib,DeepLearning4j等。因此上手TensorFlow並無帶來特別大的困難。

當用TensorFlow作的事情愈來愈複雜以後,我開始嘗試擴展TensorFlow,好比寫一些自定義的Op。在TensorFlow中添加自定義Op須要用C++實現,編譯好以後,在Python裏面講動態庫連接進來才能使用。這一過程仍是有些複雜,尤爲是C++的代碼有問題須要調試,須要使用lldb(llvm的debug工具,相似gdb),這對開發這的要求比較高。另外TensorFlow的編譯使用的是Bazel,這是谷歌開源的一個多語言項目管理工具,要想把自定義的Op編譯出來,還須要花點時間研究Bazel。

實際上,Google很成功的把TensorFlow封裝的很好,開箱即用,然而,框架自己的複雜度仍是很高,一旦你想要深刻進去,仍是須要下很大功夫。

白髮川:TF不是我接觸的第一個深度學習框架。我是從大數據作起,到後來的開始用Spark MLlib作開發,也使用過h2o和deeplearning4j這些框架,最後才接觸TF的。因此對於我來講,更多的是學習TF的API設計相關的改變,以及對比其餘框架TF作了哪些差別化的地方。對於API這一塊,直接參考TF的Doc就是最好的方法。

不過我能夠介紹一下入門到機器學習的經歷,我最開始的工做也是和大多數人同樣,從事web開發,或者mobile的開發,因此個人狀況應該和大多數人相同,後來我開始接觸到機器學習的時候發現和以前的思惟差異挺大的,首先在咱們從事通常的像mobile之類的開發的時候,咱們並不會關心什麼是矩陣的逆,什麼是函數的導數,更加不會關心什麼是鏈式求導,而在機器學習裏面,這些都是基礎,因此我又從新撿回了大學的線性代數和微積分再次過了一遍。

TF是個深度學習框架,因此使用TF的時候不可避免的要理解什麼是隱層,什麼是激活函數,激活函數有哪些,以及如何定義損失函數等等這一些概念,對於這一塊我當時除了調研一些書籍外也經過看stanford的一些課程來學習,固然過程當中也和不少同行進行交流和總結,特別是對於調參這一塊,除了學習以外更多的須要本身進行實踐。

TensorFlow 升級到 1.0 版本以後,感受到了哪些提高?

 佟達:對我來講,TensorFlow 1.0最重要的變化在於高階API,好比Estimator,以及和Keras的集成,這些改變能夠大幅度的減小咱們構建模型的代碼量。

另外,1.0的API也通過了一些調整,這致使一些舊代碼和新版本不兼容,不過從長期維護來看,1.0的API有更好的一致性,對於開發者來講,仍是利大於弊。

白髮川:首先相比以前的版本,1.0的速度確定是變快了,這個官方也明確的提到了,而且也給出了必定的參考指標,TF 1.0加入了XLA,這也是爲將來性能優化作的基礎。

除了性能方面的體驗外,在開發中,TF的API進行的很大的修改,相比以前來講更加的人性化,感受起來有點像numpy的感受,因此若是不是1.0的代碼,可能會不兼容,不過TF提供了轉換的腳本,能夠方便直接把代碼轉換到1.0。

TF1.0提供了調試工具TFBDG,不管是大數據仍是機器學習相關的開發,調試始終不是那麼順暢,而1.0提供的調試工具,能夠說正在逐漸的彌補這一塊,雖然目前仍是有不少問題,不過已經有了很大的進步。

大家認爲,目前 TensorFlow 有哪些侷限性?其中又有哪些是開發者能夠利用第三方工具克服的?

 佟達:TensorFlow的設計範式帶來的一個天生限制就是在TensorFlow中,想要動態修改計算圖比較困難。實際上動態修改計算圖的需求並很多見,好比訓練機器翻譯或者聊天機器人的模型,句子長度不同,計算圖實際上是不同的。之前,要解決這個問題,就是設定一個比較長的輸入長度,對於比較短的句子,填充一些佔位字符。今年早些時候,TensorFlow發佈了一個工具,TensorFlow Fold,能夠相對方便的動態修改計算圖。不過總的來講,TensorFlow在計算圖的設計靈活性上仍是有些欠缺。

白髮川:目前來講,TF要想發揮最大的效果,仍是須要藉助於GPU,固然這並不算TF的侷限,應該說全部數值計算的框架都有這個特色,對於這個目前你們的作法都是搭建本身的GPU集羣,GOOGLE甚至開發了本身的GPU:TPU。

雖然你們都比較承認TF是工程化作的很好的深度學習框架,實際上它仍是有一些門檻的,簡單到API的設計,複雜到模型的訓練和調參,其實仍是是有必定門檻的,相比來講Keras的API設計更加直觀化。

TF雖然提供了java和go的api,不過目前還不太成熟和穩定,因此對於開發語言,我仍是推薦python,或者說我建議你們想往這個方向學習的時候,儘可能掌握python這門語言,在咱們實際開發中,會有不少用處的。

TensorFlow 在 ThoughtWorks 的業務中扮演了什麼角色?對於公司進行產品開發,有沒有更合適的選擇?

 佟達:TensorFlow是 ThoughtWorks 目前在深度學習項目上的首選平臺,由於它的工程化作的確實要比其餘框架成熟,同時又和Hadoop、Kubernetes這些咱們已經在不少項目中使用的工具兼容。

至於「更合適」,如今還不太好下判斷,Facebook的PyTorch口碑很不錯,MxNet被Amazon和不少IT公司支持,而Intel的BigDL另闢蹊徑,在CPU上優化深度學習,並且和Spark無縫集成,看起來對於已經使用雲計算和大數據工具的公司來講吸引力也很是大。因此在深度學習框架這個領域,目前處於百花齊放的狀態,最後誰會勝出,還很差說。

白髮川:ThoughtWorks 有本身的機器學習團隊,主要方向爲大數據和人工智能,固然這兩個方向的劃分並不徹底獨立的,實際上在實際開發中咱們是將二者結合,實現基於大數據下的人工智能,對於深度學習的框架,咱們spike過目前存在的大多數框架,最終選擇了TF,因此咱們的工做都是將TF工程化和市場化。

在選擇對比了不一樣的框架以後,咱們也比較明確現有框架的一些優缺點和侷限,因此咱們也研發了TW本身的深度學習框架:deeplearning.scala,框架自己是基於scala開發,具體的信息你們能夠在github上看到,目前是開源的。

相關文章
相關標籤/搜索