tensorflow實現(xiàn)在函數(shù)中用tf.Print輸出中間值
tensorflow由于其基于靜態(tài)圖的模式,導(dǎo)致寫代碼的時候很難調(diào)試,除了用官方的調(diào)試工具外,最直接的方法就是把中間結(jié)果輸出出來查看,然而,直接用print函數(shù)只能輸出tensor變量的形狀,而不是數(shù)值,想要輸出tensor的具體數(shù)值需要用tf.Print函數(shù)。網(wǎng)上有很多關(guān)于這個函數(shù)使用方法的說明,這里簡要介紹:
Print( input_, data, message=None, first_n=None, summarize=None, name=None )
參數(shù):
input_:通過這個操作的張量。 (流入的數(shù)據(jù)流)
data:計算 op 時要打印的張量列表。(用[ ]引起來的一串需要打印的東西,用逗號隔開)
message:一個字符串,錯誤消息的前綴。
first_n:只記錄 first_n 次數(shù)。負數(shù)日志,這是默認的。
summarize:只打印每個張量的固定數(shù)目的條目。如果沒有,則每個輸入張量最多打印3個元素。
name:操作的名稱(可選)
然而網(wǎng)上大部分資源都是介紹如何在主函數(shù)中先建立一個op,再開啟一個Session執(zhí)行sess.run(op)的方法,但是如果想要輸出函數(shù)中的中間值而該值又未傳回主函數(shù)呢?這種情況下無法在函數(shù)中開啟一個新的Session,但是仍然可以用tf.Print建立op來實現(xiàn)。
import tensorflow as tf import os os.environ["CUDA_VISIBLE_DEVICES"] = "0" def test(): a=tf.constant(0) for i in range(10): a_print = tf.Print(a,['a_value: ',a]) a=a_print+1 return a if __name__=='__main__': with tf.Session() as sess: sess.run(test())
運行結(jié)果:

a_print可以理解為在圖中新增了一個節(jié)點,在后續(xù)代碼中當(dāng)有別的變量使用了a_print時(如上例a=a_print+1),就會有數(shù)據(jù)從a_print節(jié)點上流過,就會輸出值,而究竟會輸出幾次值呢?這其實并不是看下文中a_print被使用了幾次,而是看數(shù)據(jù)流要從該節(jié)點上流經(jīng)幾次,可以理解為a_print這個op被“定義”了幾次。
def test(): a=tf.constant(0) a_print = tf.Print(a,['a_value: ',a]) for i in range(10): a=a_print+1 return a if __name__=='__main__': with tf.Session() as sess: sess.run(test())
如果把test()函數(shù)改成這樣,則運行結(jié)果為:

輸出僅被執(zhí)行了一次,因為a_print這個op只被定義了一次,雖然后面在循環(huán)里不斷被a使用,但是數(shù)據(jù)只從它身上經(jīng)過了一次,所以只會print一次,并且a_print的值永遠為0,最終返回的a的值也為1。
再把代碼改成下例:
def test(): a=tf.constant(0) a_print = tf.Print(a,['a_value: ',a]) for i in range(10): a_print=a_print+1 return a if __name__=='__main__': with tf.Session() as sess: sess.run(test())
運行結(jié)果是什么也不會輸出,因為a_print這個op沒有和別的變量發(fā)生關(guān)系,它沒有被別的變量使用,在圖里為孤立的一個節(jié)點,沒有數(shù)據(jù)流過,就不會被執(zhí)行。
而如果改成這樣
def test(): a=tf.constant(0) a_print = tf.Print(a,['a_value: ',a]) for i in range(10): a_print=a_print+1 return a_print if __name__=='__main__': with tf.Session() as sess: sess.run(test())
運行結(jié)果

返回的a_print值為10也是正確的,因為a_print在下文被返回,所以有數(shù)據(jù)流流經(jīng),會被執(zhí)行,而因為a_print的定義只執(zhí)行一次,所以只會輸出一次。
以上這篇tensorflow實現(xiàn)在函數(shù)中用tf.Print輸出中間值就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
用十張圖詳解TensorFlow數(shù)據(jù)讀取機制(附代碼)
這篇文章主要介紹了用十張圖詳解TensorFlow數(shù)據(jù)讀取機制(附代碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
python使用正則表達式替換匹配成功的組并輸出替換的次數(shù)
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。這篇文章主要介紹了python使用正則表達式替換匹配成功的組并輸出替換的次數(shù),需要的朋友可以參考下2017-11-11
python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼
這篇文章主要介紹了python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
python包pdfkit(wkhtmltopdf)?將HTML轉(zhuǎn)換為PDF的操作方法
pdfkit,把HTML+CSS格式的文件轉(zhuǎn)換成PDF格式文檔的一種工具。它就是html轉(zhuǎn)成pdf工具包wkhtmltopdf的Python封裝。所以,必須手動安裝wkhtmltopdf,這篇文章主要介紹了python包pdfkit(wkhtmltopdf)將HTML轉(zhuǎn)換為PDF,需要的朋友可以參考下2022-04-04
Python利用LyScript插件實現(xiàn)批量打開關(guān)閉進程
LyScript是一款x64dbg主動化操控插件,經(jīng)過Python操控X64dbg,完成了遠程動態(tài)調(diào)試,解決了逆向工作者剖析漏洞,尋覓指令片段,原生腳本不行強壯的問題。本文將利用LyScript插件實現(xiàn)批量打開關(guān)閉進程,感興趣的可以了解一下2022-07-07
Python判斷對象是否為文件對象(file object)的三種方法示例
這篇文章主要介紹了Python判斷對象是否為文件對象(file object)的三種方法示例,https://www.pythontab.com/html/2018/pythonhexinbiancheng_1015/1362.html2019-04-04
Python利用柯里化實現(xiàn)提高代碼質(zhì)量
柯里化(Currying)是函數(shù)式編程中的一個重要概念,它可以將一個多參數(shù)函數(shù)轉(zhuǎn)化為一系列單參數(shù)函數(shù)的組合,本文將詳細解釋什么是柯里化,如何在Python中實現(xiàn)柯里化,感興趣的可以了解下2024-01-01

