助你洞察數據流動 — TensorFlow 中的輸出函數 tf.Print 詳解

在你訓練的過程中,想不想看看大量的多維數據(*)是怎樣流動的?

「譯註*」原文 tensor 此處譯作多維數據,本意是張量,即 n 維度的陣列或列表。

篇,由 Google 的開發技術推廣工程師 Yufeng Guo 主講,用通俗易懂的語言幫助你了解人工智慧和機器學習。在這一系列視頻/文章中,我們將一起探秘人工智慧的世界,共同品味藝術、探索科學以及掌握機器學習的工具。

第一篇:機器學習是什麼?

第二篇:機器學習「七步走」

第三篇:用評估器給花卉分類

第四篇:彈性伸縮的雲端託管服務

第五篇:通過 TensorBoard 將模型可視化

第六篇:通過深度神經網路再識評估器

第七篇:雲端訓練模型的大數據解決方案

第八篇:跟著 Google Research 體驗自然語言生成

第九篇:雲上的機器學習引擎

第十篇:使用 MNIST 數據集訓練模型

第十一篇:機器學習工程師用 Python 開發環境的最佳實踐

第十二篇:機器學習之前,讓「大熊貓」先嘗一嘗數據的味道

第十三篇:機器學習大殺器:爆米花般火爆的 Kaggle Kernels

第十四篇:工欲善其事,必先利其器:Jupyter Notebooks 的技巧

第十五篇:「伊人」何處,宛在雲中央:用 Datalab 在雲上部署互動式編程環境

所有的內容和視頻都會首發在「機智如你」專欄,目標是發布最新與谷歌相關的機器學習、TensorFlow 相關內容,如果你有任何問題,也歡迎在留言區向我們提出反饋。

我想,諸位友人都是使用調試器的老手了,也從不使用輸出語句(print)來調試代碼,沒錯吧?

原因很簡單,如果你這麼做了,會發現 TensorFlow 的輸出語句其實和通常的 Python 輸出語句有著不同的效果。

這次我們就來聊一聊 TensorFlow 的輸出語句是怎麼工作的,然後分享如何用好它,讓你少一些困惑和煩惱。

YouTube - Print Statements in TensorFlow

https://www.zhihu.com/video/949686895358283776

TensorFlow 中的輸出函數

編寫 TensorFlow 代碼時,有多種方式可以實現對內容的輸出。首先是 Python 內置的 print 命令(或者 print() 函數,這在 Python 3 之後的版本提供)。然後是 TensorFlow 自帶的輸出函數,叫 tf.Print (注意 P 大寫)。

使用 TensorFlow 時,一定要記得所有的東西最終都體現為圖的計算。也就是說如果你使用 Python 的 print 命令來輸出 TensorFlow 的某個操作,得到的結果僅僅是這個操作的相關描述,因為當前還沒有值被傳入這個操作。print 命令還常常會顯示該節點所期望且已知的維度。

輸出中的值哪兒去了?不過至少我們知道了數據的維數(*)和類型。

「譯註*」shape 和 rank 都用來描述 tensor 的維度,只不過刻畫的角度和方式不同,通過 shape 可以更全面了解 tensor 的結構。

如果你想要在執行計算後輸出「流入」圖中某個具體節點的值,那麼就需要使用 tf.Print 函數了。

調整輸出節點的結構位置

通常我們認為 print 被附加在某些值、操作所在之處,讓它執行之後又再回到原來的操作流當中。在 TensorFlow 邏輯里,只有需要被執行的圖節點才會計算其輸出值。所以如果你的輸出語句懸於圖中某個節點之處,則它根本不會執行。

怎麼辦呢?我們需要把輸出語句嵌入到原來的圖當中,就像下面這幅圖:

具體實現方式是將輸入節點作為第一個參數傳入,然後把 tf.Print 函數的返回值賦值給即將作為下一節點輸入的變數。這樣就能夠把輸出語句嵌入圖的執行流當中了。(強調一下,把返回值傳入下一個節點極其重要,因為一旦你不這麼做,當前的輸出語句仍然懸在某個節點上,而不是嵌入了流當中)

雖然 tf.Print 並不會執行任何計算,只會將 tensor 向後傳遞,但是是用了它的確可以將所需的節點輸出。

與常見 print 命令另一處不同是,我們引入 tf.Print 只是給出了它被執行的時機(即該節點在圖中被執行的時機)。然而,你能輸入的內容並不會受到太大的限制。

也就是說,你只需確定在圖中的哪裡要執行輸出命令,但是卻可以一次將所有可以訪問的節點都輸出出來。這通過第二個參數來實現:它是一個節點數組。通常我們會用與 tf.Print 第一參數相同的節點,但是我們也可以包含更多的節點在裡面,如圖:

還可以在上述第二個參數後面加上第三個參數,一則提示信息。通過它,你能夠在輸出的字元串之前附著一些提示,這樣就便於在輸出日誌中找到特定的內容了。

趁熱打鐵

So there you have it, tf.Print in a nutshell. But where might you utilize tf.Print in your code?

好了,現在你可以用 tf.Print 了,不過你該在哪裡使用呢?

我常常會在輸入函數中使用 tf.Print,這樣便於調試到底什麼數據送入了訓練循環中。這裡不用 Python 的 print 是因為它僅僅在輸入函數圖被構建時執行一次。

取而代之的是在輸入函數流水線使用 tf.Print 調用。注意雖然此處只輸入了輸入節點,但是你也可以輸出其他的節點。

補充幾點建議

注意,在使用 Jupyter notebook 時,輸出內容在其 console 的 stderr 中,不是在 notebook 每個代碼格子的執行輸出中。一定要注意這一點,否則會找不到輸出的內容。

另一個要注意的地方是:如果你在輸入函數中使用了 tf.Print,則一定要注意控制傳入的數據量,否則你會陷入不停滾動輸出界面的窘境。

TensorFlow 不是在所有情況下都適合使用,但如果你想要查看圖中流動的數據時,它是你的不二選擇。


感謝閱讀本期 Cloud AI Adventures。如果你喜歡這些文章,請點個贊,如果你想獲得更多內容,請關注我或者 Yufeng 的 Medium 並且關注「機智如你」專欄或者 YouTube 頻道。更多精彩內容不容錯過!

試試 TensorFlow 提供的這個輸出函數吧,搞清楚機器學習的過程是如何進行的!


感謝你閱讀到這裡,官方播單的總計發布 16 期的內容,我們已經全部本地化發布完畢,專欄的關注量也從零到 1700+,非常感謝大家的支持和關注!

接下來我們將會繼續跟進 AIA 系列內容的更新,同時會開始發布與 Yufeng 同樣 base 在谷歌紐約辦公室的同事 Josh 錄製 MLR 系列視頻 — Machine Learning Recipes with Josh Gordon,這個系列的視頻更適合初學者,更容易上手,預計發布頻率為每周一期。


▏原文出處:Medium - Using tf.Print() in TensorFlow

▏封面來源:YouTube 視頻縮略圖

▏視頻出處:YouTube - Print Statements in TensorFlow

▏字幕翻譯:谷創字幕組

▏文章編輯: @楊棟


推薦閱讀:

為什麼討論Google Drive的人很多,關心OneDrive(以前的SkyDrive)的卻很少?
google 搞Google Doodle意義何在?
在2017 Google 開發者大會上,李飛飛宣布「谷歌中國 AI 研發中心」成立,會帶來什麼影響?
Google 出於哪些考慮投資聖何塞國際機場?
如何評價 Google 員工達漠稱「女性從生物學上不適合編程」?

TAG:TensorFlow | 深度學習DeepLearning | 谷歌Google |