用tensorboard來(lái)看看我們的網(wǎng)絡(luò)流吧!

本文使用的tensorlow版本:1.4
tensorlow安裝:pip install tensorflow

1冤留、引言

在上一節(jié)課中碧囊,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),那么網(wǎng)絡(luò)中的數(shù)據(jù)是如何流動(dòng)的呢纤怒?如果我們想通過(guò)可視化的方式看到網(wǎng)絡(luò)中的數(shù)據(jù)流動(dòng)糯而,以及參數(shù)和誤差的變化,這時(shí)候就該Tensorbord大顯身手了泊窘。

先來(lái)回顧一下我們之前的tensorflow代碼熄驼,我們用神經(jīng)網(wǎng)絡(luò)來(lái)預(yù)測(cè) y = x^2 - 0.5,定義了一個(gè)神經(jīng)元的輸入層和輸出層,10個(gè)神經(jīng)元的隱藏層州既,代碼如下:

import tensorflow as tf
import numpy as np


def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))
    biases = tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b = tf.add(tf.matmul(inputs,Weights),biases)
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs


x_data = np.linspace(-1,1,300)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise

#None表示給多少個(gè)sample都可以
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])

l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
prediction = add_layer(l1,10,1,activation_function=None)

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                     reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
        if i % 50 == 0:
            print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))

接下來(lái)谜洽,我們就以這一個(gè)例子為例,一起來(lái)看一下tensorboard的使用吧吴叶。

2阐虚、可視化流程

使用Tensorboard,我們首先要定義變量的命名空間name_scope蚌卤,只有定義了name_scope实束,我們?cè)趖ensorboard中的Graph才會(huì)看起來(lái)井然有序奥秆。所以,我們以修改一層網(wǎng)絡(luò)的函數(shù)為例咸灿,來(lái)看一下如何使用name_scope构订,name_scope對(duì)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程是沒(méi)有影響的。

def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
    layer_name = "layer%s" % n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]),name='W')
            #概率分布的形式
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size])+0.1,name='b')    
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.add(tf.matmul(inputs,Weights),biases)
        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        return outputs

類似的避矢,你可以在任何你想要的地方加上命名空間悼瘾,使得你的tensorboard看上去更加整潔有序。

在定義好命名空間之后审胸,我們需要將我們網(wǎng)絡(luò)中的數(shù)據(jù)流保存到文件中:

merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('logs/',sess.graph)

除了網(wǎng)絡(luò)的結(jié)構(gòu)外亥宿,我們有時(shí)候想看一下網(wǎng)絡(luò)的loss的變化,以及參數(shù)的變化砂沛,我們需要進(jìn)一步增加我們summary的內(nèi)容烫扼,因?yàn)閃eights和biases是一組數(shù)而不是單個(gè)數(shù),所以我們使用histogram來(lái)表示二者在每一期的分布變化碍庵,而loss是一個(gè)單個(gè)的數(shù)映企,也就是標(biāo)量scalaer,所以我們使用scalaer來(lái)表示loss的變化静浴,二者的定義如下:

tf.summary.histogram(layer_name+'/weights',Weights)
tf.summary.scalar("loss",loss)

但是堰氓,光定義這個(gè)是沒(méi)有用的,我們需要run一下這個(gè)苹享,記得我們之間定義了merged節(jié)點(diǎn)了么豆赏,運(yùn)行這個(gè)就行啦,我們將返回的結(jié)果通過(guò)writer寫入到文件中就可以啦:

result = sess.run(merged,feed_dict={xs:x_data,ys:y_data})
writer.add_summary(result,i)

所以富稻,到現(xiàn)在掷邦,我們的完整代碼如下:

import tensorflow as tf
import numpy as np


def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
    layer_name = "layer%s" % n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]),name='W')
            #概率分布的形式
            tf.summary.histogram(layer_name+'/weights',Weights)
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size])+0.1,name='b')
            tf.summary.histogram(layer_name + '/biases', biases)
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.add(tf.matmul(inputs,Weights),biases)
        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        return outputs


x_data = np.linspace(-1,1,300)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise

#None表示給多少個(gè)sample都可以
with tf.name_scope("input"):
    xs = tf.placeholder(tf.float32,[None,1],name='x_input')
    ys = tf.placeholder(tf.float32,[None,1],name='y_input')

l1 = add_layer(xs,1,10,1,activation_function=tf.nn.relu)
prediction = add_layer(l1,10,1,2,activation_function=None)

with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                         reduction_indices=[1]))
    tf.summary.scalar("loss",loss)


with tf.name_scope('train'):
    train_step = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)


init = tf.global_variables_initializer()

with tf.Session() as sess:
    # 1.2之前 tf.train.SummaryWriter("logs/",sess.graph)
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter('logs/',sess.graph)
    sess.run(init)
    for i in range(1000):
        sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
        if i % 50 == 0:
            result = sess.run(merged,feed_dict={xs:x_data,ys:y_data})
            writer.add_summary(result,i)

3、結(jié)果查看

我們使用命令來(lái)查看最后的結(jié)果:

tensorboard --logdir logs

然后我們就可以根據(jù)它提示的網(wǎng)址去訪問(wèn)我們的結(jié)果啦椭赋,這里我用safari瀏覽器是沒(méi)有看到結(jié)果的抚岗, 用chrome是可以的呦。

我們可以看GRAPH選項(xiàng)下面保存了我們的整個(gè)網(wǎng)絡(luò)的流圖哪怔,我們可以點(diǎn)開看每一個(gè)層的內(nèi)容宣蔚,比如我們點(diǎn)開layer1:


在Scalaer下,我們可以看到我們的loss結(jié)果:


而在distribution下面认境,我們可以看到我們定義的權(quán)重和偏置的參數(shù)分布變化:

更多的信息胚委,大家可以自己去探索喲,我們這里就不繼續(xù)啦叉信,下篇繼續(xù)亩冬!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子硅急,更是在濱河造成了極大的恐慌覆享,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件营袜,死亡現(xiàn)場(chǎng)離奇詭異撒顿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荚板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門凤壁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人跪另,你說(shuō)我怎么就攤上這事客扎。” “怎么了罚斗?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宅楞。 經(jīng)常有香客問(wèn)我针姿,道長(zhǎng),這世上最難降的妖魔是什么厌衙? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任距淫,我火速辦了婚禮,結(jié)果婚禮上婶希,老公的妹妹穿的比我還像新娘榕暇。我一直安慰自己,他們只是感情好喻杈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布彤枢。 她就那樣靜靜地躺著,像睡著了一般筒饰。 火紅的嫁衣襯著肌膚如雪缴啡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天瓷们,我揣著相機(jī)與錄音业栅,去河邊找鬼。 笑死谬晕,一個(gè)胖子當(dāng)著我的面吹牛碘裕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播攒钳,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼帮孔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了不撑?” 一聲冷哼從身側(cè)響起你弦,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惊豺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后禽作,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尸昧,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年旷偿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烹俗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萍程,死狀恐怖幢妄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茫负,我是刑警寧澤蕉鸳,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站忍法,受9級(jí)特大地震影響潮尝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饿序,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一勉失、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧原探,春花似錦乱凿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至型型,卻和暖如春后专,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背输莺。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工戚哎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫂用。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓型凳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘱函。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甘畅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容