TensorBoard是TensorFlow的可视化工具,它可以通过TrensorFlow程序运行过程中输出 的日志文件可视化TensorFlow程序的运行状态。TensorBoard和TensorFlow程序跑在不同的进程中,TensoeBoard会自动读取最新的TensorFlow日志文件,并呈现当前TensorFlow状态。以下代码展示了一个简单的TensorFlow程序,在这个程序中完成了TensorBoard日志输出的功能。
import tensorflow as tf
#定义一个简单的计算图,实现向量加法的操作。
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")
#生成一个写日志的writer,并将当前的TensorFlow计算图写入日志。TensorFlow提供了多种写日志的API
writer = tf.summary.FileWriter("/path/to/log",tf.get_default_graph())
writer.close()
以上程序输出了TensorFlow计算图的信息,所以运行TensorBoard时,可以看到这个向量相加程序计算图可视化之后的结果。TensorBoard不需要额外的安装过程,TensorFlow安装完成时,TensorBoard会自动安装。运行以下命令便可以启动TensorBoard。
#运行TensorBoard,并将日志的地址指向上面程序日志输出的地址。
tensorboard --logdir=/path/to/log
运行以上命令会启动一个服务,这个服务的端口默认为6006.通过浏览器打开localhost:6006,可以看到图1所示的界面。打开TensorBoard界面会默认进入GRAPHS界面,INACTIVE选项中列出的是当前没有可视化数据的项目,如图2。
TensorBoard可视化得到的图不仅是将TensorFlow计算图中的节点和边直接可视化,它会根据每个TensorFlow计算节点的命名空间来整理可视化得到的效果图,使得神经网络的整体结构不会被过多的细节所淹没。除了显示TensorFlow计算图的结构,TensorBoard还可以展示TensorFlow计算节点上的其他信息。
命名空间与TensorBoard图上节点
为了更好地组织可视化效果图中的计算节点,TensorBoard支持通过TensorFlow命名空间来整理可视化效果图上的节点。在TensorBoard的默认视图中,TensorFlow计算图中同一个命名空间下的所有节点会被缩略成一个节点,只有顶层命名空间中的节点才会被显示在TensorBoard可视化效果图上。除了tf.variable_scope函数,tf.name_scope函数也提供了命名空间管理的功能。这两个函数在大部分情况下是等价的,唯一的区别是在使用tf.get_variable函数时。(具体不再详细介绍)通过对命名空间管理,可以改进之前的样例代码,使得可视化得到的效果图更加清晰。以下代码展示了改进的方法。
import tensorflow as tf
#将输入定义放入各自的命名空间中,从而使得TensorBoard可以根据命名空间来整理可视化效果图上的节点。
with tf.name_scope("input1"):
input1 = tf.constant([1.0,2.0,3.0], name="input1")
with tf.name_scope("input2"):
input2 = tf.Variable(tf.random_uniform([3]), name="input2")
output = tf.add_n([input1,input2], name="add")
writer = tf.train.SummaryWriter("/path/to/log",tf.get_default_graph())
writer.close()
改进之后的好处是,用于初始化的节点已经被缩略起来了。这样TensorFlow程序中定义的加法运算被清晰地展示了出来。需要查看input2节点中具体包含了那些运算时,可以将鼠标移动到input2节点,并点开右上角的➕。
TensorBoard除了可以可视化TensorFlow的计算图,还可以可视化TensorFlow程序运行过程中各种有助于了解程序运行状态的监控指标。
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
日志生成函数 | TensorBoard界面栏 | 展示内容 |
---|---|---|
tf.summary.scalar | EVENTS |
监控数据随着迭代进行的变化趋势。 |
tf.summary.image | IMAGES |
TensorFlow中使用的图片数据。 |
tf.summary.audio | AUDIO |
TensorFlow中使用的音频数据。 |
tf.summary.text | TEXT |
TensorFlow中使用的文本数据。 |
tf.summary.histogram | HISTOGRAMS,DISTRIBUTIONS |
TensorFlow中张量分布监控数据随着迭代轮数的变化趋势。 |
下载google图像识别网络inception-v3并查看结构
import tensorflow as tf
import os
import tarfile
import requests
#inception模型下载地址
inception_pretrain_model_url = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz'
#模型存放地址
inception_pretrain_model_dir = "inception_model"
if not os.path.exists(inception_pretrain_model_dir):
os.makedirs(inception_pretrain_model_dir)
#获取文件名,以及文件路径
filename = inception_pretrain_model_url.split('/')[-1]
filepath = os.path.join(inception_pretrain_model_dir,filename)
#下载模型
if not os.path.exists(filepath):
print("download:",filename)
r = requests.get(inception_pretrain_model_url,stream=True)
with open(filepath,'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print("finish:",filename)
#解压文件
tarfile.open(filepath,'r:gz').extractall(inception_pretrain_model_dir)
#模型结构存放文件
log_dir = 'inception_log'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
#classify_image_graph_def.pb为google训练好的模型
inception_graph_def_file = os.path.join(inception_pretrain_model_dir,'classify_image_graph_def.pb')
with tf.Session() as sess:
with tf.gfile.FastGFile(inception_graph_def_file,'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def,name='')
#保存图的结构
writer = tf.summary.FileWriter(log_dir,sess.graph)
writer.close()
得到结构图如下:
experiment/grape/log/
介绍了TensorFlow的可视化工具TensorBoard。作为第一篇文章,主要目的在于熟悉markdown文档书写,在介绍一些基本概念的同时,加入了目前做过的项目的部分实验结果。在下一篇将介绍有关T-SNE的内容分别使用MNIST数据集和自己的数据集展开。
[1]: 《TensorFlow实战Google深度学习框架》