天天看點

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

一、Tensorboard簡介

Tensorboard是TensorFlow自帶的一個強大的可視化工具,也是一個web應用程式套件。通過将tensorflow程式輸出的日志檔案的資訊可視化使得tensorflow程式的了解、調試和優化更加簡單高效。支援其七種可視化:

  • SCALARS:展示訓練過程中的準确率、損失值、權重/偏置的變化情況
  • IMAGES:展示訓練過程中及記錄的圖像
  • AUDIO:展示訓練過程中記錄的音頻
  • GRAPHS:展示模型的資料流圖,以及各個裝置上消耗的記憶體和時間
  • DISTRIBUTIONS:展示訓練過程中記錄的資料的分布圖
  • HISTOGRAMS:展示訓練過程中記錄的資料的柱狀圖
  • EMBEDDINGS:展示詞向量後的投影分布

界面展示:

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

那如何啟動tensorboard呢?使用是手寫體識别的例子,源碼如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "0"
config = tf.ConfigProto(allow_soft_placement=True)
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=)
config.gpu_options.allow_growth = True

max_steps =   # 最大疊代次數
learning_rate =   # 學習率
dropout =   # dropout時随機保留神經元的比例
data_dir = './MNIST_DATA'  # 樣本資料存儲的路徑
log_dir = './MNIST_LOG'  # 輸出日志儲存的路徑

# 擷取資料集,并采用采用one_hot熱編碼
mnist = input_data.read_data_sets(data_dir, one_hot=True)
sess = tf.InteractiveSession(config=config)

with tf.name_scope('input'):
    x = tf.placeholder(tf.float32, [None, ], name='x-input')
    y_ = tf.placeholder(tf.float32, [None, ], name='y-input')

# 儲存圖像資訊
with tf.name_scope('input_reshape'):
    image_shaped_input = tf.reshape(x, [-, , , ])
    tf.summary.image('input', image_shaped_input, )

# 初始化權重參數
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=)
    return tf.Variable(initial)

# 初始化偏執參數
def bias_variable(shape):
    initial = tf.constant(, shape=shape)
    return tf.Variable(initial)

# 繪制參數變化
def variable_summaries(var):
    with tf.name_scope('summaries'):
        # 計算參數的均值,并使用tf.summary.scaler記錄
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean)

        # 計算參數的标準差
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        # 使用tf.summary.scaler記錄記錄下标準差,最大值,最小值
        tf.summary.scalar('stddev', stddev)
        tf.summary.scalar('max', tf.reduce_max(var))
        tf.summary.scalar('min', tf.reduce_min(var))
        # 用直方圖記錄參數的分布
        tf.summary.histogram('histogram', var)

# 建構神經網絡
def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
    # 設定命名空間
    with tf.name_scope(layer_name):
        # 調用之前的方法初始化權重w,并且調用參數資訊的記錄方法,記錄w的資訊
        with tf.name_scope('weights'):
            weights = weight_variable([input_dim, output_dim])
            variable_summaries(weights)
        # 調用之前的方法初始化權重b,并且調用參數資訊的記錄方法,記錄b的資訊
        with tf.name_scope('biases'):
            biases = bias_variable([output_dim])
            variable_summaries(biases)
        # 執行wx+b的線性計算,并且用直方圖記錄下來
        with tf.name_scope('linear_compute'):
            preactivate = tf.matmul(input_tensor, weights) + biases
            tf.summary.histogram('linear', preactivate)
        # 将線性輸出經過激勵函數,并将輸出也用直方圖記錄下來
        activations = act(preactivate, name='activation')
        tf.summary.histogram('activations', activations)
    # 傳回激勵層的最終輸出
    return activations

hidden1 = nn_layer(x, , , 'layer1')

# 建立dropout層
with tf.name_scope('dropout'):
    keep_prob = tf.placeholder(tf.float32)
    tf.summary.scalar('dropout_keep_probability', keep_prob)
    dropped = tf.nn.dropout(hidden1, keep_prob)

y = nn_layer(dropped, , , 'layer2', act=tf.identity)

# 建立損失函數
with tf.name_scope('loss'):
    # 計算交叉熵損失(每個樣本都會有一個損失)
    diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
    with tf.name_scope('total'):
        # 計算所有樣本交叉熵損失的均值
        cross_entropy = tf.reduce_mean(diff)
    tf.summary.scalar('loss', cross_entropy)

# 使用AdamOptimizer優化器訓練模型,最小化交叉熵損失
with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

# 計算準确率
with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
        # 分别将預測和真實的标簽中取出最大值的索引,弱相同則傳回1(true),不同則傳回0(false)
        correct_prediction = tf.equal(tf.argmax(y, ), tf.argmax(y_, ))
    with tf.name_scope('accuracy'):
        # 求均值即為準确率
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

tf.summary.scalar('accuracy', accuracy)

# summaries合并
merged = tf.summary.merge_all()
# 寫到指定的磁盤路徑中
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')

# 運作初始化所有變量
tf.global_variables_initializer().run()

def feed_dict(train):
    """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
    if train:
        xs, ys = mnist.train.next_batch()
        k = dropout
    else:
        xs, ys = mnist.test.images, mnist.test.labels
        k = 
    return {x: xs, y_: ys, keep_prob: k}

for i in range(max_steps):
    if i %  == :  # 記錄測試集的summary與accuracy
        summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
        test_writer.add_summary(summary, i)
        print('Accuracy at step %s: %s' % (i, acc))
    else:  # 記錄訓練集的summary
        summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
        train_writer.add_summary(summary, i)

train_writer.close()
test_writer.close()
           

在pycharm中執行這段代碼,效果如下:

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

同時,在訓練的時候打開指令行,輸入下面指令,啟動TesnorBoard:

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

這裡生成一個連結位址,複制到遊覽器中檢視各個子產品的内容。

總的來說步驟如下:

  1. 建立writer,寫日志檔案:tf.summary.FileWriter(log_dir + ‘/train’, sess.graph)
  2. 儲存日志檔案:writer.close()
  3. 運作可視化指令,啟動服務:tensorboard –logdir /path/
  4. 打開可視化界面,通過浏覽器打開伺服器通路端口http://xxx.xxx.xxx.xxx:6006

二、SCALARS面闆

SCALARS 面闆,統計tensorflow中的标量(如:學習率、模型的總損失)随着疊代輪數的變化情況。SCALARS 面闆的左邊是一些選項,包括Split on undercores(用下劃線分開顯示)、Data downloadlinks(資料下載下傳連結)、Smoothing(圖像的曲線平滑程度)以及Horizontal Axis(水準軸)的表示,其中水準軸的表示分3 種(STEP 代表疊代次數,RELATIVE 代表按照訓練集和測試集的相對值,WALL 代表按照時間)。圖中右邊給出了準确率變化曲線。

如下圖二所示,SCALARS欄目顯示通過函數tf.summary.scalar()記錄的資料的變化趨勢。如下所示代碼可添加到程式中,用于記錄學習率的變化情況。

tf.summary.scalar('accuracy', accuracy)
           
TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

SCALARS 面闆中還繪制了每一層的偏置(biases)和權重(weights)的變化曲線,包括每

次疊代中的最大值、最小值、平均值和标準差,如下圖,layer1層:

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

layer2層:

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

建構損失曲線:

tf.summary.scalar('loss', cross_entropy)
           
TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

三、IMAGES面闆

圖像儀表盤,可以顯示通過tf.summary.image()函數來儲存的png圖檔檔案。

1. # 指定圖檔的資料源為輸入資料x,展示的相對位置為[-1,28,28,1] 
2. image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
3. # 将input命名空間下的圖檔放到summary中,一次展示10張 
4. tf.summary.image('input', image_shaped_input , 10) 
           

如上面代碼,将輸入資料中的png圖檔放到summary中,準備後面寫入日志檔案。運作程式,生成日志檔案,然後在tensorboard的IMAGES欄目下就會出現如下圖一所示的内容(實驗用的是mnist資料集)。儀表盤設定為每行對應不同的标簽,每列對應一個運作。圖像儀表盤僅支援png圖檔格式,可以使用它将自定義生成的可視化圖像(例如matplotlib散點圖)嵌入到tensorboard中。該儀表盤始終顯示每個标簽的最新圖像。

IMAGES面闆展示訓練過程中及記錄的圖像,下圖展示了資料集合測試資料經過處理後圖檔的樣子:

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

四、AUDIO

AUDIO 面闆是展示訓練過程中處理的音頻資料。可嵌入音頻的小部件,用于播放通過tf.summary.audio()函數儲存的音頻。一個音頻summary要存成 的二維字元張量。其中,k為summary中記錄的音頻被剪輯的次數,每排張量是一對[encoded_audio, label],其中,encoded_audio 是在summary中指定其編碼的二進制字元串,label是一個描述音頻片段的UTF-8編碼的字元串。

儀表盤設定為每行對應不同的标簽,每列對應一個運作。該儀表盤始終嵌入每個标簽的最新音頻。

五、GRAPHS

GRAPHS 面闆是對了解神經網絡結構最有幫助的一個面闆,它直覺地展示了資料流圖。下圖所示界面中節點之間的連線即為資料流,連線越粗,說明在兩個節點之間流動的張量(tensor)越多。

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

在GRAPHS 面闆的左側,可以選擇疊代步驟。可以用不同Color(顔色)來表示不同的Structure(整個資料流圖的結構),或者用不同Color 來表示不同Device(裝置)。例如,當使用多個GPU 時,各個節點分别使用的GPU 不同。當我們選擇特定的某次疊代時,可以顯示出各個節點的Compute time(計算時間)以及Memory(記憶體消耗)。

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

六、DISTRIBUTIONS

DISTRIBUTIONS 面闆和接下來要講的HISTOGRAMS 面闆類似,隻不過是用平面來表示來自特定層的激活前後、權重和偏置的分布,它顯示了一些分發的進階統計資訊。

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

七、HISTOGRAMS

HISTOGRAMS面闆,統計tensorflow中的張量随着疊代輪數的變化情況。它用于展示通過tf.summary.histogram記錄的資料的變化趨勢。如下代碼所示:

# 用直方圖記錄參數的分布
tf.summary.histogram('histogram', var)

# 執行wx+b的線性計算,并且用直方圖記錄下來
tf.summary.histogram('linear', preactivate)

# 将線性輸出經過激勵函數,并将輸出也用直方圖記錄下來
tf.summary.histogram('activations', activations)
           

上述代碼将神經網絡中某一層的參數分布、線性計算結果、經過激勵函數的計算結果資訊加入到日志檔案中,運作程式生成日志後,啟動tensorboard就可以在HISTOGRAMS欄目下看到對應的展開圖像。

HISTOGRAMS 主要是立體地展現來自特定層的激活前後、權重和偏置的分布。

TensorFlow學習筆記(二)之可視化(Tensorboard)一、Tensorboard簡介二、SCALARS面闆三、IMAGES面闆四、AUDIO五、GRAPHS六、DISTRIBUTIONS七、HISTOGRAMS八、EMBEDDINGS

八、EMBEDDINGS

EMBEDDINGS 面闆展示的是詞嵌入投影儀。(後續做詞嵌入的時候更新上…….)

繼續閱讀