资讯专栏INFORMATION COLUMN

tensorboard简介(含代码)

JayChen / 514人阅读

摘要:代表图中的一个节点,用于计算张量数据可以由节点构造器与产生。例如表示创建了一个类型为的,该接收和作为输入,而产生作为输出。是否能在该作用域内创建新对象由决定。

一.tensorboard简介

tensorboard是tensorflow自带的一个强大的可视化工具,也是一个web应用套件支持七种可视化包括 SCALARS(标量)、IMAGES(图像)、AUDIO(音频)、GRAPHS(数据流图)、DISTRIBUTIONS(训练数据分布图)、HISOGRAMS(训练过程中数据的柱状图)和EMBEDDINGS(展示词向量的投影分布)

一.基础知识

Tensorflow的计算表现为数据流图,因此tf.Graph类中包含了一系列表示计算的操作对象(tf.Operation),以及操作之间的流动的数据(tf.Tensor)。tf.Operation代表图中的一个节点,用于计算张量数据可以由节点构造器(tf.add)与tf.Graph.creat_op()产生。tf.Tensor是操作输出的符号句柄,不包含输出的的值,而是提供tf.Session来计算这些值的方法,这样就能构建一个数据流连接。例如c = tf.matmul(a, b)表示创建了一个类型为MatMul的Operation,该Operation接收Tensor a和Tensor b作为输入,而产生Tensor c作为输出。
在可视化的时候还需要给必要的节点添加摘要(summary),摘要会收集节点的数据,并且标记上第几步时间戳等写入事件文件(event file),tf.sunmmary.FileWriter类用于在目录中创建事件文件,并且向摘要中添加摘要和事件。如train_writer.add_summary(summary,i)。

二.mnist小程序分析

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
class tensorboard(object):

#用来生成核函数
def weight_variable(self,shape):
    weight=tf.truncated_normal(shape=shape,stddev=0.1)
    return tf.Variable(weight)
#用来生成偏置项的分布
def bias_variable(self,shape):
    bias=tf.constant(0.0,dtype=tf.float32,shape=shape)
    return tf.Variable(bias)
    

初始化某个结构层,其中我们使用tf.name_scope来创建作用域,它和tf.variable_scope的区别在于tf.name_scope只能给op_name加前缀,tf.variable_scope不仅仅可以给op_name还能给variable_name加前缀同时简要说明tf.Variable和tf.get_Variable的区别,简而言之就是tf.Variable每次都直接新建一个变量,但是tf.get_Variable先检查,如果有的话就直接返回该变量对象,否则创建对象。是否能在该作用域内创建新对象由tf.get_Variable决定。
再使用variable_summaries函数来创建该层的一些信息


def nn_layer(self,input_tensor,input_dim,output_dim,layer_name,act=tf.nn.relu):
    with tf.name_scope(layer_name):
        with tf.name_scope("weight"):
            weights=self.weight_variable([input_dim,output_dim])
            self.variable_summaries(weights)
        with tf.name_scope("bias"):
            bias=self.weight_variable([output_dim])
            self.variable_summaries(bias)
        with tf.name_scope("Wx_plus_b"):
            preactivate=tf.nn.bias_add(tf.matmul(input_tensor,weights),bias)
            #tf.summary是给必要的节点添加摘要,摘要会收集该节点的数据,在这个位置收集数据并              #且使用histogram绘制出来,效果如下图
            tf.summary.histogram("preactivate",preactivate)
        activations=act(preactivate,name="activation")
        tf.summary.histogram("activation",activations)
        return activations

接下来说明我们摘要应该包含的数据,即标量由均值、方差、最小值、最大值,同时绘制输入的张量数据的图分布

def variable_summaries(self,var):
    with tf.name_scope("sunmmaries"):
        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)
        

效果如下图,虽说训练存在问题,但是目标仅仅是为了画图

接下来是初始化函数,不做多讲

def __init__(self,max_steps=500,learning_rate=0.01,drop_out=0.9,batch_size=256):
    self.max_steps=max_steps
    self.learning_rate=learning_rate
    self.drop_out=drop_out
    self.log_dir="mnist_with_summaries"
    self.batch_size=batch_size
    self.mnist=input_data.read_data_sets("MNIST_data/",one_hot=True,source_url="http://yann.lecun.com/exdb/mnist/")
    


以下定义了结构信息,定义了图中的节点

def construct(self):
    with tf.name_scope("input"):
        self.x=tf.placeholder(dtype=tf.float32,shape=[self.batch_size,784],name="X_input")
        self.y_=tf.placeholder(dtype=tf.float32,shape=[self.batch_size,10],name="y_input")
    with tf.name_scope("input_shape"):
        image_shaped_input=tf.reshape(self.x,shape=[self.batch_size,28,28,1])
        tf.summary.image("input",image_shaped_input,10)
    hidden1=self.nn_layer(self.x,784,500,"layer1")
    with tf.name_scope("drop_out"):
        self.keep_prob=tf.placeholder(dtype=tf.float32)
        tf.summary.scalar("dropout_keep_prob",self.keep_prob)
        dropped=tf.nn.dropout(hidden1,keep_prob=self.keep_prob)
    y=self.nn_layer(dropped,500,10,"layer2",act=tf.identity)
    with tf.name_scope("cross_entropy"):
        diff=tf.nn.softmax_cross_entropy_with_logits(logits=y,labels=self.y_)
        with tf.name_scope("total"):
            cross_entropy=tf.reduce_mean(diff)
    tf.summary.scalar("cross_entropy",cross_entropy)
    with tf.name_scope("train"):
        self.train_step=tf.train.AdamOptimizer(self.learning_rate).minimize(cross_entropy)
    with tf.name_scope("accuracy"):
        with tf.name_scope("correct_prediction"):
            correct_prediction=tf.equal(tf.argmax(y),tf.argmax(self.y_))
        with tf.name_scope("accuracy"):
            self.accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    tf.summary.scalar("accuracy",self.accuracy)
    


上面的代码定义了大部分的节点名称,并且也添加了标量的摘要如accuracy等,accuracy的图不再赘述,接下来就是在运行的过程中绘制刚刚的标量和图表信息


    #为了释放TensorBoard所使用的事件文件(events file),所有的即时数据(在这里只有一个)都要在图表构建阶段合并至一个操作(op)中。
    merged=tf.summary.merge_all()
    session=tf.Session()
    #用于将Summary写入磁盘,需要制定存储路径logdir,如果传递了Graph对象,则在Graph Visualization会显示Tensor Shape Information
    train_writer=tf.summary.FileWriter(self.log_dir+"/train",session.graph)
    test_writer=tf.summary.FileWriter(self.log_dir+"/test")
    init=tf.global_variables_initializer()
    session.run(init)
    saver=tf.train.Saver()
    for i in range(self.max_steps):
        if i%100==0:
            #绘制之前的所有的图表以及标量信息
            summary,acc=session.run([merged,self.accuracy],feed_dict=self.feed_dict(False))
            test_writer.add_summary(summary,i)
            print("Accuracy at step %s: %s"%(i,acc))
        else:
            if i==499:
                #定义本模型的运行选项,并不加限制并且操作元数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
                run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
                run_metadata=tf.RunMetadata()
                summary,_=session.run([merged,self.train_step],feed_dict=self.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)
                print("Adding run metadata for",i)
            else:
                summary,_=session.run([merged,self.train_step],feed_dict=self.feed_dict(True))
                train_writer.add_summary(summary,i)
                if i%99==0:
                    print("at train step")
    train_writer.close()
    test_writer.close()
def extract(self,x,y):
    sample_num=self.mnist.train.num_examples
    idx=np.random.randint(low=0,high=(sample_num-self.batch_size))
    return x[idx:(idx+self.batch_size)],y[idx:(idx+self.batch_size)]
def feed_dict(self,train):
    if train:
        xs,ys=self.mnist.train.next_batch(self.batch_size)
        k=self.drop_out
    else:
        xs,ys=self.extract(self.mnist.train.images,self.mnist.train.labels)
        k=1.0
    return {self.x:xs,self.y_:ys,self.keep_prob:k}
    

二.结论

Tensorboard作为对TensorFlow训练过程的分析,可以对模型的问题作出更快的判断,可以加快模型的优化,应当尽量多采用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44507.html

相关文章

  • 第2话 TensorFlow 数据流图———TensorBoard的使用

    摘要:什么是数据流图使用符号计算图,这与相似,不过与相比,更简洁。这两种元素在数据流图中有自己各自的作用,其中节点代表对数据所做的运算或某种算子。 1.1 什么是数据流图 TensorFlow使用符号计算图,这与Theano相似,不过与Theano相比,TensorFlow 更简洁。TensorFlow 的名字本身描述了它自身的执行原理: Tensor (张量)意味着N维数组,Flow (流...

    li21 评论0 收藏0
  • Tensorflow代码解析(二)

    摘要:为了进一步了解的逻辑,图对和进行了展开分析。另外,在命名空间中还隐式声明了控制依赖操作,这在章节控制流中相关说明。简述是高效易用的开源库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。返回其中一块给用户,并将该内存块标识为占用。 3. TF 代码分析初步3.1 TF总体概述为了对TF有整体描述,本章节将选取TF白皮书[1]中的示例展开说明,如图 3 1所示是一个简单线性模型的TF...

    zhigoo 评论0 收藏0
  • 在阿里云Kubernetes容器服务上打造TensorFlow实验室

    摘要:准备环境阿里云容器服务目前已经上线,但是购买按量付费的计算型服务器需要申请工单开通。总结我们可以利用阿里云容器服务,轻松的搭建在云端搭建的环境,运行深度学习的实验室,并且利用追踪训练效果。 摘要: 利用Jupyter开发TensorFLow也是许多数据科学家的首选,但是如何能够快速从零搭建一套这样的环境,并且配置GPU的使用,同时支持最新的TensorFLow版本, 对于数据科学家来说...

    raise_yang 评论0 收藏0
  • 概览 AI训练服务 UAI Train

    摘要:概览概览产品简介什么是训练服务交互式训练分布式训练分布式训练简介分布式训练分布式训练产品优势产品更新记录产品定价快速上手开始使用快速上手案例介绍环境准备创建镜像仓库 概览产品简介什么是AI训练服务交互式训练分布式训练分布式训练简介TensorFlow分布式训练MXNet分布式训练产品优势产品更新记录产品定价快速上手开始使用UAI-Train快速上手-MNIST案例MNIST 介绍环境准备创建...

    ernest.wang 评论0 收藏2903
  • tensorflow可视化网络

    当我们构建一个深度学习模型时,了解模型的结构和参数是非常重要的。TensorFlow提供了一种可视化网络的编程技术,它可以帮助我们更好地理解模型的结构和参数,从而更好地调整模型以获得更好的性能。 TensorFlow提供了一个名为TensorBoard的工具,它可以可视化我们的模型。TensorBoard可以显示训练和验证的损失曲线、模型的结构、参数分布等信息。在本文中,我们将介绍如何使用Ten...

    LoftySoul 评论0 收藏1890

发表评论

0条评论

最新活动
阅读需要支付1元查看
<