人工智能 - 模型可視化 TensorBoard [4]

歡迎Follow我的GitHub,關(guān)注我的簡書

在訓練模型的過程中,經(jīng)常需要調(diào)試其中的參數(shù)秦爆,這就需要可視化。TensorFlow的可視化由TensorBoard完成憔披,由TensorBoard顯示已存儲的Log信息等限。代碼與多層感知機的MNIST相同,只是添加一些Log信息的存儲芬膝,用于展示望门。

本文源碼的GitHub地址,位于tensor_board文件夾锰霜。

執(zhí)行TensorBoard的命令:

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

顯示網(wǎng)站在Log信息中筹误,如http://0.0.0.0:6006

Starting TensorBoard 47 at http://0.0.0.0:6006
(Press CTRL+C to quit)
WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404
WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404
WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404
WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404
TensorBoard

顯示日志

設(shè)置參數(shù)锈遥,使用argparse.ArgumentParser()創(chuàng)建參數(shù)解析器纫事,nargs='?' + const=True + default=False表示:當使用--fake_data時勘畔,參數(shù)的fake_data的值是True(const)所灸;當未使用--fake_data時,參數(shù)的fake_data的值是False(default)炫七;或者指定--fake_data True(Flase)爬立,根據(jù)設(shè)置的參數(shù)賦值。type是參數(shù)類型万哪,help是幫助信息侠驯。獲取os.getenv('TEST_TMPDIR', '/tmp')臨時文件夾,默認是/tmp奕巍,在Mac中是根目錄下的隱藏文件夾吟策。os.path.join將文件夾的路徑拼接在一起。

parser = argparse.ArgumentParser()
parser.add_argument('--fake_data', nargs='?', const=True, type=bool, default=False,
                    help='If true, uses fake data for unit testing.')
parser.add_argument('--max_steps', type=int, default=1000,  # 最大步數(shù) 1000
                    help='Number of steps to run trainer.')
parser.add_argument('--learning_rate', type=float, default=0.001,  # 學習率 0.001
                    help='Initial learning rate')
parser.add_argument('--dropout', type=float, default=0.9,  # Dropout的保留率 0.9
                    help='Keep probability for training dropout.')
parser.add_argument('--data_dir', type=str,  # 數(shù)據(jù)目錄
                    default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'), 'tensorflow/mnist/input_data'),
                    help='Directory for storing input data')
parser.add_argument('--log_dir', type=str,  # Log目錄
                    default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),
                                         'tensorflow/mnist/logs/mnist_with_summaries'),
                    help='Summaries log directory')

在外部聲明FLAGS變量的止,將參數(shù)放入FLAGS中檩坚,使用tf.app.run()執(zhí)行TensorFlow的腳本,main是入口方法,argv是參數(shù)匾委。

FLAGS = None  # 外部聲明

FLAGS, unparsed = parser.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

調(diào)用tf.gfile文件處理庫拖叙,如果日志文件夾存在,則刪除赂乐,并重建薯鳍,然后執(zhí)行核心方法train()。

def main(_):
    if tf.gfile.Exists(FLAGS.log_dir):
        tf.gfile.DeleteRecursively(FLAGS.log_dir)
    tf.gfile.MakeDirs(FLAGS.log_dir)
    train()

加載數(shù)據(jù)挨措,使用MNIST數(shù)據(jù)源挖滤,創(chuàng)建可交互的Session,即tf.InteractiveSession()运嗜,張量可以自己執(zhí)行操作壶辜。

mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True, fake_data=FLAGS.fake_data)  # 加載數(shù)據(jù)
sess = tf.InteractiveSession()

需要輸入的PlaceHolder,指定命名空間input担租,在繪制流程圖的時候使用砸民;將輸入數(shù)據(jù)轉(zhuǎn)換為圖像,并且保持在input_reshape/input文件夾中奋救,圖片命名規(guī)則為input_reshape/input/image/#岭参。

# 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)  # 10表示只存儲10張
name_scope
Image

將創(chuàng)建權(quán)重和偏移變量的方法設(shè)置為方法。

# We can't initialize these variables to 0 - the network will get stuck.
def weight_variable(shape):  # 權(quán)重
    """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)

變量信息的存儲方法尝艘,存儲為標量(tf.summary.scalar)演侯,或者直方圖(tf.summary.histogram)。

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('histogram', var)  # 直方圖

偏移biases的初始值均為0.1背亥,通過學習逐漸變化秒际。

Scalar

偏移biases的初始值均為0.1,每一次迭代使得分布越來越平緩狡汉。

Hist

神經(jīng)網(wǎng)絡(luò)的層次娄徊,使用y=wx+b的線性回歸,并且記錄下參數(shù)W和b的信息盾戴,還有使用激活函數(shù)前后的數(shù)據(jù)對比情況寄锐。

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

由于第一層使用ReLU(校正線性單元,Rectified Linear Unit)尖啡,將小于0的值橄仆,全部抑制為0。

ReLU

第一層是ReLU激活函數(shù)衅斩,第二次未使用激活函數(shù)(tf.identity)盆顾,并且將第一層的神經(jīng)元dropout,訓練小于1畏梆,測試等于1您宪。

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)  # 執(zhí)行dropout參數(shù)
    
# Do not apply softmax activation yet, see below.
y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)  # 未使用激活函數(shù)

損失函數(shù)設(shè)置為交叉熵惫搏,使用AdamOptimizer優(yōu)化損失函數(shù),并且記錄損失函數(shù)的值蚕涤,逐漸收斂筐赔。

with tf.name_scope('cross_entropy'):
    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('cross_entropy', cross_entropy)

with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(
        cross_entropy)
Loss

準確率,比較正確的個數(shù)揖铜,求平均茴丰,并使用標量記錄(tf.summary.scalar)。

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)

將每次迭代的summary合并成一個文件天吓,并且創(chuàng)建兩個writer贿肩,一個用于訓練,一個用于測試龄寞,同時訓練的存儲圖信息汰规。

merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/test')

計算圖信息的節(jié)點,就是最頂層的name_scope物邑,點擊之后就是內(nèi)部的name_scope溜哮。

Graph

設(shè)置feed數(shù)據(jù)的接口,訓練使用批次數(shù)據(jù)色解,每次100個茂嗓,dropout是參數(shù);測試使用全部的測試數(shù)據(jù)科阎,dropout是1述吸,保留全部信息。

def feed_dict(train):
    """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
    # 訓練與測試的dropout不同
    if train or FLAGS.fake_data:
        xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
        k = FLAGS.dropout
    else:
        xs, ys = mnist.test.images, mnist.test.labels
        k = 1.0
    return {x: xs, y_: ys, keep_prob: k}

初始化變量锣笨,開始迭代執(zhí)行蝌矛。每隔10次,使用測試集驗證一次错英,sess.run()的輸入入撒,merged合并的Log信息,accuracy計算圖走趋,feed數(shù)據(jù)衅金,將信息寫入test_writer噪伊。每隔99步簿煌,將運行時間與內(nèi)存信息,存入Log中鉴吹,其余步驟正常秩序姨伟,添加存儲信息。

tf.global_variables_initializer().run()

for i in range(FLAGS.max_steps):
    if i % 10 == 0:  # Record summaries and test-set accuracy
        summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))  # feed測試數(shù)據(jù)
        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訓練數(shù)據(jù)
                                  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)
            print('Adding run metadata for', i)
        else:  # Record a summary
            summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))  # feed訓練數(shù)據(jù)
            train_writer.add_summary(summary, i)

最后注意關(guān)閉Log文件寫入器

train_writer.close()
test_writer.close()

內(nèi)存與計算時間

Runtime

在安裝TensorFlow后豆励,TensorBoard即可使用夺荒,但是在mac系統(tǒng)中瞒渠,會報錯,由于six包的版本過低導致技扼。

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py", line 566, in with_metaclass
    return meta("NewBase", bases, {})
  File "/Library/Python/2.7/site-packages/tensorflow/python/platform/benchmark.py", line 116, in __new__
    if not newclass.is_abstract():
AttributeError: type object 'NewBase' has no attribute 'is_abstract'

在Mac系統(tǒng)中伍玖,含有多個Python源,我們要確定shell使用的源

?  ~ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import six
>>> six.__file__
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.pyc'

升級指定位置的six包

sudo pip install six --upgrade --target="/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/"

當然剿吻,最簡單的就是直接使用虛擬環(huán)境的TensorBoard窍箍,庫的版本可控。


OK, that's all! Enjoy it!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丽旅,一起剝皮案震驚了整個濱河市椰棘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榄笙,老刑警劉巖邪狞,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茅撞,居然都是意外死亡帆卓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門米丘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳞疲,“玉大人,你說我怎么就攤上這事蠕蚜∩星ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵靶累,是天一觀的道長腺毫。 經(jīng)常有香客問我,道長挣柬,這世上最難降的妖魔是什么潮酒? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮邪蛔,結(jié)果婚禮上急黎,老公的妹妹穿的比我還像新娘。我一直安慰自己侧到,他們只是感情好勃教,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匠抗,像睡著了一般故源。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汞贸,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天绳军,我揣著相機與錄音印机,去河邊找鬼。 笑死门驾,一個胖子當著我的面吹牛射赛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奶是,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼咒劲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诫隅?” 一聲冷哼從身側(cè)響起腐魂,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逐纬,沒想到半個月后蛔屹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡豁生,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年兔毒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甸箱。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡育叁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芍殖,到底是詐尸還是另有隱情豪嗽,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布豌骏,位于F島的核電站龟梦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窃躲。R本人自食惡果不足惜计贰,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒂窒。 院中可真熱鬧躁倒,春花似錦、人聲如沸洒琢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纬凤。三九已至福贞,卻和暖如春撩嚼,著一層夾襖步出監(jiān)牢的瞬間停士,已是汗流浹背挖帘。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恋技,地道東北人拇舀。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蜻底,于是被迫代替她去往敵國和親骄崩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 簡單線性回歸 import tensorflow as tf import numpy # 創(chuàng)造數(shù)據(jù) x_dat...
    CAICAI0閱讀 3,541評論 0 49
  • TensorBoard TensorBoard的官網(wǎng)教程如下: https://www.tensorflow.or...
    Faded憔悴不堪閱讀 1,709評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理薄辅,服務(wù)發(fā)現(xiàn)要拂,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 村里常常聽說巧妹子讀了大學,工資也就三五千窿春,婚后辭職帶娃拉一,讀書沒有什么用,這已經(jīng)不是知識改變命運的時代了旧乞。 你看那...
    彩虹色的豬閱讀 441評論 3 4
  • 今天遠程推送的時候要用到真機調(diào)試蔚润,結(jié)果出現(xiàn)了這個bug,大概意思就是沒有真機調(diào)試證書尺栖,好吧嫡纠,由于開發(fā)者賬戶沒有花$...
    天堂秀閱讀 920評論 8 5