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.scalarEVENTS监控数据随着迭代进行的变化趋势。tf.summary.imageIMAGESTensorFlow中使用的图片数据。tf.summary.audioAUDIOTensorFlow中使用的音频数据。tf.summary.textTEXTTensorFlow中使用的文本数据。tf.summary.histogramHISTOGRAMS,DISTRIBUTIONSTensorFlow中张量分布监控数据随着迭代轮数的变化趋势。下载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深度学习框架》