tensorflow tensorboard使用方法、應用場景和常見問題

 

詳細介紹:

 

 

基礎操作兩方面:

第一方面:“製作”各種標量、記錄節點,圖標、圖片等的記錄彙集,sess.run從計算圖得到一次彙集的記錄。

關於sess.run(merged),可以把這個也當做計算圖中得到了一個結果,只是不同用途。既然是計算圖,就少不了要feed數據,feed的數據不同,得到的結果也就不同,如果使用了錯誤的feed數據,很可能得到的繪製結果也不符合預期,下邊會有例子介紹!

剩下的也就是scalar和histgram對tensor形狀的要求不同,輸入錯了自然報錯(手動滑稽),image的話,也要先reshape到合適的形狀。

 

第二方面:利用本graph初始化writer,把sess.run得到的記錄通過writer寫入文件,關閉writer。

唯一注意的就是那個global_step的意義,這個step也就是繪製圖標的橫軸座標了,如果用普通的i,如果斷點續訓從頭開始計算,那麼圖標也就繪製爛了,所以最好是用有記錄的global_step,能夠保證斷點續訓的圖片繪製完整。

tf.summary.scalar/image/histogram()
merged = tf.summary.merge_all()
summary = sess.run(merged)

writer = tf.summary.FileWriter(logdir, graph=sess.graph)
writer.add_summary(summary, global_step=i)
writer.close()

 

 

兩種合併方法,第一種全合併,比較簡單;第二種指定,精簡,比如同時觀察訓練集和測試集的準確率,參數之類的不需要也顯示兩份。

summary_ce = tf.summary.scalar('cross_entropy', cross_entropy)
summary_accuracy = tf.summary.scalar('accuracy', accuracy)

merged = tf.summary.merge_all()
test_merged = tf.summary.merge(inputs=[summary_ce,summary_accuracy])

 

特殊用法:

同時顯示訓練集和測試集曲線

用兩個writer,指定兩個路徑,分別記錄訓練集和測試集的準確率,運行tensorboard同時讀取兩個event文件。

 

#tensorboard --logdir = event1:"dir1",eventrun2:"dir2"

 

應用場景

應用:對比測試集與訓練集的準確率

如果是帶dropout的訓練,不要在train同時得到accuracy,會出現準確率倒掛,訓練準確率低於測試準確率(藍線).

 

 

改完了也不能明顯看到“訓練準確率高於測試準確率”的情況

也有一方面原因是conv解MNIST太簡單了,拉不開差距,test用的batch太小了,不容易反應整體,拉不開差距,因爲機器性能的限制,一次不能運行整個測試集,summary是拿tensor,是tensor就得feed數據,feed數據就有size限制,又不可以在python裏自己做循環和平均,這是個問題。

問題:兩個event的顯示顏色不如人意

因爲運行參數等於dict形式,training排在testing後邊,所以顏色調轉。自己改改名字就好了

 

應用:利用命名空間分類查看

變量太多的時候,看起來會很混亂,使用命名空間就很有用了。

例如第二個FC對應的BN層,先get到tensor,然後把tensor添加到histogram,命名,加bf_fc2前綴

        gamma = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/gamma:0')
        beta = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/beta:0')
        moving_mean = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/moving_mean:0')
        moving_variance = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/moving_variance:0')

        tf.summary.histogram('bn_fc2/gamma', gamma)
        tf.summary.histogram('bn_fc2/beta', beta)
        tf.summary.histogram('bn_fc2/moving_mean', moving_mean)
        tf.summary.histogram('bn_fc2/moving_variance', moving_variance)

 

應用:增加GRAPH可讀性

大多數時候,計算圖中,除了主流程,還會有各種依賴關係和邊角操作,增加圖像複雜度,降低可讀性,可以把無關操作從圖中去除。

 

 

應用:驗證ReLU“最優”bias初始值

初學可能不知道bias改初始化成什麼,看過些代碼可能認爲biases初始化爲0.1合適,但是不看圖是不知道爲什麼的。

通過tensorboard打印biases的分佈,可以看到想要的答案。

如下:兩層conv(32,64),ReLU激活,兩層fc(包括輸出層,1024,10),識別MNIST。

W初始化0,b初始化0.1,W的分佈很穩的在0附近。

batch=256,20000步,b有所下降,但是也沒接近0

其他不動,biases初始化變成0.2

其實按比例看的話,0.2和0.1趨勢差異並不明顯,因爲我也沒空無限訓練下去,20k截止。

初始化biases爲0.0:

也沒什麼上升趨勢,證明0.1不一定代表最優,但是這個模型也只是個例。總之,訓練之後的biases比較趨近0~0.2這個範圍

雖然初始0也沒上升到0.1的趨勢,但是也不能用0,0有另一個缺點,ReLU負軸輸出0,正軸斜率是1,w和b都是0的話,正反都輸出0,不利於訓練。

biases初始化0.0和0.1的各層輸出分佈:不能從圖形上直接說0.0很不好,但是對比0.1,仔細看縱座標,確實0.1的初始化初期輸出的分佈更廣泛一些,而訓練之後的輸出分佈,也是趨向於更寬泛。

 

準確率變化區別不明顯 

 

前邊用的ReLU(0.1針對ReLU),作爲對比,用sigmoid試一下(縮減步數):

初始化0.0(有變負數趨勢)

初始化0.1(第一層有明顯的變負趨勢,後邊不明顯)

 

結論:

所以,0.1是一個自然選擇,並且人工trade-off的值。

第一層影響比較大,趨勢明顯,後邊的逐漸不明顯,如果有BN,可能進一步衰減。

 

考慮到模型寬容度過高,很早準確率就封頂,實驗效果也不好,還有不同的模型,複雜模型和簡單模型也不一樣,情況太多,沒法測完,有機會再完善。

 

 

 

 

 

 

 

但是很明顯,0.1也不是真理,每一個模型,每一層,都多少有些不一樣。

todo:更進一步,爲什麼恰巧是0.1?可以觀察用不同的數據集不同的標籤,比如20個標籤或者5個標籤,是否都是0.1附近最優?

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章