TensorBoard数据可视化

2024-09-06 03:32

本文主要是介绍TensorBoard数据可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tensorboard可以将模型训练的过程中的各种汇总数据展示出来,包括标量(Scalars)、图片(image)、音频(Audio)、计算图(Graphs)、数据分布(Distributions)、直方图(Histograms)和嵌入向量(Embeddings)。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport argparse
import os
import sysimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data#使用input_data.read_data_sets 下载MNIST数据,并创建Tensorflow的默认Session。FLAGS = Nonedef train():# Import datamnist = input_data.read_data_sets(FLAGS.data_dir,fake_data=FLAGS.fake_data)sess = tf.InteractiveSession()"""为了在tensorboard中展示节点名称,我们设计网络时会经常使用with tf.name_scope 限定命名空间,在这个with下的所有节点都会被自动命名为input/xxx这样的格式。下面定义输入x和y的placeholder,并将输入的一维数据变形为28x28的图片储存到另一个tensor,这样就可以使用tf.summary.image将图片数据汇总给tensorboard展示了。"""# Create a multilayer model.# Input placeholderswith tf.name_scope('input'):x = tf.placeholder(tf.float32, [None, 784], name='x-input')y_ = tf.placeholder(tf.int64, [None], name='y-input')with tf.name_scope('input_reshape'):image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])tf.summary.image('input', image_shaped_input, 10)"""同时,定义神经网络模型参数的初始化方法,权重依然使用我们常用的truncated_normal进行初始化,偏置则赋值为0.1"""# We can't initialize these variables to 0 - the network will get stuck.def weight_variable(shape):"""Create a weight variable with appropriate initialization."""initial = tf.truncated_normal(shape, stddev=0.1)return tf.Variable(initial)def bias_variable(shape):"""Create a bias variable with appropriate initialization."""initial = tf.constant(0.1, shape=shape)return tf.Variable(initial)"""再定义对Variable变量的数据汇总函数,我们计算出Variable的mean、stddev、max和min,对这些标量数据使用tf.summary.scalar进行记录和汇总。同时,使用tf.summary.histogram直接记录变量var的直方图数据。"""def variable_summaries(var):"""Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""with tf.name_scope('summaries'):mean = tf.reduce_mean(var)tf.summary.scalar('mean', mean)with tf.name_scope('stddev'):stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))tf.summary.scalar('stddev', stddev)tf.summary.scalar('max', tf.reduce_max(var))tf.summary.scalar('min', tf.reduce_min(var))tf.summary.histogram('histogram', var)
"""
设计的MLP多层神经网络来训练数据,在每一层中都会对模型参数进行数据汇总。因此,我们定义创建一层神经网络并进行数据汇总的函数nn_layer。这个函数的输入参数有输入数据input_tensor、输入的维度input_dim、输出的维度output_dim和层名layer_name,激活函数act则默认使用ReLU。在函数内,先是初始化这层神经网络的权重和偏置,并使用前面定义的variable_summaries对variable进行数据汇总。然后对输入做矩阵乘法并加偏置,再将未进行激活的结果使用tf.summary.histogram统计直方图。同时,在使用激活函数后,在使用tf.summary.histogram统计一次。
"""def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):"""Reusable code for making a simple neural net layer.It does a matrix multiply, bias add, and then uses ReLU to nonlinearize.It also sets up name scoping so that the resultant graph is easy to read,and adds a number of summary ops."""# Adding a name scope ensures logical grouping of the layers in the graph.with tf.name_scope(layer_name):# This Variable will hold the state of the weights for the layerwith tf.name_scope('weights'):weights = weight_variable([input_dim, output_dim])variable_summaries(weights)with tf.name_scope('biases'):biases = bias_variable([output_dim])variable_summaries(biases)with tf.name_scope('Wx_plus_b'):preactivate = tf.matmul(input_tensor, weights) + biasestf.summary.histogram('pre_activations', preactivate)activations = act(preactivate, name='activation')tf.summary.histogram('activations', activations)return activationshidden1 = nn_layer(x, 784, 500, 'layer1')"""再创建一个Dropout层,并使用tf.summary.scalar记录keep_prob。"""with tf.name_scope('dropout'):keep_prob = tf.placeholder(tf.float32)tf.summary.scalar('dropout_keep_probability', keep_prob)dropped = tf.nn.dropout(hidden1, keep_prob)# Do not apply softmax activation yet, see below.y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)
"""
这里使用tf.losses.sparse_softmax_cross_entropy()对前面输出层的结果进行Sotfmax处理并计算交叉熵损失cross_entropy,并使用tf.summary.scalar进行统计汇总。
"""with tf.name_scope('cross_entropy'):# The raw formulation of cross-entropy,## tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.softmax(y)),#                               reduction_indices=[1]))## can be numerically unstable.## So here we use tf.losses.sparse_softmax_cross_entropy on the# raw logit outputs of the nn_layer above, and then average across# the batch.with tf.name_scope('total'):cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)tf.summary.scalar('cross_entropy', cross_entropy)"""
下面使用Adma优化器对损失进行优化,同时统计预测正确的样本数并计算准确率accuray,在使用tf.summary.scalar对accuracy进行统计汇总。
"""with tf.name_scope('train'):train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(cross_entropy)with tf.name_scope('accuracy'):with tf.name_scope('correct_prediction'):correct_prediction = tf.equal(tf.argmax(y, 1), y_)with tf.name_scope('accuracy'):accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))tf.summary.scalar('accuracy', accuracy)"""
因为之前定义了非常多的tf.summary的汇总操作,逐一执行这些操作太麻烦,所以这里使用tf.summary.merger_all()直接获取所有汇总操作,以便后面执行。定义两个tf.summary.FileWriter(文件记录器)在不同的子目录,分别用来存放训练和测试的日志数据。同时,将Session的计算图sess.graph加入训练过程的记录器,这样在TensorBoard的GRAPHS窗口中就能展示整个计算图的可视化效果。最后使用tf.global_variables_initializer().run()初始化全部变量。
"""# Merge all the summaries and write them out to# /tmp/tensorflow/mnist/logs/mnist_with_summaries (by default)merged = tf.summary.merge_all()train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/test')tf.global_variables_initializer().run()# Train the model, and also write summaries.# Every 10th step, measure test-set accuracy, and write test summaries# All other steps, run train_step on training data, & add training summariesdef feed_dict(train):"""Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""if train or FLAGS.fake_data:xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)k = FLAGS.dropoutelse:xs, ys = mnist.test.images, mnist.test.labelsk = 1.0return {x: xs, y_: ys, keep_prob: k}
"""
首先使用tf.train.Saver()创建模型的保存器,然后进入训练的循环中,每隔10步执行一次merged(数据汇总)、accuracy(求测试集上的预测准确率)操作,并使用test_write.add_sumamry将汇总结果summary和循环步数i写入日志文件;同时每隔100步,使用tf.RunOptions定义TensorFlow运行选项,其中设置trace_level为FULL_TRACE,并使用tf.RunMetadata()定义Tensorflow运行的元信息,这样可以记录训练时运算时间和内存占用等方面的信息。再执行merged数据汇总操作和train_step训练操作,将汇总结果summary和训练元信息run_metadata添加到train_writer。平时,则只执行merged操作和train_step操作,并添加summary到train_writer。所有训练全部结束后,关闭train_writer和test_writer。
"""saver = tf.train.Saver()for i in range(FLAGS.max_steps):if i % 10 == 0:  # Record summaries and test-set accuracysummary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))test_writer.add_summary(summary, i)print('Accuracy at step %s: %s' % (i, acc))else:  # Record train set summaries, and trainif i % 100 == 99:  # Record execution statsrun_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)run_metadata = tf.RunMetadata()summary, _ = sess.run([merged, train_step],feed_dict=feed_dict(True),options=run_options,run_metadata=run_metadata)train_writer.add_run_metadata(run_metadata, 'step%03d' % i)train_writer.add_summary(summary, i)saver.save(sess, log_dir+'/model.ckpt', i)print('Adding run metadata for', i)else:  # Record a summarysummary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))train_writer.add_summary(summary, i)train_writer.close()test_writer.close()def main(_):if tf.gfile.Exists(FLAGS.log_dir):tf.gfile.DeleteRecursively(FLAGS.log_dir)tf.gfile.MakeDirs(FLAGS.log_dir)train()if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--fake_data', nargs='?', const=True, type=bool,default=False,help='If true, uses fake data for unit testing.')parser.add_argument('--max_steps', type=int, default=1000,help='Number of steps to run trainer.')parser.add_argument('--learning_rate', type=float, default=0.001,help='Initial learning rate')parser.add_argument('--dropout', type=float, default=0.9,help='Keep probability for training dropout.')parser.add_argument('--data_dir',type=str,default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),'tensorflow/mnist/input_data'),help='Directory for storing input data')parser.add_argument('--log_dir',type=str,default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),'tensorflow/mnist/logs/mnist_with_summaries'),help='Summaries log directory')FLAGS, unparsed = parser.parse_known_args()tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

之后切换到Linux命令行下,执行TensorBoard程序,并通过–logdir指定TensorFlow日志路径,然后TensorBoard就可以自动生成所有汇总数据可视化的结果了。

tensorboard --logdir=/tmp/tensorflow/mnist/logs/mnist_with_summaries

这篇关于TensorBoard数据可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140881

相关文章

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

MySQL数据脱敏的实现方法

《MySQL数据脱敏的实现方法》本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下... 目录一. 数据脱敏的方法二. 字符替换脱敏1. 创建数据脱敏工具类三. 整合到数据库操作1. 创建服务类进行数据库

MySQL中处理数据的并发一致性的实现示例

《MySQL中处理数据的并发一致性的实现示例》在MySQL中处理数据的并发一致性是确保多个用户或应用程序同时访问和修改数据库时,不会导致数据冲突、数据丢失或数据不一致,MySQL通过事务和锁机制来管理... 目录一、事务(Transactions)1. 事务控制语句二、锁(Locks)1. 锁类型2. 锁粒

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.