TensorFlow是谷歌2015年開源的用于深度學(xué)習(xí)算法開發(fā)的一套目前非常流行的框架叉跛,不僅在學(xué)術(shù)界而且在工業(yè)界都非常收歡迎甸私。用TensorFlow實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)十分的簡潔衣吠,但是往往有時候你自己實現(xiàn)出來的神經(jīng)網(wǎng)絡(luò)的表現(xiàn)效果和預(yù)期有差別渠鸽,或者說模型不工作欲芹。那么如何進(jìn)行Debug降瞳,我自己最近有了一些小的體會衙传,分享給大家决帖。
本文主要分為兩個部分,一部分是使用sess.run()方法獲得模型運行期間的各個tensor的值蓖捶,另一部分是使用TensorFlow自帶的Debug工具tfdbg古瓤。
1.獲取模型中tensor的值
在tensorflow構(gòu)建的模型中,數(shù)據(jù)是以tensor的形式的存儲和計算的腺阳。tensor我們主要關(guān)心的是它的shape和具體的value這兩個屬性落君,通過這兩個屬性我們可以判斷我們模型是不是按照我們預(yù)先設(shè)想的方式進(jìn)行運作的。通過sess.run()中fetch你指定的tensor亭引,可以拿到我們想要觀察的tensor绎速。如下:
上面是一個簡單的擬合一個線性模型的demo,我們通過fetch+sess.run()的方式獲得了每次訓(xùn)練完成后的b和w焙蚓,并每隔50次迭代將其type,shape和value打印出來纹冤,下面是運行結(jié)果:
step: 0 type of b:shape of b: (1,)? value of b: [ 0.67431259]type of w:shape of w: (1, 2)? value of w: [[-0.33759621? 0.51075733]]
step: 50 type of b:shape of b: (1,)? value of b: [ 0.30864805]type of w:shape of w: (1, 2)? value of w: [[ 0.08913503? 0.19295232]]
step: 100 type of b:shape of b: (1,)? value of b: [ 0.30055302]type of w:shape of w: (1, 2)? value of w: [[ 0.0994734? 0.19937272]]
step: 150 type of b:shape of b: (1,)? value of b: [ 0.30003637]type of w:shape of w: (1, 2)? value of w: [[ 0.0999667? 0.19995736]]
step: 200 type of b:shape of b: (1,)? value of b: [ 0.3000024]type of w:shape of w: (1, 2)? value of w: [[ 0.09999783? 0.1999972 ]]
通過運行結(jié)果我們可以看出洒宝,每次通過sess.run返回的tensor都是一個numpy數(shù)組,這樣很方便我們觀察每個tensor的值萌京,shape等雁歌,然后確定模型是不是按照我們想要的方式進(jìn)行運作的。除了通過sess.run()知残,還可以通過tf.Print和tf.Assert 的方式來觀察我們想要的tensor靠瞎,但是我個人還是比較喜歡用sess.run()的方式。
2.TensorFlow Debugger (tfdbg)
TensorFlow Debugger是TensorFlow自帶的CLI調(diào)試工具tfdbg求妹,這是一個很方便快捷的調(diào)試工具乏盐,官方的文檔中給出了一個基于mnist數(shù)據(jù)集的一個例子,解釋的很詳細(xì)制恍。下面我們還是在上面的擬合線性模型的demo上進(jìn)行演示父能,代碼如下:
我們可以看到tfdbg其實很簡單只需要將session包裝成一個用于調(diào)試的LocalCLIDebugWrapperSession類即可,這樣在session run的時候就會自動的啟動tfdbg的命令行界面净神,進(jìn)行包裝的代碼很簡單只有一行:
上面代碼在tfdbg運行時的命令行界面:
通過tfdbg我們可以很方便直觀的看到每一次sess.run時候的數(shù)據(jù)圖中各個節(jié)點的情況何吝,包括我們想要觀察的b和w。tfdbg的功能和用法還有很多鹃唯,根據(jù)需要可以自己去看官方的文檔TensorFlow Debugger (tfdbg) Command-Line-Interface岔霸。
3.總結(jié)
TensorFlow是一個很高級的框架,我們用它來實現(xiàn)深度學(xué)習(xí)算法很簡潔俯渤,而且不需要考慮很底層的實現(xiàn)呆细,這樣有利有弊。好處是提高了開發(fā)的效率八匠,壞處是不清楚底層的實現(xiàn)絮爷,有時候出現(xiàn)問題不能很好的找出bug所在。所以通過對模型算的debug的過程梨树,也是進(jìn)一步加深了自己對TensorFlow的理解坑夯。
個人覺得學(xué)習(xí)TensorFlow最好的方式就是自己找一個開源深度學(xué)習(xí)任務(wù),然后自己將其復(fù)現(xiàn)出來抡四,復(fù)現(xiàn)一定要做到指標(biāo)和原有模型對齊柜蜈,再這個過程中肯定會遇到各種各樣的bug,但是程序員不就為了bug而生么指巡,慢慢debug的過程淑履,也就對TensorFlow有了更深的理解啦。