TensorBoard的使用

TensorBoard是TensorFlow官方推出的可視化工具尺栖,它可以將模型訓練過程中的各種匯總數(shù)據(jù)展示出來决瞳。我們在使用TensorFlow訓練大型深度學習神經(jīng)網(wǎng)絡時皮胡,中間的計算過程可能非常復雜赏迟,可以使用TensorBoard觀察訓練過程中的各種可視化數(shù)據(jù)锌杀。它的流程是糕再,在執(zhí)行TensorFlow計算圖的過程中突想,將各種類型的數(shù)據(jù)匯總并記錄到日志文件中。然后使用TensorBoard讀取這些日志文件袭灯,解析數(shù)據(jù)并生成數(shù)據(jù)可視化Web頁面稽荧。

用一個MNIST數(shù)據(jù)集的手寫字體識別姨丈,看一下各種類型數(shù)據(jù)的匯總和展示构挤。

先說一下我的環(huán)境筋现,我用的是Cuda9.0+Ubuntu16.04+Tensorflow-gpu1.12+Python3.6矾飞。

訓練過程

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

max_steps=1000

learning_rate=0.001

dropout=0.9

data_dir='/tmp/tensorflow/mnist/input_data'

#匯總數(shù)據(jù)的日志存放地址

log_dir='/tmp/tensorflow/mnist/logs/mnist_with_summaries'

? # Import data

mnist = input_data.read_data_sets(data_dir,one_hot=True)

sess = tf.InteractiveSession()

? # Create a multilayer model.

? # Input placeholders

with tf.name_scope('input'):

? x = tf.placeholder(tf.float32, [None, 784], name='x-input')

? y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')

with tf.name_scope('input_reshape'):

? image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])

? tf.summary.image('input', image_shaped_input, 10)

? # We can't initialize these variables to 0 - the network will get stuck.

def weight_variable(shape):

? """Create a weight variable with appropriate initialization."""

? initial = tf.truncated_normal(shape, stddev=0.1)

? return tf.Variable(initial)

def bias_variable(shape):

? """Create a bias variable with appropriate initialization."""

? initial = tf.constant(0.1, shape=shape)

? return tf.Variable(initial)

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))

#直接記錄變量var的直方圖數(shù)據(jù)

? ? tf.summary.histogram('histogram', var)

def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):

? """Reusable code for making a simple neural net layer.

? It does a matrix multiply, bias add, and then uses relu to nonlinearize.

? It also sets up name scoping so that the resultant graph is easy to read,

? and adds a number of summary ops.

? """

? # Adding a name scope ensures logical grouping of the layers in the graph.

? with tf.name_scope(layer_name):

? ? # This Variable will hold the state of the weights for the layer

? ? with tf.name_scope('weights'):

? ? ? weights = weight_variable([input_dim, output_dim])

? ? ? variable_summaries(weights)

? ? with tf.name_scope('biases'):

? ? ? biases = bias_variable([output_dim])

? ? ? variable_summaries(biases)

? ? with tf.name_scope('Wx_plus_b'):

? ? ? preactivate = tf.matmul(input_tensor, weights) + biases

? ? ? tf.summary.histogram('pre_activations', preactivate)

? ? activations = act(preactivate, name='activation')

? ? tf.summary.histogram('activations', activations)

? ? return activations

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

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)

? # Do not apply softmax activation yet, see below.

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

with tf.name_scope('cross_entropy'):

? ? # The raw formulation of cross-entropy,

? ? #

? ? # tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.softmax(y)),

? ? #? ? ? ? ? ? ? ? ? ? ? ? ? ? ? reduction_indices=[1]))

? ? #

? ? # can be numerically unstable.

? ? #

? ? # So here we use tf.nn.softmax_cross_entropy_with_logits on the

? ? # raw outputs of the nn_layer above, and then average across

? ? # the batch.

? diff = tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)

? with tf.name_scope('total'):

? ? cross_entropy = tf.reduce_mean(diff)

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

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'):

? ? correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

? with tf.name_scope('accuracy'):

? ? accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

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

? # Merge all the summaries and write them out to /tmp/mnist_logs (by default)

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()

? # Train the model, and also write summaries.

? # Every 10th step, measure test-set accuracy, and write test summaries

? # All other steps, run train_step on training data, & add training summaries

def feed_dict(train):

? """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""

? if train:

? ? xs, ys = mnist.train.next_batch(100)

? ? k = dropout

? else:

? ? xs, ys = mnist.test.images, mnist.test.labels

? ? k = 1.0

? return {x: xs, y_: ys, keep_prob: k}

saver = tf.train.Saver()

for i in range(max_steps):

? if i % 10 == 0:? # Record summaries and test-set 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:? # Record train set summaries, and train

? ? if i % 100 == 99:? # Record execution stats

? ? ? run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)

? ? ? run_metadata = tf.RunMetadata()

? ? ? summary, _ = sess.run([merged, train_step],

? ? ? ? ? ? ? ? ? ? ? ? ? ? feed_dict=feed_dict(True),

? ? ? ? ? ? ? ? ? ? ? ? ? ? options=run_options,

? ? ? ? ? ? ? ? ? ? ? ? ? ? run_metadata=run_metadata)

? ? ? train_writer.add_run_metadata(run_metadata, 'step%03d' % i)

? ? ? train_writer.add_summary(summary, i)

? ? ? saver.save(sess, log_dir+"/model.ckpt", i)

? ? ? print('Adding run metadata for', i)

? ? else:? # Record a summary

? ? ? summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))

? ? ? train_writer.add_summary(summary, i)

train_writer.close()

test_writer.close()

可視化效果

切換到Linux命令行下,執(zhí)行TensorBoard程序括尸,并通過--logdir指定TensorFlow日志路徑濒翻,然后就可以自動生成所有匯總數(shù)據(jù)可視化的結果了有送。

tensorboard --logdir=/tmp/tensorflow/mnist/logs/mnist_with_summaries

執(zhí)行上面的命令后雀摘,出現(xiàn)一條提示信息,復制其中的網(wǎng)址到瀏覽器烁落,就能看到數(shù)據(jù)可視化的圖標了。

首先打開標量SCALARS的窗口轧铁,并單擊打開accuracy的圖表旦棉,其中可以看到兩條曲線齿风,分別是train和test中accuracy隨訓練步數(shù)變化的趨勢药薯。可以調整Smoothing參數(shù)救斑,控制對曲線的平滑處理童本。如下圖所示

打開IMAGES窗口,可以看到MNIST數(shù)據(jù)集中的圖片脸候,不只是原始數(shù)據(jù)穷娱,所有在tf.summary.image()中匯總的圖片數(shù)據(jù)都可以在這里看到。

進入GRAPHS窗口运沦,可以看到整個TensorFlow計算圖的結構,這里展示了網(wǎng)絡forward的inference的流程携添,以及backward訓練更新參數(shù)的流程

切換到DISTRIBUTIONS窗口嫁盲,可以看到之前記錄的各個神經(jīng)網(wǎng)絡層輸出的分布,包括在激活函數(shù)前的結果及在激活函數(shù)后的結果烈掠。這樣能觀察到神經(jīng)網(wǎng)絡節(jié)點的輸出是否有效

點擊HISTOGRAMS窗口羞秤,將DISTRIBUTIONS的圖示結構轉換為直方圖的形式,將每一步訓練后的神經(jīng)網(wǎng)絡層的輸出的分布以直方圖的形式展示出來

單擊PROJECTOR左敌,可以看到降維后的嵌入向量的可視化效果

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瘾蛋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子母谎,更是在濱河造成了極大的恐慌瘦黑,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奇唤,死亡現(xiàn)場離奇詭異幸斥,居然都是意外死亡,警方通過查閱死者的電腦和手機咬扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門甲葬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懈贺,你說我怎么就攤上這事经窖。” “怎么了梭灿?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵画侣,是天一觀的道長。 經(jīng)常有香客問我堡妒,道長配乱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮搬泥,結果婚禮上桑寨,老公的妹妹穿的比我還像新娘。我一直安慰自己忿檩,他們只是感情好尉尾,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燥透,像睡著了一般沙咏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兽掰,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天芭碍,我揣著相機與錄音,去河邊找鬼孽尽。 笑死窖壕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的杉女。 我是一名探鬼主播瞻讽,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熏挎!你這毒婦竟也來了速勇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坎拐,失蹤者是張志新(化名)和其女友劉穎烦磁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哼勇,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡都伪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了积担。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨晶。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帝璧,靈堂內的尸體忽然破棺而出先誉,到底是詐尸還是另有隱情,我是刑警寧澤的烁,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布褐耳,位于F島的核電站,受9級特大地震影響渴庆,放射性物質發(fā)生泄漏漱病。R本人自食惡果不足惜吭练,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一竞帽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悠反,春花似錦嗤军、人聲如沸注盈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽老客。三九已至,卻和暖如春震叮,著一層夾襖步出監(jiān)牢的瞬間胧砰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工苇瓣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尉间,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓击罪,卻偏偏與公主長得像哲嘲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子媳禁,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容

  • TensorBoard TensorBoard的官網(wǎng)教程如下: https://www.tensorflow.or...
    Faded憔悴不堪閱讀 1,731評論 0 0
  • 簡單線性回歸 import tensorflow as tf import numpy # 創(chuàng)造數(shù)據(jù) x_dat...
    CAICAI0閱讀 3,549評論 0 49
  • 參考:① Tensorflow的可視化工具Tensorboard的初步使用Link: https://blog.c...
    李2狗子閱讀 752評論 0 0
  • 初來乍到眠副,請多關照!喜歡隨手記錄小心情竣稽。很高興認識你們囱怕!
    元浠閱讀 294評論 0 0
  • 今天到了海安,昨天看了天氣預報毫别,說是有雨娃弓,于是穿的比較厚~ 一下高鐵站,太陽全方位的曬進來拧烦,風也很大忘闻,這邊的紫外線...
    阿欣_30閱讀 482評論 0 0