TensorBoard是Tensorflow的可视化工具,它可以通过Tensorflow程序运行过程中输出的【日志文件】可视化Tensorflow程序的运行状态。TensorBoard和Tensorflow程序跑在不同的进程中,TensorBoard会自动读取最新的Tensorflow【日志文件】,并呈现当前Tensorflow程序运行的最新状态。下面展示一个简单的Tensorflow程序,在这个程序中,完成了Tensorflow的日志输出功能。
import tensorflow as tf #【1】定义一个简单的计算图,实现向量加法的操作 input1 = tf.constant([1.0,2.0,3.0],name='input1') input2 = tf.Variable(tf.random_uniform([3]),name='input2') output = tf.add_n([input1,input2],name='add') #【2】生成一个写日志的writer,并将当前的TensorFlow计算图写入日志。Tensorflow提供了多种写日志文件的API writer = tf.summary.FileWriter('F:/cifar-10-batches-py',tf.get_default_graph()) writer.close()
运行上面的代码,会输出Tensorflow计算图的信息,具体输出的信息如下所示:
然后,在PyCharm的Terminal窗口中输入:tensorboard --logdir=F:/cifar-10-batches-py 命令,回车执行,会输出下面的信息,如下所示:
将http://DESKTOP-DAQOBTJ:6006 输入到浏览器中,便可以看见可视化的结果,如下所示。
运行上面的命令,会启动一个服务,这个服务的端口默认为6006。最终,这个计算图的可视化,如上所示。
TensroBoard可以记录与展示如下的数据形式,如上图右边的橙色下拉菜单所示:
[1]SCALARS:标量
[2]IMAGES:图片
[3]AUDIO:音频
[4]DEBUGGER:调试器
[5]GRAPH:计算图
[6]DISTRIBUTION:数据分布
[7]HISTOGRAMS:直方图
[8]TEXT:文本等
1 : 首先,建立一个计算图tf.Graph
2 : 确定要在计算图Graph中的那些节点放置summary operations以记录信息
使用tf.summary.scalar()记录标量的运行状态信息;使用tf.summary.image()记录图片的运行状态信息;使用tf.summary.audio()记录Tensorflow中的音频信息;使用tf.summary.graph()记录计算图信息;使用tf.summary.distribution()记录数据的分布图
3 : operations并不会真的去执行计算, 除非你已经创建了一个会话tf.Session(),然后,指定它们去run.而我们上一步创建的这些summary operations其实并不被其他节点依赖,因此,我们需要特地的去运行所有的summary节点。但是,如果逐个的指定并运行上面创建的这些summary的话, 一个程序下来太过于繁琐,因此,我们使用tf.summary.merge_all去将上面创建的所有的summary节点合并成一个节点,最后,我们只需要对这个节点执行计算即可,sess.run()
4 : 第四步使用tf.summary.FileWrite将运行后的数据保存到磁盘中
5 : 最后,运行整个程序,并在命令行输入tensorboard --logdir=F:/cifar-10-batches-py 命令,就可以在web中查看可视化的结果
此块,我们使用最基础的MNIST手写体数字识别案例。
#=======================================================================================================================
#文件说明:
# Tensorflow中,监控指标的可视化
# 开发环境:
# Win10+Tensorflow+OpenCv3.3+Python3.5+PyCharm5.0.3
# 时间地点:
# 陕西师范大学 文津楼 2018.5.13
# 作者:
# 九月
#=======================================================================================================================
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
BATCH_SIZE = 10
TRAIN_STEPS = 5000
SUMMARY_DIR = 'F:/MnistSet'
#=======================================================================================================================
#函数说明:
# 生成变量监控信息,并定义生成监控信息日志文件的操作
#参数说明:
# [1]var :需要监控和记录运行状态的张量
# [2]name:给出了可视化结果中显示的图表名称
#=======================================================================================================================
def variable_summaries(var,name):
with tf.name_scope('summaries'):
tf.summary.histogram(name,var)
mean = tf.reduce_mean(var)
tf.summary.scalar('mean/'+name,mean)
stddev = tf.sqrt(tf.reduce_mean(tf.square(var-mean)))
tf.summary.scalar('stddev/'+name,stddev)
#=======================================================================================================================
#函数说明:
# 生成一层全连接层神经网络
#=======================================================================================================================
def nn_layer(input_tensor,input_dim,output_dim,layer_name,act=tf.nn.relu):
with tf.name_scope(layer_name):
with tf.name_scope('weights'):
weights = tf.Variable(tf.truncated_normal([input_dim,output_dim],stddev=0.1))
variable_summaries(weights,layer_name+'/weights')
with tf.name_scope('biases'):
biases = tf.Variable(tf.constant(0.0,shape=[output_dim]))
variable_summaries(biases,layer_name+'/biases')
with tf.name_scope('Wx_plus_b'):
preactivate = tf.matmul(input_tensor,weights)+biases
tf.summary.histogram(layer_name+'/pre_activvations',preactivate)
activations = act(preactivate,name='activation')
tf.summary.histogram(layer_name+'/activations',activations)
return activations
#=======================================================================================================================
#函数说明:
# Main函数
#=======================================================================================================================
def main(argv=None):
#【1】从磁盘加载数据
mnist = input_data.read_data_sets('F:/MnistSet/',one_hot=True)
#【2】定义两个【占位符】,作为【训练样本图片/此块样本作为特征向量存在】和【类别标签】的输入变量,并将这些占位符存在命名空间input中
with tf.name_scope('input'):
x = tf.placeholder('float', [None, 784],name='x-input')
y_ = tf.placeholder('float', [None, 10], name='y-input')
#【2】将【输入的特征向量】还原成【图片的像素矩阵】,并通过tf.summary.image函数定义将当前图片信息作为写入日志的操作
with tf.name_scope('input_reshape'):
image_shaped_input = tf.reshape(x,[-1,28,28,1])
tf.summary.image('input',image_shaped_input,10)
#【3】创建【神经网络的结构】
hidden1 = nn_layer(x,784,500,'layer1')
y = nn_layer(hidden1,500,10,'layer2',act=tf.identity)
#【4】定义【损失函数】,【交叉熵损失函数】,并生成【交叉熵损失】的【监控日志】
with tf.name_scope('cross_entropy'):
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
tf.summary.scalar('corss_entropy',cross_entropy)
#【5】定义【神经网络损失函数的优化方法】,即神经网络的优化方法
with tf.name_scope('train'):
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#【6】计算【模型】早当前给定数据集上的正确率
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)
#【7】整理Tensorflow中所有的日志操作
merged = tf.summary.merge_all()
#【8】创建回话Session
with tf.Session() as sess:
#【9】实例化一个FileWriter的类对象,并将当前TensoirFlow的计算图写入【日志文件】
summary_writer = tf.summary.FileWriter(SUMMARY_DIR,sess.graph)
#【10】Tensorflow中创建的变量,在使用前必须进行初始化,下面这个为初始化函数
tf.global_variables_initializer().run()
#【11】开始训练
for i in range(TRAIN_STEPS):
xs,ys = mnist.train.next_batch(BATCH_SIZE)
#【12】运行训练步骤以及所有的【日志文件生成操作】,得到这次运行的【日志文件】。
summary,_,acc = sess.run([merged,train_step,accuracy],feed_dict={x:xs,y_:ys})
print('Accuracy at step %s: %s' % (i, acc))
#【13】将所有的日志写入文件,TensorFlow程序就可以那这次运行日志文件,进行各种信息的可视化
summary_writer.add_summary(summary,i)
summary_writer.close()
#========================================================================================================
#模块说明:
# Tensorflow提供的一个主程序入口,tf.app.run函数将会调用上面的main函数
#========================================================================================================
if __name__ == '__main__':
tf.app.run()
然后,输入指令tensorboard --logdir=F:/MnistSet,在web中看见可视化的信息,可视化结果如下所示: