摘要:那他們有什么區(qū)別呢顧名思義,是一個名稱作用域,是變量作用域。這兩種創(chuàng)建方式也是有區(qū)別的。在下時,創(chuàng)建的變量名不受的影響,而且在未指定共享變量時,如果重名就會報錯。要注意的是,下面的代碼會報錯。
前言
只有光頭才能變強。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y
回顧前面:
從零開始學TensorFlow【01-搭建環(huán)境、HelloWorld篇】
什么是TensorFlow?
TensorFlow讀寫數(shù)據(jù)
如何理解axis?
這篇文章主要講講TensorBoard的基本使用以及name_scope和variable_scope的區(qū)別
一、入門TensorBoard首先來講講TensorBoard是什么吧,我當時是在官方文檔里學習的,官網(wǎng)也放出了介紹TensorBoard的視頻。我在b站搜了一把,發(fā)現(xiàn)也有,大家可以先去看看視頻了解一下(其實已經(jīng)說得很好了):
https://www.bilibili.com/video/av35203293?from=search&seid=6605552834229124959
為了更方便 TensorFlow 程序的理解、調(diào)試與優(yōu)化,于是就有了TensorBoard 這樣的的可視化工具
因為我們編寫出來的TensorFlow程序,建好一個神經(jīng)網(wǎng)絡(luò),其實我們也不知道神經(jīng)網(wǎng)絡(luò)里頭具體細節(jié)到底做了什么,要人工調(diào)試十分困難(就好比你無法想象出遞歸的所有步驟一樣)。有了TensorBoard,可以將TensorFlow程序的執(zhí)行步驟都顯示出來,非常直觀。并且,我們可以對訓練的參數(shù)(比如loss值)進行統(tǒng)計,用圖的方式來查看變化的趨勢。
1.1 name_scope和variable_scope在視頻中其實也有提到,我們想要TensorBoard的圖能夠更好地展示(更加有條理),那一般我們需要對其用name_scope取名。
那除了name_scope,還有一個叫做variable_scope。那他們有什么區(qū)別呢?顧名思義,name_scope是一個名稱作用域,variable_scope是變量作用域。
在前面文章中,創(chuàng)建變量有兩種方式,一種是用tf.get_variable()來創(chuàng)建,一種是用tf.Variable()來創(chuàng)建。這兩種創(chuàng)建方式也是有區(qū)別的。
在 tf.name_scope下時,tf.get_variable()創(chuàng)建的變量名不受 name_scope 的影響,而且在未指定共享變量時,如果重名就會報錯。tf.Variable()會自動檢測有沒有變量重名,如果有則會自行處理(自動創(chuàng)建一個)
比如下面的代碼:
with tf.name_scope("name_sp1") as scp1: with tf.variable_scope("var_scp2") as scp2: with tf.name_scope("name_scp3") as scp3: a = tf.Variable("a") b = tf.get_variable("b")
等同于:
with tf.name_scope("name_sp1") as scp1: with tf.name_scope("name_sp2") as scp2: with tf.name_scope("name_scp3") as scp3: a = tf.Variable("a") with tf.variable_scope("var_scp2") as scp2: b = tf.get_variable("b")
這里體現(xiàn)的是如果用get_variable的方式來創(chuàng)建對象,是不受name_scope所影響的。
要注意的是,下面的代碼會報錯。因為在scp作用域下壓根就沒有a這個變量,同時又設(shè)置成reuse=True。這里因為的是找不到共享變量而出錯!
with tf.variable_scope("scp", reuse=True) as scp: a = tf.get_varialbe("a") #報錯
同樣地,下面的代碼也會報錯,因為明明已經(jīng)有共享變量了,但設(shè)置成reuse=false。所以就會報錯。
with tf.variable_scope("scp", reuse=False) as scp: a = tf.get_varialbe("a") a = tf.get_varialbe("a") #報錯
最后,我們再來看這個例子,應該就可以看懂了。
with tf.variable_scope("variable_scope_y") as scope: var1 = tf.get_variable(name="var1", shape=[1], dtype=tf.float32) scope.reuse_variables() # 設(shè)置共享變量 var1_reuse = tf.get_variable(name="var1") var2 = tf.Variable(initial_value=[2.], name="var2", dtype=tf.float32) var2_reuse = tf.Variable(initial_value=[2.], name="var2", dtype=tf.float32) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(var1.name, sess.run(var1)) print(var1_reuse.name, sess.run(var1_reuse)) print(var2.name, sess.run(var2)) print(var2_reuse.name, sess.run(var2_reuse)) # 輸出結(jié)果: # variable_scope_y/var1:0 [-1.59682846] # variable_scope_y/var1:0 [-1.59682846] 可以看到變量var1_reuse重復使用了var1 # variable_scope_y/var2:0 [ 2.] # variable_scope_y/var2_1:0 [ 2.]
參考資料:
https://www.zhihu.com/question/54513728
1.2 TensorBoard例子下面我們來看一個TensorBoard簡單的入門例子,感受一下:
def learn_tensor_board_2(): # prepare the original data with tf.name_scope("data"): x_data = np.random.rand(100).astype(np.float32) y_data = 0.3 * x_data + 0.1 ##creat parameters with tf.name_scope("parameters"): with tf.name_scope("weights"): weight = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) tf.summary.histogram("weight", weight) with tf.name_scope("biases"): bias = tf.Variable(tf.zeros([1])) tf.summary.histogram("bias", bias) ##get y_prediction with tf.name_scope("y_prediction"): y_prediction = weight * x_data + bias ##compute the loss with tf.name_scope("loss"): loss = tf.reduce_mean(tf.square(y_data - y_prediction)) tf.summary.scalar("loss", loss) ##creat optimizer optimizer = tf.train.GradientDescentOptimizer(0.5) # creat train ,minimize the loss with tf.name_scope("train"): train = optimizer.minimize(loss) # creat init with tf.name_scope("init"): init = tf.global_variables_initializer() ##creat a Session sess = tf.Session() # merged merged = tf.summary.merge_all() ##initialize writer = tf.summary.FileWriter("/Users/zhongfucheng/tensorboard/loss-2", sess.graph) sess.run(init) ## Loop for step in range(201): sess.run(train) rs = sess.run(merged) writer.add_summary(rs, step) if __name__ == "__main__": learn_tensor_board_2() # 啟動完了之后,要在命令行上運行tensor_board的命令,指定其目錄,最后我們就可以通過6006的默認端口訪問我們的圖。
(例子來源網(wǎng)絡(luò),我改動了一下,出處我忘了,侵刪~)
接下來,我們啟動一下TensorBoard,看看圖是怎么樣的,啟動命令如下:
tensorboard --logdir=/Users/zhongfucheng/tensorboard/loss-2
啟動成功的圖:
通過6006端口我們?nèi)ピL問一下,首先我們可以檢測到loss值的變更:
我們也可以查看TensorFlow程序大概的執(zhí)行步驟:
參數(shù)w和b的直方圖:
總之,TensorBoard可以方便地查看我們參數(shù)的變化,以便更好理解我們寫的代碼。
參考資料:
https://www.cnblogs.com/tengge/p/6376073.html
https://www.cnblogs.com/fydeblog/p/7429344.html
最后樂于輸出干貨的Java技術(shù)公眾號:Java3y。公眾號內(nèi)有200多篇原創(chuàng)技術(shù)文章、海量視頻資源、精美腦圖,不妨來關(guān)注一下!
覺得我的文章寫得不錯,不妨點一下贊!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43630.html
摘要:保存的路徑構(gòu)建的,可通過獲得我們將的返回值記為,然后在調(diào)用后,將會返回一個當前訓練步數(shù)現(xiàn)在我們就可以使用查看訓練過程了在中輸入如下命令響應在瀏覽器中打開沒錯這就是我們和過程中的情況。 為什么需要TensorBoard 當我們訓練一個deep learning模型時,怎么樣判斷當前是過擬合,還是欠擬合等狀態(tài)呢?實踐中,我們常常會將數(shù)據(jù)集分為三部分:train、validation、tes...
摘要:什么是數(shù)據(jù)流圖使用符號計算圖,這與相似,不過與相比,更簡潔。這兩種元素在數(shù)據(jù)流圖中有自己各自的作用,其中節(jié)點代表對數(shù)據(jù)所做的運算或某種算子。 1.1 什么是數(shù)據(jù)流圖 TensorFlow使用符號計算圖,這與Theano相似,不過與Theano相比,TensorFlow 更簡潔。TensorFlow 的名字本身描述了它自身的執(zhí)行原理: Tensor (張量)意味著N維數(shù)組,F(xiàn)low (流...
當我們構(gòu)建一個深度學習模型時,了解模型的結(jié)構(gòu)和參數(shù)是非常重要的。TensorFlow提供了一種可視化網(wǎng)絡(luò)的編程技術(shù),它可以幫助我們更好地理解模型的結(jié)構(gòu)和參數(shù),從而更好地調(diào)整模型以獲得更好的性能。 TensorFlow提供了一個名為TensorBoard的工具,它可以可視化我們的模型。TensorBoard可以顯示訓練和驗證的損失曲線、模型的結(jié)構(gòu)、參數(shù)分布等信息。在本文中,我們將介紹如何使用Ten...
摘要:測試專用文件夾深度學習使用方法在上面這篇文章中提到了這種調(diào)度的方法。但是報了錯誤。提示中有,估計文章中用的是舊版本的方法我現(xiàn)在用的是,估計原作者用的是版本的改成測試專用文件夾就能成功運行了 D:Python測試專用文件夾logs>tensorboard -logdir=logs usage: tensorboard [-h] [--helpfull] [--logdir PATH] [...
摘要:前言本文基于官網(wǎng)的寫成。是自帶的一個可視化工具,是其中的一個功能,用于在二維或三維空間對高維數(shù)據(jù)進行探索。本文使用數(shù)據(jù)講解的使用方法。 前言 本文基于TensorFlow官網(wǎng)的How-Tos寫成。 TensorBoard是TensorFlow自帶的一個可視化工具,Embeddings是其中的一個功能,用于在二維或三維空間對高維數(shù)據(jù)進行探索。 An embedding is a map ...
閱讀 1452·2023-04-25 19:51
閱讀 1940·2019-08-30 15:55
閱讀 1754·2019-08-30 15:44
閱讀 2710·2019-08-30 13:58
閱讀 2706·2019-08-29 16:37
閱讀 1086·2019-08-29 15:34
閱讀 4023·2019-08-29 11:05
閱讀 2636·2019-08-28 17:51