1. 程式人生 > >[TensorFlow]使用Tensorboard實現神經網路視覺化

[TensorFlow]使用Tensorboard實現神經網路視覺化

主旨

視覺化是深度學習神經網路開發、除錯、應用中極為重要的手段。Tensorboard是Tensorflow提供的一個視覺化工具,本文通過實際程式碼實驗的方式說明使用TensorBoard實現記錄變數,實現視覺化除錯的目的。

原始碼

我的GitHub中TF_Graph專案, singleNerualNode.py

網路結構

TensorBoard基本呼叫方法

  • 網路結構定義中將所有輸出到tf.summary的變數合併到一個Tensor
merged = tf.summary.merge_all()
  • 建立Writer
  log_path =  "tf_writer"
writer = tf.summary.FileWriter(log_path, sess.graph)
  • 在訓練中計算merged Tensor,並輸出到writer
  for iterIdx in range(iterationNumber):
    sess.run(train_step, feed_dict={inputTensor: inputData, labelTensor:labels})
    summary = sess.run(merged, feed_dict={inputTensor: inputData, labelTensor:labels})
    writer.add
_summary(summary, iterIdx) #flush to disk every 50 iteration if iterIdx % 50 == 0: writer.flush() writer.close()
  • 啟動TensorBoard,在shell輸入如下命令

    tensorboard –logdir tf_writer
    注:’tf_writer’是我的log_path, 實際使用中根據儲存Log的位置調整

  • 從瀏覽器中訪問
    開啟瀏覽器訪問http://192.168.1.100:6006/,其中’192.168.1.100’是執行Tensorboard的計算機IP地址,可以是本機,也可以是網路上的伺服器,能訪問到就行。

標量(Scalar)的輸出

區別於矩陣和向量,標量可以認為只有1個維度的數值量。

在神經網路中,損失函式的值、模型預測準確率等都是典型的標量。如下是計算損失函式和模型預測準確率的程式碼。

  with tf.name_scope('evaluation'):
    loss = tf.nn.l2_loss(a - labels, name='L2Loss') / batchSize
    threshold = 0.5 
    binary_outputs = a >= threshold
    binary_labels = labels >= threshold
    correct_item = tf.equal(binary_outputs, binary_labels)
    accuracy = tf.reduce_mean(tf.cast(correct_item, tf.float32))

對於這些變數,我們最典型的需求是知道每一輪模型訓練迭代中,其朝著哪個方向變化,是否達到收斂狀態。使用Tensorboard,只要新增以下程式碼就可以實現

  tf.summary.scalar('L2Loss',loss)
  tf.summary.scalar('Accuracy', accuracy)

在Tensorboard中看到的結果如下,Accuracy和L2 Loss分別記錄在兩張圖表中,每張圖的橫座標表示迭代序號(第幾次訓練),縱座標就是我們新增的標量結果
這裡寫圖片描述

以Accuracy為例,放大觀察
這裡寫圖片描述

Tensorboard會記錄每個點的名稱、平滑後取值、原始值、Step(迭代序號)、時間戳和相對於訓練開始過了多長時間。這些資訊對於視覺化的觀察模型收斂情況非常有幫助。

多維張量(Tensor)的輸出

標量(scalar)在Tensor Flow的神經網路中只佔很少一部分,大部分變數是多維張量,即Tensor。由於一個Tensor有多個維度,無法像標量一樣直接輸出成曲線,在視覺化時可以有以下幾種方法:

  1. 將Tensor轉化為標量輸出
  2. 輸出Tensor的分佈直方圖
  3. 如果Tensor本身是圖形(即以[batch, height, weight, channel]格式的圖片),以圖片形式輸出

第一種,在TensorBoard的官方教程中給出了清晰的示意程式碼。給定一個Tensor,如下函式從均值、標準差、最大值、最小值等多個角度轉化為標量,從而視覺化。由於標量的視覺化效果前一節已經展示過了,這裡不在重複。

def variable_summaries(var):
  """Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
  with tf.name_scope('summaries'):
    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.scalar('stddev', stddev)
    tf.summary.scalar('max', tf.reduce_max(var))
    tf.summary.scalar('min', tf.reduce_min(var))

第二種,以直方圖輸出,輸出方法非常簡單,按照下列程式碼的方式呼叫tf.summary.histogram即可

  with tf.name_scope('Nerual_Node'):
    W = tf.Variable(tf.random_normal([numberOfInputDims, 1]), name='weights')
    tf.summary.histogram('weights', W)
    b = tf.Variable(tf.zeros([1]), name='biases')
    tf.summary.histogram('biases', b)

問題的難點在於如何理解直方圖的輸出,直方圖的輸出形式如下
這裡寫圖片描述

放大其中bias這張圖
這裡寫圖片描述

這張圖垂直於螢幕的方向,即高亮的一行顯示822則個資料所在的座標軸,是迭代次數序號。隨著訓練迭代次數由0到最大迭代次數(這裡設定為1000)訓練,bias的分佈由遠及近畫出來。

關鍵問題是“bias的分佈”指的是什麼,根據程式碼bias本身定義為1維Tensor:b = tf.Variable(tf.zeros([1]), name=’biases’),一個Batch定義為1000,那麼b可以視為具有1000個元素的一維陣列,上圖每個橫截面給出的是這1000個元素的概率分佈。

帶著這個結論,接下來考察更復雜的多維Tensor的直方圖:weight
這裡寫圖片描述
weight本身定義維2*1 Tensor,每個batch定義為1000個樣本
W = tf.Variable(tf.random_normal([numberOfInputDims, 1]), name='weights')
則直方圖代表的是總數為2*1*1000個取值的分佈。

我們將W設計維2*1,是為了儲存兩個輸入節點分別的權重:w_1和w_2。在上述直方圖分佈中,確實可以清晰的看到W的分佈呈現雙峰分佈,這兩個峰分別對應w_1和w_2。隨著訓練次數的增加,w_1和w_2相距越來越遠,這和訓練目標是實現線性分類是吻合的。

Embedding

除了前文描述的標量和Tensor輸出之外,視覺化還包括觀察大量資料的分佈。這裡大量資料可以是輸入、輸出資料,也可以是網路中的任意引數。

Google對此有一篇專門的論文,其中Introduction對於Embedding的定義和作用有清晰的描述,筆者嘗試翻譯如下

embedding是從輸入資料點到歐式空間中點的對映,為了理解模型的行為特徵,機器學習的研發人員經常需要探索某個特定的Embedding。例如做音樂推薦系統的工程師建立了一個歌曲的embedding,他可能需要驗證”Stairway to Heaven”這支歌曲最近的鄰居包括“Whole Lotta Love”但不包括”Let it Go”. 對於這樣的使用者,從Embedding的幾何結構獲得理解就很關鍵。

具體到我們的案例,假定我想知道輸入資料的幾何分佈,使用如下程式碼實現。

from tensorflow.contrib.tensorboard.plugins import projector
  ....
  embedding_var = tf.Variable(inputData, 'data_embeding')
  config = projector.ProjectorConfig()
  embedding = config.embeddings.add()
  embedding.tensor_name = embedding_var.name
  embedding.metadata_path = 'label.csv'
  projector.visualize_embeddings(tf.summary.FileWriter(log_path), config)

Embedding還必須依賴於模型的儲存,在定義網路結構中,需要定義saver如下

  all_vars = tf.global_variables()
  saver = tf.train.Saver(all_vars)

在模型訓練中,必須儲存訓練結果

  for iterIdx in range(iterationNumber):
    sess.run(train_step, feed_dict={inputTensor: inputData, labelTensor:labels})
    .....
    saver.save(sess, model_path)

上述工作完成後,執行得到如下圖形
這裡寫圖片描述

從圖形左側逐一解釋,首先左上部分要選擇資料和顏色,我們整個網路中只添加了一個Embedding Tensor,因此不用特殊選定,顏色算則Label即可,即根據label檔案不同的標籤標識顏色。

左下部有三張選項卡,s_TNE/PCA/Custom,預設為PCA。這裡使用PCA是為了把高維Tensor降低到3維,以方便視覺化。但我們此次實驗的資料,扣除表示batch的維度,只有2維,因此PCA的輸出就是資料的X、Y座標,同時不需要顯示Z軸。

右側是實際圖形,圖中可以清晰的看到訓練資料的線性可分性質。

由於Tensorflow在Embedding的文件本身較少,筆者寫作這一節內容時參考了大量網路資料,特別感謝以下這Link的回答者Ehsan和Albert X.W.

相關推薦

[TensorFlow]使用Tensorboard實現神經網路視覺

主旨 視覺化是深度學習神經網路開發、除錯、應用中極為重要的手段。Tensorboard是Tensorflow提供的一個視覺化工具,本文通過實際程式碼實驗的方式說明使用TensorBoard實現記錄變數,實現視覺化除錯的目的。 原始碼 我的GitHub中

tensorflow實現神經網路(lstm)如何使實驗復現或固定權值

1.固定隨機種子 tf.set_random_seed(2) 或者在程式碼的頂端其他之前要有下面四行程式碼 from numpy.random import seed seed(1) from t

神經網路視覺(Visualization of Neural Network )

神經網路視覺化和可解釋性(Visualization and Explanation of Neural Network ) 相對於傳統的ML模型,Deep NN由於其自身所特有的多層非線性的結構而導致難以對其工作原理進行透徹的理解。比如,我們很難理解網路將一個

Tensorflow入門-實現神經網路

學習tensorflow一段時間了,感覺非常的好用,在使用時,有時候最重要的是想好神經網路的結構,這樣就可以隨意的在神經網路中加如隱含層了,特別主要的是矩陣的維度相乘的問題,下面將使用tensorflow實現神經網路,做一下自己的理解. 實現無隱含層的神經網路

深度學習小白——卷積神經網路視覺(二)

一、由卷積後的code得到原始影象 可以看出隨著卷積網路的進行,越來越多的資訊被扔掉了,能還原除的資訊也就越少。 二、Deep Dream google發明的起初是用來看神經網路各層在“看”什麼,後來因為得到的影象很具有藝術感,所以成為了一個藝術圖片生成器。 這是一

神經網路神經網路視覺工具

t-SNE  方法:在fc7(倒數第一層fc)提取輸出,並用歐氏距離遠近展示(或聚類)。好的網路可以直觀看到同分類的圖片聚在一起,幾何上易被切割出來。 一個例子: Visualizing Activations 方法:     1. 逆向使用已訓練好的神經網路生成圖

卷積神經網路視覺:以Keras處理貓圖片為例

眾所周知,在過去幾年裡,深度學習領域裡的很多主要突破都來源於卷積神經網路(CNN 或者 ConvNet),但對大多數人來說卷積神經網路是一個非常不直觀的推斷過程。我一直想剖析卷積神經網路的各個部分,看看它在每個階段的影象處理結果是怎樣的,而本篇文章就是我的方法簡述。 從高層來看卷積神經網路 首先,卷積神

Keras中神經網路視覺模組keras.utils.visualize_util 的安裝

一、Keras中提供了一個神經網路視覺化的函式plot,並可以將視覺化結果儲存在本地。plot使用方法如下: from keras.utils.visualize_util import plot

神經網路視覺

    目前,對於神經網路每一層的輸出,只是有一個大致的瞭解。低層的神經網路提取的是一般的、具有普適性的紋理,高層的神經網路層提取的是一些和task相關的、特殊的全域性特徵。每一層的輸出結果是怎麼作用到最終的輸出,以及如何藉助每一層的特徵對神經網路進行優化。這些問題還是需要進

Keras中神經網路視覺模組keras.utils.visualize_util安裝配置方法

Keras中提供了一個神經網路視覺化的函式plot,並可以將視覺化結果儲存在本地。plot使用方法如下: from keras.utils.visualize_util import plot plot(model, to_file='model.png') 注:筆者使用的Keras版本是1.0.6 不

神經網路卷積層的實現原理與視覺其過程 (caffe為例)

caffe中卷積層的實現 1 caffe卷積前向傳播 caffe前向傳播涉及到的類主要如下: 首先卷積層conv_layer.cpp中的Fprward進行前向傳播,呼叫父類base_conv_layer.cpp中的forward進行前向傳播,該函式

tensorflow 實現神經網路帶正則

import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import datasets from tensorflow.python.framework

利用tensorflow實現神經網路卷積層、池層、全連線層

第一步:匯入相應的庫import tensorflow as tf import numpy as np12第二步:準備資料(隨機生成一維資料)data_size=25 x_data=np.random.normal(size=data_size) x_input_1d=

使用tensorflow搭建一個神經網路實現一個分類問題

工欲善其事必先利其器,首先,我們來說說關於環境搭建的問題。 安裝的方法有一萬種,但是我還是推薦下面這種安裝方法,簡單方便,不會出現很多莫名其妙的問題。 Anaconda + Jupyter + tensorflow 安裝的具體流程見下面的視訊連結: https://www.youtube.com/watc

基於Pytorch實現網路視覺(CS231n assignment3)

       這篇部落格主要是對CS231n assignment3中的網路視覺化部分進行整理。我使用的是Pytorch框架完成的整個練習,但是和Tensorflow框架相比只是實現有些不一樣而已,數學原理還是一致的。     &nbs

tensorflow實現神經網路

tensorflow實現神經網路 1、全部步驟 實現前向傳播 宣告學習率 引數進行正則化計算 計算損失函式 反向傳播 引數進行滑動平均 2、各個步驟解釋 前向傳播:主要是定義這個網路的結構,網路是幾層的,以及每層使用的啟用函式是

tensorflow神經網路結構視覺

藉助 tensorboard 實現tensorflow中定義的深度神經網路視覺化。 在程式中實現網路視覺化,只需要在載入網路之後,加上這一句: summary_writer = tf.summary.FileWriter('./log/', sess.graph)

例子:tensorflow實現神經網路

add_layer 功能 首先,我們匯入本次所需的模組。 import tensorflow as tf import numpy as np 構造新增一個神經層的函式 def add_layer(inputs, in_size, out_size, activation_

Tensorflow卷積神經網路實現MNIST手寫資料集識別

模型建的不好,最終只有85%左右的準確率,後面繼續改進吧   #卷積神經網路API     卷積層:tf.nn.conv2d(input,    #輸入張量,具有[batch, height, width, chann

Tensorflow】Python實現神經網路迴歸

環境 macOS,python3.6,tensorflow1.1.0 迴歸問題 年份 事故起數 死亡人數 受傷人數 直接財產損失(萬元) 2003 80