tensorboard超全代码解释(调试网络)

本文深入讲解TensorBoard的使用方法,包括激活与查看graph,利用多种summary函数如scalar、histogram和image进行数据可视化,以及在MNIST手写数字识别任务中的具体应用。
摘要由CSDN通过智能技术生成

tensorboard代码解析

1)简单激活关闭graph的方法

【1】程序1.0

# coding: utf-8
import tensorflow as tf

a = tf.constant(2)
b = tf.constant(3)
x = tf.add(a, b)
with tf.Session() as sess:
    # 激活 tensorboard,把graph文件夹设在当前代码问价同目录下
    writer = tf.summary.FileWriter('./graphs', sess.graph)
    print(sess.run(x))
# close the writer
writer.close()

【2】查看graph的方法

tensorboard --logdir =./graphs/
TensorBoard 1.13.1 at http://appledeMacBook-Pro.local:6006 (Press CTRL+C to quit)

【3】结果

![image-20190606112850192](/Users/apple/Library/Application Support/typora-user-images/image-20190606112850192.png)

我们把常数,变量,运算符的集合称为ops,这里由于没有命名,所以我们应该要加上名字,再次执行:

问题:这里再次执行的tensorboard程序的graphs的结果不会覆盖上一次的,需要手动删除,然后刷新之前打开的可视化网址????也可以不执行手动删除,但是tensorboard只会显示最近的一次event文件,并且给予警告。

a = tf.constant([2, 2], name="a")
b = tf.constant([3, 6], name="b")
x = tf.add(a, b, name="add")

tensorboard上的显示

image-20190606113559465

注意:图形本身定义了操作和依赖关系,但是不显示对应的值,它只会关心运行会话时的中间值,并且会通过会话来保存这些值。

td.summary.的作用

在训练过程中主要用的函数方法,能够保存训练过程以及参数分布图并在tensorboard上显示

(1) tf.summary.scalar()

用于显示标量信息,一般画loss,accuary,和其他变量时会用到。

格式:tf.summary.scalar(tags, values, collections=None, name=None)

(2) tf.summary.histogram()

用于显示训练中变量的分布直方图,

格式:tf.summary.histogram(tags, values, collections=None, name=None)

(3) tf.summary.distribution()

分布图,一般用于显示weight的分布

(4) tf.summary.text()

可以将文本类型的数据转换为tensor写入summary中:

(5) tf.summary.image()

输出带图详的probuf,汇总数据的图像形式如下:‘tag/image/0’,‘tag/image/11’……

格式: tf.summary.image(tag, tensor, max_images=3, collections=None, name=None)

(6) tf.summary.audio()

展示训练过程中记录的音频

(7) tf.summary.merge_all()

merge_all可以将所有的summary全部保存到磁盘,以便tensorboard进行展示,如果没有特殊要求,一般用这句话可显示训练时的各种信息了。

格式:tf.summary.merge_all(key=‘summazies’)

(8) tf.summary.FileWriter()

制定一个文件用来保存图

格式; tf.summary.FileWriter(path, sess.graph)

组合:保存训练过程数据

tf.summary.scalar(‘accuracy’, acc)

merge_summary = tf.summary.merge_all()

train_writer = tf.summary.FileWriter(dir, sess.graph)

​ for step in xrange(training_step):

​ train_summary = session.run(merge_summary, feed_dict = {……})

​ train_writer.add_summary(train_summary, step)

(9) tf.summary.merge()

选择性的保存信息

格式: tf.summary.merge(input, collections=None, name=None)

MNIST手写数字识别(Tensorboard版)

# coding=utf-8
import os
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
max_step = 1000
learning_rate = 0.001
dropout = 0.5
#设置汇总数据日志的存放路径(会存放所有汇总数据供tensorboard展示)
log_dir = "mnist_with_summaries/"
if os.path.exists(log_dir) is False:
    os.makedirs(log_dir)
# 下载数据,创建会话
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()
# 为了展示节点名称,我们通常在网络设计中使用限定命名空间,这样with下的所有节点就时带有input的汇总目录:input/x-input,input/y-input
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')
#将输入的一维向量转化为28*28的图片存储到tensor,这样就可以用tf.summary.image()将图片汇总给tensorboard
with tf.name_scope('input_reshape'):
    image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
    tf.summary.image('input', image_shaped_input, 10)

# 初始化神经网络模型参数

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)


def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

#定义变量数据汇总函数,函数附带变量的直方图分布
def variable_summaries(var):
    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多层神经网络来训练数据
# 每层的命名空间有三个子空间,layer_name:weights,biases,Wx_plus_b.把所有的变量都包装到命名空间
def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
    with tf.name_scope(layer_name):
        with 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) + biases
            tf.summary.histogram('preactivate', preactivate)
        activations = act(preactivate, name='activation')
        tf.summary.histogram('activations', activations)
        return activations
# 创建layer1: 输入x代表行数,784代表28*28的维度的像素,输出的隐藏节点数为500
hidden1 = nn_layer(x, 784, 500, 'layer1')

# 创建dropout层
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)
# 再定义一层layer2: 输入的x是上一层的隐含层输出500,第二层隐含层的输出为10,表示类别。同时激活函数为全等映射identity
y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)

# 损失计算:对前面输出层的结果进行sofmax处理并计算交叉墒cross_entropy,然后计算平均的损失并进行标量统计
with tf.name_scope('cross_entropy'):
    diff = tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)
    with tf.name_scope('total'):
        cross_entropy = tf.reduce_mean(diff)
tf.summary.scalar('cross_entropy', cross_entropy)

# 优化使用:Adma 优化器对损失进行优化,同时统计预测正确的样本数并计算正确率accurcy,并进行标量统计
with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
with tf.name_scope('accurcy'):
    with tf.name_scope('correct_prediction'):
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    with tf.name_scope('accuracy'):
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)
#因为我们之前定义了很多的tf.summary的汇总操作,逐一执行这种操作比较麻烦,所以这里使用tf.summary.merge_all()直接获取所有的汇总操作。
#然后定义两个tf.summary.FileWriter(文件记录器),在不同的子目录,分别用来存放训练和测试的日志数据
#同时,将session的计算图,sess.graph.加入训练过程的记录器,这样就能在tensorboard的GRAPH窗口中就能展示整个计算图的可视化效果。
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(log_dir + 'train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')
tf.global_variables_initializer().run()

#开始定义喂数据的函数,训练阶段喂什么数据,测试阶段喂什么数据,测试的时候不进行dropout
def feed_dict(train):
    if train:
        xs, ys = mnist.train.next_batch(100)
        k = dropout
    else:
        xs, ys = mnist.test.images, mnist.test.labels
        k = 1.0
    return {x: xs, y_: ys, keep_prob: k}
#1)首先 tf.train.Saver()创建模型的保存器,然后进入训练的循环,每10步执行一次merged(数据汇总),accuracy(求测试集上的预测准确率)操作,并使用 test_writer.add_summary将汇总结果summary和循环步数i写入日志文件
2)同时每隔100步,使用tf.RunOptions定义Tensorflow运行选项,其中设置trace_level为FULL_TRACE,并使用tf.RunMatadata()定义Tensorflow运行的元信息,这样可以记录训练时运算时间和内存占用等方面的信息。
3)执行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(max_step):
    if i % 10 == 0:
        summary, 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:
        if i % 100 == 99:
            run_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:
            summary, _ = sess.run([merged, train_step],
                                  feed_dict=feed_dict(True))
            train_writer.add_summary(summary, i)
    train_writer.close()
    test_writer.close()
    
    
    tensorboard --logdir=./mnist_with_summaries/train 
    
    

![image-20190606172606802](/Users/apple/Library/Application Support/typora-user-images/image-20190606172606802.png)

链接:https://pan.baidu.com/s/1q7Y-i-KUn6jFL8j4Addp5A 密码:d494

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值