TensorBoard是Tensorflow自带的一个强大的可视化工具,也是一个web应用程序套件。tensorboard可以可视化tensorflow的计算图结构以及变量的分布等,使用tensorboard可以让我们了解计算图的计算流程并且有助于我们理解模型参数
下面我们以手写数字识别为例来使用tensorboard可视化计算图
引入模块数据集,设置batch:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data',one_hot=True)
batch_size = 100
n_batch = mnist.train.num_examples//batch_size
定义一个概述函数来获取变量的各个特征值和直方图,另外给每个变量定义命名空间,将不同的对象及操作放在由tf.name_scope()指定的区域中,便于在tensorboard中展示清晰的逻辑关系图,这点在复杂关系图中特别重要。
def variable_summaries(var):
with tf.name_scope('summaries'):#定义命名空间
mean = tf.reduce_mean(var)#求均值
tf.summary.scalar('mean',mean)#将计算的mean命名为mean
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var-mean)))#求标准差
tf.summary.scalar('stddev',stddev)#将计算的stddev命名为stddev
tf.summary.scalar('max',tf.reduce_max(var))
tf.summary.scalar('min',tf.reduce_min(var))
tf.summary.histogram('histogram',var)#显示变量的分布直方图,并命名为histogram
定义网络、损失、训练、准确率以及他们的命名空间,这里只用了最简单的网络结构,只有输入层和输出层
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('layer'):#layer的命名空间
with tf.name_scope('weights'):
w = tf.Variable(tf.zeros([784,10]),name='w')
variable_summaries(w)#得到权重矩阵的概述
with tf.name_scope('biass'):
b = tf.Variable(tf.zeros([10]),name='b')
variable_summaries(b)#得到偏置的概述
with tf.name_scope('xw_plus_b'):
xw_plus_b = tf.matmul(x,w)+b
with tf.name_scope('softmax'):
pre = tf.nn.softmax(xw_plus_b)
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(y-pre))
tf.summary.scalar('loss',loss)#显示损失的信息
with tf.name_scope('train'):
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
with tf.name_scope('accuracy'):
with tf.name_scope('correct_prediction'):
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pre,1))
with tf.name_scope('accuracy'):
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
tf.summary.scalar('accuracy',accuracy)#显示准确率的信息
定义合并操作并在每次训练时把得到的summary合并到一起
merged = tf.summary.merge_all()#将上述summary的结果合并到一起
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
writer = tf.summary.FileWriter('logs/',sess.graph)#在工作空间下的logs文件夹下(如果没有会自动创建)创建一个文件,里面记录了整个计算图的结构
for epoch in range(51):
for batch in range(n_batch):
batch_x,batch_y = mnist.train.next_batch(batch_size)
summary,_ = sess.run([merged,train],feed_dict={x:batch_x,y:batch_y})#将merged赋给summary
writer.add_summary(summary,epoch)#在图文件中加入summary和epoch的信息
test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
print('epoch: '+str(epoch)+', test accuracy is: '+str(test_acc))
执行完代码后会在工作空间的logs目录下生成一个文件,里面记录了计算图的结构和add_summary添加的信息。
查看方法:
打开cmd,切到你工作空间所在盘,输入tensorboard --logdir=dir
dir是你logs的路径,我的是:
然后我们复制输出的链接,用谷歌浏览器打开,用别的浏览器打开的话可能会比较卡
在这里就可以看到accuracy、layer和loss的变化情况,左侧可以设置平滑度
GRAPHS里可以看到整个计算图的结构是什么样的
左侧显示了每个单元的涵义,右侧可以通过用鼠标拖拽滑动,双击命名空间可以放大查看其中的结构,右击某一模块可以选择把它放入主图或者拿出主图
从图中我们可以清楚的看到各个模块之间的联系以及参数的流动情况
DISTRIBUTIONS里可以看到参数的分布情况
HISTOGRAMS里可以看到参数的分布直方图
注:1.如果在程序没有问题的情况下运行报错,可以试试restart kernels重新执行代码
2.另外在运用tensorboard时如果已经存在计算图了不会将原来的图替换,所以建议把原来生成的计算图文件删掉再执行代码