tensorboard是tensorflow自帶的一個強大的可視化工具,也是一個web應用套件支持七種可視化包括 SCALARS(標量)、IMAGES(圖像)、AUDIO(音頻)、GRAPHS(數據流圖)、DISTRIBUTIONS(訓練數據分佈圖)、HISOGRAMS(訓練過程當中數據的柱狀圖)和EMBEDDINGS(展現詞向量的投影分佈)react
Tensorflow的計算表現爲數據流圖,所以tf.Graph類中包含了一系列表示計算的操做對象(tf.Operation),以及操做之間的流動的數據(tf.Tensor)。tf.Operation表明圖中的一個節點,用於計算張量數據能夠由節點構造器(tf.add)與tf.Graph.creat_op()產生。tf.Tensor是操做輸出的符號句柄,不包含輸出的的值,而是提供tf.Session來計算這些值的方法,這樣就能構建一個數據流鏈接。例如c = tf.matmul(a, b)表示建立了一個類型爲MatMul的Operation,該Operation接收Tensor a和Tensor b做爲輸入,而產生Tensor c做爲輸出。
在可視化的時候還須要給必要的節點添加摘要(summary),摘要會收集節點的數據,而且標記上第幾步時間戳等寫入事件文件(event file),tf.sunmmary.FileWriter類用於在目錄中建立事件文件,而且向摘要中添加摘要和事件。如train_writer.add_summary(summary,i)。git
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
class tensorboard(object):web
#用來生成核函數 def weight_variable(self,shape): weight=tf.truncated_normal(shape=shape,stddev=0.1) return tf.Variable(weight) #用來生成偏置項的分佈 def bias_variable(self,shape): bias=tf.constant(0.0,dtype=tf.float32,shape=shape) return tf.Variable(bias)
初始化某個結構層,其中咱們使用tf.name_scope來建立做用域,它和tf.variable_scope的區別在於tf.name_scope只能給op_name加前綴,tf.variable_scope不單單能夠給op_name還能給variable_name加前綴同時簡要說明tf.Variable和tf.get_Variable的區別,簡而言之就是tf.Variable每次都直接新建一個變量,可是tf.get_Variable先檢查,若是有的話就直接返回該變量對象,不然建立對象。是否能在該做用域內建立新對象由tf.get_Variable決定。
再使用variable_summaries函數來建立該層的一些信息小程序
def nn_layer(self,input_tensor,input_dim,output_dim,layer_name,act=tf.nn.relu): with tf.name_scope(layer_name): with tf.name_scope('weight'): weights=self.weight_variable([input_dim,output_dim]) self.variable_summaries(weights) with tf.name_scope('bias'): bias=self.weight_variable([output_dim]) self.variable_summaries(bias) with tf.name_scope('Wx_plus_b'): preactivate=tf.nn.bias_add(tf.matmul(input_tensor,weights),bias) #tf.summary是給必要的節點添加摘要,摘要會收集該節點的數據,在這個位置收集數據並 #且使用histogram繪製出來,效果以下圖 tf.summary.histogram('preactivate',preactivate) activations=act(preactivate,name='activation') tf.summary.histogram('activation',activations) return activations
接下來講明咱們摘要應該包含的數據,即標量由均值、方差、最小值、最大值,同時繪製輸入的張量數據的圖分佈session
def variable_summaries(self,var): with tf.name_scope('sunmmaries'): 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)
效果以下圖,雖然說訓練存在問題,可是目標僅僅是爲了畫圖dom
接下來是初始化函數,不作多講ide
def __init__(self,max_steps=500,learning_rate=0.01,drop_out=0.9,batch_size=256): self.max_steps=max_steps self.learning_rate=learning_rate self.drop_out=drop_out self.log_dir='mnist_with_summaries' self.batch_size=batch_size self.mnist=input_data.read_data_sets("MNIST_data/",one_hot=True,source_url='http://yann.lecun.com/exdb/mnist/')
如下定義告終構信息,定義了圖中的節點函數
def construct(self): with tf.name_scope('input'): self.x=tf.placeholder(dtype=tf.float32,shape=[self.batch_size,784],name='X_input') self.y_=tf.placeholder(dtype=tf.float32,shape=[self.batch_size,10],name='y_input') with tf.name_scope('input_shape'): image_shaped_input=tf.reshape(self.x,shape=[self.batch_size,28,28,1]) tf.summary.image('input',image_shaped_input,10) hidden1=self.nn_layer(self.x,784,500,'layer1') with tf.name_scope('drop_out'): self.keep_prob=tf.placeholder(dtype=tf.float32) tf.summary.scalar('dropout_keep_prob',self.keep_prob) dropped=tf.nn.dropout(hidden1,keep_prob=self.keep_prob) y=self.nn_layer(dropped,500,10,'layer2',act=tf.identity) with tf.name_scope('cross_entropy'): diff=tf.nn.softmax_cross_entropy_with_logits(logits=y,labels=self.y_) with tf.name_scope('total'): cross_entropy=tf.reduce_mean(diff) tf.summary.scalar('cross_entropy',cross_entropy) with tf.name_scope('train'): self.train_step=tf.train.AdamOptimizer(self.learning_rate).minimize(cross_entropy) with tf.name_scope('accuracy'): with tf.name_scope('correct_prediction'): correct_prediction=tf.equal(tf.argmax(y),tf.argmax(self.y_)) with tf.name_scope('accuracy'): self.accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) tf.summary.scalar('accuracy',self.accuracy)
上面的代碼定義了大部分的節點名稱,而且也添加了標量的摘要如accuracy等,accuracy的圖再也不贅述,接下來就是在運行的過程當中繪製剛剛的標量和圖表信息工具
#爲了釋放TensorBoard所使用的事件文件(events file),全部的即時數據(在這裏只有一個)都要在圖表構建階段合併至一個操做(op)中。 merged=tf.summary.merge_all() session=tf.Session() #用於將Summary寫入磁盤,須要制定存儲路徑logdir,若是傳遞了Graph對象,則在Graph Visualization會顯示Tensor Shape Information train_writer=tf.summary.FileWriter(self.log_dir+'/train',session.graph) test_writer=tf.summary.FileWriter(self.log_dir+'/test') init=tf.global_variables_initializer() session.run(init) saver=tf.train.Saver() for i in range(self.max_steps): if i%100==0: #繪製以前的全部的圖表以及標量信息 summary,acc=session.run([merged,self.accuracy],feed_dict=self.feed_dict(False)) test_writer.add_summary(summary,i) print('Accuracy at step %s: %s'%(i,acc)) else: if i==499: #定義本模型的運行選項,並不加限制而且操做元數據,爲描述數據的數據(data about data),主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。 run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_metadata=tf.RunMetadata() summary,_=session.run([merged,self.train_step],feed_dict=self.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: summary,_=session.run([merged,self.train_step],feed_dict=self.feed_dict(True)) train_writer.add_summary(summary,i) if i%99==0: print("at train step") train_writer.close() test_writer.close() def extract(self,x,y): sample_num=self.mnist.train.num_examples idx=np.random.randint(low=0,high=(sample_num-self.batch_size)) return x[idx:(idx+self.batch_size)],y[idx:(idx+self.batch_size)] def feed_dict(self,train): if train: xs,ys=self.mnist.train.next_batch(self.batch_size) k=self.drop_out else: xs,ys=self.extract(self.mnist.train.images,self.mnist.train.labels) k=1.0 return {self.x:xs,self.y_:ys,self.keep_prob:k}
Tensorboard做爲對TensorFlow訓練過程的分析,能夠對模型的問題做出更快的判斷,能夠加快模型的優化,應當儘可能多采用優化