關于TensorFlow的探討
大小:1.76 MB 人氣: 2017-10-10 需要積分:1
因為TensorFlow上沒有很多主觀的文章和有用的文檔,我必須盡可能地使用我能找到的樣例、教程、文檔和代碼片段。
善
社區參與是最重要的。
當涉及到機器學習時,很容易把注意力集中于技術上(特征、功能、基準等)。但是優秀的程序員都知道,編寫人們愿意使用的代碼要比機器可以編譯執行的代碼要難上許多。所以,對于TensorFlow我最欣賞的一點就是,機器學習社區的所有人都能意識到這點,他們愿意去嘗試它,而且之中有許多人使用它來編寫有用的東西。解決問題有更多的思路,更多的經驗可供借鑒!
現在大量的開發者和學生都對深度學習感興趣,因為它們聽說了TensorFlow。谷歌Deepmind最近宣布,他們將會把Torch遷移到TensorFlow上,所以我們可能會在不久的將來看到TensorFlow中引入了強化學習模型。當社區擁抱開放,透明API,有用模塊,以及為互聯網做貢獻,前途會一片光明。
技術封鎖因素已基本消除。
當我們去年11月份寫的第一篇評估TensorFlow的文章時,它還存在一些實際和潛在的封鎖因素。我很高興的告訴你們,大多數這些封鎖因素現在都已經消除了。
支持多GPU。它能正常工作;文檔很簡潔。不過你仍然需要弄清楚如何分解并解決問題,這也很有趣,不是嗎?
分布式資源訓練(比如云)。在v0.8版本中,已經支持了分布式訓練。
支持隊列,在運算圖上進行數據加載和預處理等操作。
使用TensorBoard可視化運算圖。在構建、調試新模型時,很容易迷失方向。對我來說,針對我構建用于解決困難問題的新框架和模型,要保持心理語境已經是相當繁重的任務了,因此對模型有一個完全不同的表示非常有用;TensorBoard的圖形可視化工具在這里非常有用。
TensorBoard交互式記錄事件日志。在UNIX/Linux下,我喜歡使用命令tail -f 來監測命令行任務的輸出,做快速明智的檢查。TensorFlow的事件日志記錄可以達到同樣的效果,從圖表中得出時間和匯總,然后TensorBoard隨著時間推移來監控輸出(比如學習率,損失值,訓練/測試精度)。
模型檢查點。訓練模型一段時間。然后停止并進行評估。重新載入檢查點繼續訓練。
性能和GPU內存使用量與Theano和其他使用CUDNN的庫相似。早期版本的性能不足似乎是因為使用了CUDNNv2,那么在TensorFlow v0.8(使用CUDNNv4)中有了極大改善。
一些高品質的元框架
Keras包裝了TensorFlow和Theano的后端。如果你不想深入TensorFlow(或是Theano)的細節,Keras會是個不錯的參考。
TensorFlow Slim是構建圖像模型不錯的選擇。即使你更喜歡自己寫底層的TensorFlow代碼,對TensorFlow API使用和模型設計等,Slim是不錯的參考。
Skflow將TensorFlow方法包裝成了scikit-learn風格的API。在我看來,與導入、內嵌各種scikit-learn指標的Python代碼相比,這么做有點奇怪。
PrettyTensor提供了具有類似張量行為的東西,有一種可鏈接的語法,你可以快速構建特定類型的模型。
發布時間表
維護一個流行的開源項目是一大挑戰,特別是像TensorFlow這樣具有技術復雜性的項目。感謝維護者!我們首先感謝他們整合新特性和測試的策略,以便早期采用者可以在它們形成文檔之前嘗嘗鮮。如果你對發布細節感興趣,看看版本記錄:https://www.tensorflow.org/versions/r0.8/resources/versions.html
測試相當棒!
測試對驗證功能和臨時觀測運行情況非常有用。當你在TensorFlow中發現一些與你預期不符的東西,或者你在學習某個方法或某些參數的怪癖行為時,在Github上搜索測試,看看測試是如何做的!
惡
與Theano相比仍缺少RNN。
Theano團隊花了多年時間投入了大量精力去優化遞歸神經網絡實現。令人高興的是,這個差距正在迅速縮小,在幾個月后,TensorFlow可能是RNN的首選平臺。特別是:
我們還沒找到優雅地處理可變長度序列輸入的方式。用額外的復雜度來處理,大多數模型不需要這么做。填補所有序列至一個固定長度在許多情況下效果不錯(特別是使用批處理和GPU),但有些人可能認為這不是令人滿意的做法。動態展開RNN可能是個解決方案,但是tensorflow.python.ops.rnn模塊中的dynamic_rnn實現是新功能,還沒有形成文檔。我們還在進行實驗。
性能和內存使用量。雖然很難做出確切的同類比較,但是在在兩個框架中實現許多同樣的模型給我們的印象是,對于RNN,在給定的GPU上,Theano可能要快一些而且使用更少的內存,也許是因為有逐點操作。TensorFlow在多GPU上和“編譯”時間上更勝一籌。
缺少數據攝取權威樣例。
TensorFlow文檔和樣例集中于使用一些著名的學術數據集來演示各種特性和功能。這完全有道理,按事情輕重緩急來處理是一件好事。但現實世界的問題很少能夠替代這些數據集。在學習一個新的深度學習框架時,處理張量輸入和形狀會是一大絆腳石,所以給出一些處理凌亂輸入數據(怪異的形狀,填充,分布,標記化等)的樣例可以為將來開發者/工程師解決許多問題。
文檔可能會不一致
TensorFlow有許多不錯的教程,而且代碼有很好的注釋(感謝作者)。但是機器學習/深度學習是很深而且很廣的領域,而且在新功能和文檔/教程之間會有滯后。一些我們喜歡的教程有:
Nathan Github上的簡單教程。可以快速查看機器學習的工作原理。如果你熟悉numpy或Theano,你可以從這里開始。
谷歌Vincent Vanhoucke的Udacity課程。如果你是深度學習初學者,那么從這里開始。
MNIST官方教程。如果你是深度學習初學者,在學習完Udacity課程后,可以看看這里的教程。MNIST是“機器學習果蠅”,有良好的基準和完整性檢查。
TensorFlow API文檔。TensorFlow的首選參考。Control-F來搜索!
不幸的是,尤其對于RNN,在文檔和教程之間還是有概念差距,比如簡單樣例和全面頂尖樣例之間的差距。這對那些同時學習概念和框架的開發者來說的確是一大障礙。例如,Udacity教程和RNN教程使用賓州樹庫數據(Penn TreeBank data)來建立語言模型具有很好的說明性,因為它們簡單。它們對于學習一個概念是不錯的教程,但是對于現實世界的建模任務來說又太基礎了。我們意識到TensorFlow RNN教程唯一權威之處就是就是全面序列-序列模型,它使用多單元RNN(GRU或LSTM),采用了attention,bucketing,和采樣softmax。哇!這就像你學習滑雪,不需要從在山坡上訓練開始,然后就直接在布滿樹木的山頂上使用雪上特技(危險,可怕對么!?)…你可能不應該在實現簡單功能后,就實現最復雜的功能。根據你正在解決的問題,逐步增加復雜度。
高品質的教程會逐漸提高復雜度,從簡單的RNN語言模型到能夠學習反轉詞語的普通序列-序列RNN編碼器-解碼器架構,到具有attention的神經翻譯序列-序列LSTM,然后到具有多單元RNN,bucketing以及所有對初期TensorFlow用戶社區有極大幫助的技巧。我猜測由于缺乏這種循序漸進的樣例可能可以解釋為什么社區已經產生了許多流行的TensorFlow模型,但我們還沒看到許多創新架構和聰明的混用。
如果缺乏文檔,那么就去看測試!通常情況下測試比文檔更具說明性。由于谷歌將此項目開源,你可以在Github上搜索相關的測試看看作者是如何使用的。
我們完全能夠理解TensorFlow團隊首要專注于功能和特性,其次是文檔…我們可能也會這么做!良好的文檔是一種投資,我見到過最好的文檔是出自非作者之手,因為那至少能夠保證沒接觸過的人能夠理解。如果TensorFlow社區編寫文檔與開發新特性同樣急切,那會是件非常棒的事情!
我們仍然在等待跟蹤監測工具,腦電圖。
(⊙_☉) 哈哈。
丑
異構資源利用增加了復雜性。
控制力和簡單性之間典型的工程權衡——如果你希望在操作執行上有細粒度的控制(例如,使用哪些GPU節點),那么你需要維護這些約束。在某些情況下,細粒度控制對最大限度提高性能是必要的。例如,在給GPU輸入數據之前,使用多線程獲取并預處理批量數據,那么GPU就不會等待這些操作。想了解在CPU上使用異步運行方式輸入數據給GPU的細節,或是為你自己的隊列創建基準,可以看看Luke這篇優秀的文章,TensorFlow Data Input (Part 2): Extensions。
TensorFlow會拱曲GPU。
同樣,在啟動時,TensorFlow會給自己分配所有可用的GPU內存。取決于你使用的情形,這是把雙刃劍。如果你在積極開發模型,并且本機有GPU可用,你可能想將GPU分成多分,分給不同應用。但是,如果你在云環境下部署一個模型,你想知道你的模型可以在可用的硬件下運行,而不會與可能與此硬件通訊的其他代碼發生不可預測的交互。
你可以使用類似于下面的代碼片段來設定每個線程可用GPU內存的上限,但是如果在一臺機器上有多個GPU,我們還不知道用什么方式控制每個GPU的分配。
設置選項:
gpu_options =tf.GPUOptions(per_process_gpu_memory_fraction = 0.5)
然后將它作為配置傳給會話:
sess = tf.Session(config = tf.ConfigProto(gpu_options = gpu_options))
默認情況下,Theano與TensorFlow會沖突。
我們有許多代碼都依賴于Theano,從加載數據到各種實用功能。我們也閱讀了許多Theano中實現的研究代碼。但是,如果你在同一范圍內導入Theano和TensorFlow,它們將競爭分配GPU內存,這會導致壞事發生。在完全不同的GPU(例如,兩個GPU運行兩個單獨的模型)上執行完全不同的環境,你可以在shell環境下限制設備對CUDA的可見性。那么當你啟動Python代碼的時候,它將只會看到(并且分配)CUDA能看到的GPU。如果你使用bash,那么這么設置:
exportCUDA_VISIBLE_DEVICES=0,1# only the first two GPUs are usable
注意:上面的CUDA設備的數字可能與你的不一樣,查看設備ID使用nvidia-smi!
另外,如果你想讓Theano只在CPU上執行,你可能想讓數據和實用功能這么做,那么你可以在Python代碼中設置。下面是實現這效果的Python代碼。將它放在所有導入語句的上方:
import osos.environ[‘THEANO_FLAGS’] = “floatX=float32,device=cpu,fastmath=True,ldflags=-lopenblas”
當然你也可以在代碼里設定CUDA的環境標志,但對我的模型開發工作流程來說,記住“每個shell腳本一個GPU”更容易。
總結
在任何框架中實現端到端的工作流要付出一定的努力,TensorFlow也不例外。TensorFlow的一些東西(隊列,某些圖操作,資源分配/上下文管理,圖形可視化)相對于深度學習場景來說還比較新,我們仍然在學習利用這些特性的最佳途徑。其他一些東西在其他框架中已經存在一段時間了。雖然整體概念相似,但實現細節不盡相同。我們感謝所有的谷歌開發者為實現良好抽象(例如隊列中的流式數據)而付出的努力。
開放工具最好的地方就是,社區人員為解決一個問題實現了一個非常聰明的技巧或創新方式。盡管大多數人還在學習TensorFlow,我認為這種情況發生的可能性會水漲船高!展望下一個時代!
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
關于TensorFlow的探討下載
相關電子資料下載
- 【風火輪YY3568開發板免費體驗】第六章:在Solus上運行自定義模型并遷移到YY3 411
- 深度學習框架tensorflow介紹 480
- 深度學習框架pytorch介紹 454
- 【米爾MYC-JX8MPQ評測】+ 運行 TensorFlow Lite(CPU和NPU對比) 524
- 手把手帶你玩轉—i.MX8MP開發板移植官方NPU TensorFlow例程 444
- 在樹莓派64位上安裝TensorFlow 505
- TensorFlow Lite for MCUs - 網絡邊緣的人工智能 339
- 2023年使用樹莓派和替代品進行深度學習 1506
- 用TensorFlow2.0框架實現BP網絡 1849
- 那些年在pytorch上踩過的坑 571