天天看點

tensorflow----tensorboard之histogram與distributionstf.summary.histogram直方圖模式distributions顯示内容解析

https://blog.csdn.net/akadiao/article/details/79551180

https://blog.csdn.net/wgj99991111/article/details/84708255

在訓練神經網絡時,當需要檢視一個張量在訓練過程中值的分布情況時,可通過tf.summary.histogram()将其分布情況以直方圖的形式在TensorBoard直方圖儀表闆上顯示.

tf.summary.histogram

tf.summary.histogram():

輸出一個直方圖的Summary protocol buffer .

參數

name:生成的節點名稱.作為TensorBoard中的一個系列名稱.

values:一個實數張量.用于建構直方圖的值.

collections:圖形集合鍵的可選清單.添加新的summary操作到這些集合中.預設為GraphKeys.SUMMARIES.

family: summary标簽名稱的字首,用于在Tensorboard上顯示的标簽名稱.(可選項)

tf.summary.histogram()将輸入的一個任意大小和形狀的張量壓縮成一個由寬度和數量組成的直方圖資料結構.假設輸入 [0.5, 1.1, 1.3, 2.2, 2.9, 2.99],則可以建立三個bin,分别包含0-1之間/1-2之間/2-3之間的所有元素,即三個bin中的元素分别為[0.5]/[1.1,1.3]/[2.2,2.9,2.99].

這樣,通過可視化張量在不同時間點的直方圖來顯示某些分布随時間變化的情況.

示例

以下為tensorflow文檔中提供的示例.在該例子中每次建立一個均值變化的正态分布(采樣1000次),标準差為1,均值随循環次數的增加而增加.在直方圖中可以看到每步均值的變化.

#!/usr/bin/python
# coding:utf-8

# TensorBoard直方圖儀表闆
import tensorflow as tf
k = tf.placeholder(tf.float32)
# 建立一個均值變化的正态分布(由0到5左右)
mean_moving_normal = tf.random_normal(shape=[1000], mean=(5*k), stddev=1)
# 将該分布記錄到直方圖彙總中
tf.summary.histogram("normal/moving_mean", mean_moving_normal)
sess = tf.Session()
writer = tf.summary.FileWriter("/tmp/histogram_example")
summaries = tf.summary.merge_all()
# 設定一個循環并将摘要寫入磁盤
N = 400
for step in range(N):
    k_val = step/float(N)
    summ = sess.run(summaries, feed_dict={k: k_val})
    writer.add_summary(summ, global_step=step)
           

通過在終端輸入:

tensorboard --logdir=/tmp/histogram_example
           

可以在TensorBoard中檢視結果.

直方圖模式

其中,直方圖模式有兩種:OVERLAY和OFFSET.

OFFSET模式:

tensorflow----tensorboard之histogram與distributionstf.summary.histogram直方圖模式distributions顯示内容解析

其中,橫軸表示值,縱軸表示數量,每個切片顯示一個直方圖,切片按步驟(步數或時間)排列;舊的切片較暗,新的切片顔色較淺.如圖,可以看到在第393步時,以4.91為中心的bin中有161個元素.

另外,直方圖切片并不總是按步數或時間均勻分布,而是通過水塘抽樣/reservoir sampling來抽取所有直方圖的一個子集,以節省記憶體.

OVERLAY模式:

tensorflow----tensorboard之histogram與distributionstf.summary.histogram直方圖模式distributions顯示内容解析

其中,橫軸表示值,縱軸表示數量.各個直方圖切片不再展開,而是全部繪制在相同的y軸上.這樣不同的線表示不同的步驟(步數或時間).如圖,可以看到在第5步時,以0.11為中心的bin中有183個元素.

OVERLAY模式用于直接比較不同直方圖的計數.

多模式分布

直方圖儀表闆非常适合可視化多模式分布,通過連接配接兩個不同正态分布(一個移動均值的正态分布和一個縮小方差的正态分布)的輸出來構造一個簡單的雙峰分布.如下所示:

#!/usr/bin/python
# coding:utf-8

import tensorflow as tf
k = tf.placeholder(tf.float32)
# 建立一個均值變化的正态分布
mean_moving_normal = tf.random_normal(shape=[1000], mean=(5*k), stddev=1)
# 将該分布記錄到直方圖summary中
tf.summary.histogram("normal/moving_mean", mean_moving_normal)
# 建立一個方差遞減的正态分布
variance_shrinking_normal = tf.random_normal(shape=[1000], mean=0, stddev=1-(k))
# 記錄配置設定
tf.summary.histogram("normal/shrinking_variance", variance_shrinking_normal)
# 将兩種分布組合成一個資料集
normal_combined = tf.concat([mean_moving_normal, variance_shrinking_normal], 0)
# 添加另一個直方圖summary來記錄組合分布
tf.summary.histogram("normal/bimodal", normal_combined)
summaries = tf.summary.merge_all()
# 設定會話和摘要作者
sess = tf.Session()
writer = tf.summary.FileWriter("/tmp/histogram_example")
# 設定一個循環并将摘要寫入磁盤
N = 400
for step in range(N):
    k_val = step/float(N)
    summ = sess.run(summaries, feed_dict={k: k_val})
    writer.add_summary(summ, global_step=step)
           

可以得到兩組單獨的正太分布和連接配接起來後形成的一組雙峰結構分布的圖表.

tensorflow----tensorboard之histogram與distributionstf.summary.histogram直方圖模式distributions顯示内容解析

distributions顯示内容解析

distributions圖和histogram圖顯示的資料源是相同的,隻是用不同的方式對相同的内容進行展示。在網上找了很久也沒要找到關于distributions圖的詳解,下面寫寫自己對該圖的了解:

tensorflow----tensorboard之histogram與distributionstf.summary.histogram直方圖模式distributions顯示内容解析

該圖的橫坐标為訓練的次數,縱坐标為權重值的取值範圍,圖中首先從整體上顯示了在訓練過程中權重值的取值範圍,然後用不同的顔色表示取某個區域值的頻次,顔色越深表示出現的頻次越多。從上圖可以看出,該權重值在0附近顔色最深,也就是說在0附近這個區域權重值的取值頻次最高。

繼續閱讀