自從tensorflow半年前發布以來,我們一直使用它來進行日常研究和工程。在此過程中我們也學習到了很多知識。是時候寫一些新體會了!
因為tensorflow上沒有很多主觀的文章和有用的文件,我必須盡可能地使用我能找到的樣例、教程、文件和**片段。
社群參與是最重要的。
當涉及到機器學習時,很容易把注意力集中於技術上(特徵、功能、基準等)。但是優秀的程式設計師都知道,編寫人們願意使用的**要比機器可以編譯執行的**要難上許多。所以,對於tensorflow我最欣賞的一點就是,機器學習社群的所有人都能意識到這點,他們願意去嘗試它,而且之中有許多人使用它來編寫有用的東西。解決問題有更多的思路,更多的經驗可供借鑑!
現在大量的開發者和學生都對深度學習感興趣,因為它們聽說了tensorflow。谷歌deepmind最近宣布,他們將會把torch遷移到tensorflow上,所以我們可能會在不久的將來看到tensorflow中引入了強化學習模型。當社群擁抱開放,透明api,有用模組,以及為網際網路做貢獻,前途會一片光明。
技術封鎖因素已基本消除。
當我們去年11月份寫的第一篇評估tensorflow的文章時,它還存在一些實際和潛在的封鎖因素。我很高興的告訴你們,大多數這些封鎖因素現在都已經消除了。
一些高品質的元框架
發布時間表
維護乙個流行的開源專案是一大挑戰,特別是像tensorflow這樣具有技術複雜性的專案。感謝維護者!我們首先感謝他們整合新特性和測試的策略,以便早期採用者可以在它們形成文件之前嚐嚐鮮。如果你對發布細節感興趣,看看版本記錄:
測試相當棒!
測試對驗證功能和臨時觀測運**況非常有用。當你在tensorflow中發現一些與你預期不符的東西,或者你在學習某個方法或某些引數的怪癖行為時,在github上搜尋測試,看看測試是如何做的!
與theano相比仍缺少rnn。
theano團隊花了多年時間投入了大量精力去優化遞迴神經網路實現。令人高興的是,這個差距正在迅速縮小,在幾個月後,tensorflow可能是rnn的首選平台。特別是:
缺少資料攝取權威樣例。
tensorflow文件和樣例集中於使用一些著名的學術資料集來演示各種特性和功能。這完全有道理,按事情輕重緩急來處理是一件好事。但現實世界的問題很少能夠替代這些資料集。在學習乙個新的深度學習框架時,處理張量輸入和形狀會是一大絆腳石,所以給出一些處理凌亂輸入資料(怪異的形狀,填充,分布,標記化等)的樣例可以為將來開發者/工程師解決許多問題。
文件可能會不一致
tensorflow有許多不錯的教程,而且**有很好的注釋(感謝作者)。但是機器學習/深度學習是很深而且很廣的領域,而且在新功能和文件/教程之間會有滯後。一些我們喜歡的教程有:
不幸的是,尤其對於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社群編寫文件與開發新特性同樣急切,那會是件非常棒的事情!
我們仍然在等待跟蹤監測工具,腦電圖。
(⊙_☉) 哈哈。
異構資源利用增加了複雜性。
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,那麼這麼設定:
export cuda_visible_devices=0,1
# only the first two gpus are usable
注意:上面的cuda裝置的數字可能與你的不一樣,檢視裝置id使用nvidia-smi!
另外,如果你想讓theano只在cpu上執行,你可能想讓資料和實用功能這麼做,那麼你可以在python**中設定。下面是實現這效果的python**。將它放在所有匯入語句的上方:
import os
os.environ['theano_flags'] = "floatx=float32,device=cpu,fastmath=true,ldflags=-lopenblas"
當然你也可以在**裡設定cuda的環境標誌,但對我的模型開發工作流程來說,記住「每個shell指令碼乙個gpu」更容易。
在任何框架中實現端到端的工作流要付出一定的努力,tensorflow也不例外。tensorflow的一些東西(佇列,某些圖操作,資源分配/上下文管理,圖形視覺化)相對於深度學習場景來說還比較新,我們仍然在學習利用這些特性的最佳途徑。其他一些東西在其他框架中已經存在一段時間了。雖然整體概念相似,但實現細節不盡相同。我們感謝所有的谷歌開發者為實現良好抽象(例如佇列中的流式資料)而付出的努力。
開放工具最好的地方就是,社群人員為解決乙個問題實現了乙個非常聰明的技巧或創新方式。儘管大多數人還在學習tensorflow,我認為這種情況發生的可能性會水漲船高!展望下乙個時代!
網頁配色之黃金分割法
眾所周知,數學上有乙個 分割點 0.618。據說用次比例數分割是最具美感的,從美眉身材到高樓建築,從藝術到繪畫無不出其之左,因此被稱為 神奇 的 分割點。與此同時,人們也對其進行了大量的研究,研究結果更是大量的 神奇 說法。不過,我輩是現實主義者,神奇 就不談了,還是看看咋用它的 神奇 解決我的問題...
系統設計黃金法則 簡單之美
注 本文已發表在2012年第5期 中國計算機學會通訊 最近多次看到系統設計與實現的文章與討論,再加上以前讀過的其他資料以及自己的一些實踐教訓,讓我覺得應該把這些資料彙總整理一下。如果 要從討論不同系統的眾多資料中總結一條 法則的話,那只有乙個詞 簡單 如果用乙個英語單詞來表達的話,那就是 kiss ...
系統設計黃金法則 簡單之美
注 本文已發表在2012年第5期 中國計算機學會通訊 最近多次看到系統設計與實現的文章與討論,再加上以前讀過的其他資料以及自己的一些實踐教訓,讓我覺得應該把這些資料彙總整理一下。如果 要從討論不同系統的眾多資料中總結一條 法則的話,那只有乙個詞 簡單 如果用乙個英語單詞來表達的話,那就是 kiss ...