TensorFlow除錯技巧

2021-09-25 16:46:39 字數 1663 閱讀 9438

tensorflow從誕生以來就一直在深度學習框架中穩居老大的位置,雖然自從2023年12月pytorch 1.0 stable版本正式發布以來,很快減小了差距,但是也難以超越。

tensorflow的強項在於部署(包括tensorflow lite在移動端部署)和執行效率,另外對各種operation的支援特別齊全,基本上你能想到的運算元都已經實現好了,直接呼叫就好。除此之外,google brain的各項前沿研究,以及現在deepmind的很多研究,開源**肯定都是基於tensorflow,比如現在很火的automl技術等等,所以成為no.1也是自然而然。

但是又不得不吐槽其除錯功能,真是太難用了。這也直接導致了tensorflow的學習曲線異常之陡,和vim的類似,學起來很難很痛苦,但是學好之後,那是相當地爽。

那麼,tensorflow怎麼除錯呢?使用斷點還是print?亦或是高大上的tfdbg?都不是。

由於tensorflow靜態圖的設計(eager模式除外,這個後面單獨討論),設定斷點根本無法獲取實際tensor的值,具體取值都在後台以c++的方式執行。那print呢?也只能列印出tensor的shape資訊。tfdbg,這個官方開發的專用工具該行了吧?不過我建議還是不要嘗試了,不僅要一點一點敲命令,我在debug大型程式的時候,直接卡死。

對了,還有一種暴力方法,我最開始的時候在使用,就是把tensor拉出來sess.run一把,這樣的確可以得到tensor執行的具體值,但是每次要手動改,很麻煩。

好了,神器要出來了:tf.print. 在老版本的tensorflow中可以這麼用,非常方便:

x = tf.print(x, [x, x,shape, x[0], …], message=「x debug info」, summarize=100)

其中,x是需要列印的tensor,注意第乙個輸入是x和輸出相同,但其實也可以不同,做一些操作,但一般debug不需要,所以等式左邊的輸出也是x.

第二個輸入在方括號內表示需要列印的東西,可以是tensor x的具體值,或者是其shape,slice,甚至是函式。

第三個輸入message用來標識這一處列印,可以自定義字串。

最後的summarize控制輸出元素的數量,比如100就輸出x的前100個元素。

對於新版的tensorflow,使用tf.print,語法如下:

print_op = tf.print(x)

with tf.control_dependencies([print_op]):

out = tf.add(x, x)

sess.run(out)

很方便吧?

雖然不如直接在pycharm中設定斷點方便,但能把tensor列印出來定位問題也就容易多了。當然,如果是學習**,想單步跟蹤,建議使用eager模式,這就和pytorch的方式非常相近了,當然,犧牲的是執行效率。

聯絡我:

郵箱[email protected]

tensorflow常用技巧

vim vimrc 開啟這個檔案後 設定tab鍵為4個空格,並且每行顯示行號。輸入 set nu 設定每行行號 set ts 4 空四個空格 建立計算圖,這是不會顯示計算結果,只描述了這是什麼樣的計算 import tensorflow as tf a tf.constant 1.0,2.0 b t...

GDB除錯技巧,除錯命令

除錯時檢視依賴dsopidof tvm rpc server cat proc maps子程序除錯 1.vscode setupcommands output cpu simu dev bin ld library path ignorefailures false exec catch throw...

GDB除錯技巧

在公司工作了一段時間,發現 b s結構的 除錯很麻煩,經常用的手段是通過 printf 打一串訊息來進行跟蹤,然後估計問題出在 通過逐步新增 printf 語句,獲得越來越多的資訊最終確定問題的根源。我感覺這樣比較麻煩,如果能把 gdb的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...