tensorboard可視化工具
tensorboard是tensorflow的可視化工具,通過這個工具我們可以很清楚的看到整個神經網絡的結構及框架。
通過之前展示的代碼,我們進行修改從而展示其神經網絡結構。
一、搭建圖紙
首先對input進行修改,將xs,ys進行新的名稱指定x_in y_in
這里指定的名稱,之后會在可視化圖層中inputs中顯示出來
xs= tf.placeholder(tf.float32, [None, 1],name='x_in')
ys= tf.placeholder(tf.loat32, [None, 1],name='y_in')
使用with.tf.name_scope('inputs')可以將xs ys包含進來,形成一個大的圖層,圖層的名字就是
with.tf.name_scope()方法中的參數
with tf.name_scope('inputs'): # define placeholder for inputs to network xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1])
接下來編輯layer
編輯前的代碼片段:
def add_layer(inputs, in_size, out_size, activation_function=None): # add one more layer and return the output of this layer 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
編輯后
def add_layer(inputs, in_size, out_size, activation_function=None): # add one more layer and return the output of this layer with tf.name_scope('layer'): Weights= tf.Variable(tf.random_normal([in_size, out_size])) # and so on...
定義完大的框架layer后,通知需要定義里面小的部件weights biases activationfunction
定義方法有兩種,一是用tf.name_scope(),二是在Weights中指定名稱W
def add_layer(inputs, in_size, out_size, activation_function=None): #define layer name with tf.name_scope('layer'): #define weights name with tf.name_scope('weights'): Weights= tf.Variable(tf.random_normal([in_size, out_size]),name='W') #and so on......
接着定義biases,方法同上
def add_layer(inputs, in_size, out_size, activation_function=None): #define layer name with tf.name_scope('layer'): #define weights name with tf.name_scope('weights') Weights= tf.Variable(tf.random_normal([in_size, out_size]),name='W') # define biase with tf.name_scope('Wx_plus_b'): Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases) # and so on....
最后編輯loss 將with.tf.name_scope( )添加在loss上方 並起名為loss
這句話就是繪制了loss
最后再對train_step進行編輯
with tf.name_scope('train'): train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
我們還需要運用tf.summary.FileWriter( )將上面繪畫的圖保存到一個目錄中,方便用瀏覽器瀏覽。
這個方法中的第二個參數需要使用sess.graph。因此我們把這句話放在獲取session后面。
這里的graph是將前面定義的框架信息收集起來,然后放在logs/目錄下面。
sess = tf.Session() # get session # tf.train.SummaryWriter soon be deprecated, use following writer = tf.summary.FileWriter("logs/", sess.graph)
最后在終端中使用命令獲取網址即可查看
tensorboard --logdir logs
完整代碼:
#如何可視化神經網絡 #tensorboard import tensorflow as tf def add_layer(inputs, in_size, out_size, activation_function=None): # add one more layer and return the output of this layer with tf.name_scope('layer'): 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 # define placeholder for inputs to network with tf.name_scope('inputs'): xs = tf.placeholder(tf.float32, [None, 1], name='x_input') ys = tf.placeholder(tf.float32, [None, 1], name='y_input') # add hidden layer l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu) # add output layer prediction = add_layer(l1, 10, 1, activation_function=None) # the error between prediciton and real data with tf.name_scope('loss'): loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1])) with tf.name_scope('train'): train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) sess = tf.Session() writer = tf.summary.FileWriter("logs/", sess.graph) init = tf.global_variables_initializer() sess.run(init)
-------------------------------------------------------------------
tensorflow可視化訓練過程的圖標是如何制作的?
首先要添加一些模擬數據。nump可以幫助我們添加一些模擬數據。
利用np.linespace()產生隨機的數字 同時為了模擬更加真實 我們會添加一些噪聲 這些噪聲是通過np.random.normal()隨機產生的。
x_data= np.linspace(-1, 1, 300, dtype=np.float32)[:,np.newaxis] noise= np.random.normal(0, 0.05, x_data.shape).astype(np.float32) y_data= np.square(x_data) -0.5+ noise
在layer中為weights biases設置變化圖表
首先我們在add_layer()方法中添加一個參數n_layer 來標識層數 並且用變量layer_name代表其每層的名稱
def add_layer( inputs , in_size, out_size, n_layer, activation_function=None): ## add one more layer and return the output of this layer layer_name='layer%s'%n_layer ## 定義一個新的變量 ## and so on ……
接下來 我們層中的Weights設置變化圖 tensorflow中提供了tf.histogram_summary( )方法,用來繪制圖片,第一個參數是圖表的名稱,第二個參數是圖標要記錄的變量。
def add_layer(inputs , in_size, out_size,n_layer, activation_function=None): ## add one more layer and return the output of this layer layer_name='layer%s'%n_layer with tf.name_scope('layer'): with tf.name_scope('weights'): Weights= tf.Variable(tf.random_normal([in_size, out_size]),name='W') tf.summary.histogram(layer_name + '/weights', Weights) ##and so no ……
同樣的方法我們對biases進行繪制圖標:
with tf.name_scope('biases'): biases = tf.Variable(tf.zeros([1,out_size])+0.1, name='b') tf.summary.histogram(layer_name + '/biases', biases)
至於activation_function( ) 可以不用繪制,我們對output 使用同樣的方法
最后通過修改 addlayer()方法如下所示
def add_layer(inputs, in_size, out_size, n_layer, activation_function=None): # add one more layer and return the output of this layer #對神經層進行命名 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, ) tf.summary.histogram(layer_name + '/outputs', outputs) return outputs
設置loss的變化圖
loss是tensorb的event下面的 這是由於我們使用的是tf.scalar_summary()方法。
當你的loss函數圖像呈現的是下降的趨勢 說明學習是有效的
將所有訓練圖合並
接下來進行合並打包,tf.merge_all_summaries()方法會對我們所有的summaries合並到一起
sess = tf.Session() #合並 merged = tf.summary.merge_all() writer = tf.summary.FileWriter("logs/", sess.graph) init = tf.global_variables_initializer()
訓練數據
忽略不想寫
完整代碼如下:(運行代碼后需要在終端中執行tensorboard --logdir logs)
import tensorflow as tf import numpy as np def add_layer(inputs, in_size, out_size, n_layer, activation_function=None): # add one more layer and return the output of this layer #對神經層進行命名 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, ) tf.summary.histogram(layer_name + '/outputs', outputs) return outputs # Make up some real data x_data = np.linspace(-1, 1, 300)[:, np.newaxis] noise = np.random.normal(0, 0.05, x_data.shape) y_data = np.square(x_data) - 0.5 + noise # define placeholder for inputs to network with tf.name_scope('inputs'): xs = tf.placeholder(tf.float32, [None, 1], name='x_input') ys = tf.placeholder(tf.float32, [None, 1], name='y_input') # add hidden layer l1 = add_layer(xs, 1, 10, n_layer=1, activation_function=tf.nn.relu) # add output layer prediction = add_layer(l1, 10, 1, n_layer=2, activation_function=None) # the error between prediciton and real data 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(0.1).minimize(loss) sess = tf.Session() #合並 merged = tf.summary.merge_all() writer = tf.summary.FileWriter("logs/", sess.graph) init = tf.global_variables_initializer() 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}) #i 就是記錄的步數 writer.add_summary(result, i)
tensorboard查看效果 使用命令tensorboard --logdir logs