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