[Tensorflow]之TensorBoard 入门

Tensorboard 是Tensorflow自带的一个可视化工具。

功能

  • Scalars:展示训练过程中记录的标量
  • Image: 展示训练过程中记录的图像
  • Audio: 展示训练过程中记录的音频
  • Graphs: 展示训练中构建的计算图
  • Distributions: 压缩的数据分布图
  • Histogram: 展示训练过程中记录的数据的分布图
  • Embeddings: 展示记录的Tensor
  • Text: 这个不是很清楚。

原理

TensorBoard通过读取Tensorflow的事件文件,通过读取保存到指定目录(通过参数--logdir指定)的序列化后的Summary数据。运行过程中记录结构化的数据,通过一个本地服务器,监听6006端口,分析记录数据,并绘制。
通常看到的代码里tf.summary.scalar,tf.summary.histogram,tf.summary.image等这些是收集训练过程中你想记录的参数,参数一般是(tag,value). 而tf.summary.FileWriter 是将数据写道本地磁盘,以便之后读取。因为tensorflow中的数据都需要run以下才能使用,所以summary也需要run,通常将多个summary 整合到一起(summ = tf.summary.merge_all()),方便一次出结果。

实例

import os
import random
import numpy as np
import tensorflow as tf

ROOT = "/tmp/test_log/"
LABELS = os.path.join(os.getcwd(),"labels_100.tsv")
SPRITES = os.path.join(os.getcwd(),"sprite_1024.png")

mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=ROOT+"data",one_hot = True)
'''  
def conv_layer(input,size_in,size_out,name="conv"):
   with tf.name_scope(name):
       filters = tf.Variable(tf.truncated_normal([5,5,size_in,size_out],stddev=0.1),name="filters")
       b = tf.Variable(tf.constant(0.1,shape=[size_out]),name="b")
       conv = tf.nn.conv2d(input,filters,strides=[1,1,1,1],padding="SAME")
       act = tf.nn.relu(conv+b)
       tf.summary.histogram("weights",filters)
       tf.summary.histogram("biases",b)
       tf.summary.histogram("activation",act)
       return tf.nn.max_pool(act,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")

def fc_layer(input,size_in,size_out,name="fc"):
   with tf.name_scope(name):
       w = tf.Variable(tf.truncated_normal([size_in,size_out],stddev=0.1),name="W")
       b = tf.Variable(tf.constant(0.1,shape=[size_out]),name="B")
       act = tf.matmul(input,w)+b
       tf.summary.histogram("weights",w)
       tf.summary.histogram("biases",b)
       tf.summary.histogram("activations",act)
       return act

def mnist_model(learning_rate,use_two_fc,use_two_conv,hparam):
   tf.reset_default_graph()

   sess = tf.Session()
   x = tf.placeholder(tf.float32,shape=[None,784],name="x")
   x_image = tf.reshape(x,[-1,28,28,1])
   tf.summary.image('input',x_image,3)
   y = tf.placeholder(tf.float32,shape=[None,10],name="lables")
   
   if use_two_conv:
       conv1 = conv_layer(x_image,1,32,"conv1")
       conv_out = conv_layer(conv1,32,64,"conv2")
   else:
       conv1 = conv_layer(x_image,1,64,"conv1")
       conv_out = tf.nn.max_pool(conv1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
   flatten = tf.reshape(conv_out,[-1,7*7*64])
   
   if use_two_fc:
       fc1 = fc_layer(flatten,7*7*64,1024,"fc1")
       relu = tf.nn.relu(fc1)
       embedding_input = relu
       tf.summary.histogram("fc1/relu",relu)
       embedding_size = 1024
       logits = fc_layer(fc1,1024,10,"fc2")
   else:
       embedding_input = flatten
       embedding_size = 7*7*64
       logits = fc_layer(flatten,embedding_size,10,"fc")
   
   with tf.name_scope("xent"):
       xent = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
                               logits=logits,labels=y),name="xent")
       tf.summary.scalar("xent",xent)
   with tf.name_scope("optimizer"):
       train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)
   
   with tf.name_scope("accuary"):
       correct_prediction = tf.equal(tf.argmax(logits,1),tf.argmax(y,1))
       accuary = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
       tf.summary.scalar('accuary',accuary)
   summ = tf.summary.merge_all()
   
   embedding = tf.Variable(tf.zeros([1024,embedding_size]),name="test_embedding")
   assignment = embedding.assign(embedding_input)
   saver = tf.train.Saver()
   
   sess.run(tf.global_variables_initializer())
   writer = tf.summary.FileWriter(ROOT+hparam)
   writer.add_graph(sess.graph)

   config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()
   embedding_config = config.embeddings.add()
   embedding_config.tensor_name = embedding.name
   embedding_config.sprite.image_path = SPRITES
   embedding_config.metadata_path = LABELS

   embedding_config.sprite.single_image_dim.extend([28,28])
   tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer,config)

   for i in range(2001):
       batch = mnist.train.next_batch(100)
       if i%5 ==0:
           [train_accuary,s] = sess.run([accuary,summ],feed_dict = {x:batch[0],y:batch[1]})
           writer.add_summary(s,i)
       if i%500 == 0:
           sess.run(assignment,feed_dict={x:mnist.test.images[:1024],y:mnist.test.labels[:1024]})
           saver.save(sess,os.path.join(ROOT,"model.ckpt"),i)
       sess.run(train_step,feed_dict = {x:batch[0],y:batch[1]})

def make_hparam_string(learning_rate,use_two_fc,use_two_conv):
   conv_param = "conv=2" if use_two_conv else "conv1"
   fc_param = "fc=2" if use_two_fc else "fc=1"
   return "lr_%.0E,%s,%s"%(learning_rate,conv_param,fc_param)


def main():
   
   for learning_rate in [1E-2,1E-3]:
       for use_two_fc in [True]:
           for use_two_conv in [False,True]:
               hparam = make_hparam_string(learning_rate,use_two_fc,use_two_conv)
               print("Starting run for %s"%hparam)
               mnist_model(learning_rate,use_two_fc,use_two_conv,hparam)
   
   print("Done!\n Run `tensorboard --logdir=%s` to see the results."%ROOT)

'''
if __name__ == '__main__':
   #main()


   tf.reset_default_graph()
   sess = tf.Session()
   writer = tf.summary.FileWriter(ROOT+"new")
   summary = tf.Summary(value=[
       tf.Summary.Value(tag="summary_tag",simple_value = 0),
       tf.Summary.Value(tag="summary_tag2",simple_value=1)])
   writer.add_summary(summary,1) # 这些summary都是


   embedding = tf.Variable(tf.truncated_normal([100,128],stddev=0.1),name='embedding')

   config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()

   embedding_config = config.embeddings.add()
   embedding_config.tensor_name = embedding.name
   embedding_config.sprite.image_path = SPRITES # 这个只是用图片代表标签,没有的化,直接用文字代替
   embedding_config.metadata_path = LABELS # 这是变量对应的标签 
   embedding_config.sprite.single_image_dim.extend([28, 28]) #显示图片标签的大小 
   # 这整个结构体都是和tensorboard 页面里的选项相对应的 

   saver = tf.train.Saver()
   sess.run(tf.global_variables_initializer())

   saver.save(sess, os.path.join(ROOT, "model.ckpt"))
   #sess.run(embedding)

   tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer,config) #这是显示embedding的设置,必须要设置这个函数



   writer.close()
   print("Done!")  

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容