TensorFlow笔记-tensorboard的使用

参考:
Tensorflow的可视化工具Tensorboard的初步使用
Link: https://blog.csdn.net/sinat_33761963/article/details/62433234?utm_source=copy


Tensorboard 可视化


可以记录的数据类型
(1) scalar
(2) Graph
(3) Distribution
...
可视化的过程


(1) 建立graph

(2) 确定在哪些节点放置summary operations记录信息
这里的summary操作也是operations
tf.summary.scalar 用来记录标量
tf.summary.distributation 用来记录数据分布图
tf.summary.image 用来记录图像数据

(3)我们需要的summary可能很多,这里的summary作为operations自然需要去run, 但是这些operations并没有被其他的operation 所依赖, 所以每个operation需要手动的去run, 为了方便,使用了tf.summary.merge_all()来将所有的summary节点合并成为一个节点, 只要运行这个节点,就能获得之前设置的summary data。

(4) 使用tf.summary.FileWriter将运行后的数据全部的写入到磁盘中。

(5) tensorboard --logdir=xxx

Code


# -*- coding: utf-8 -*-

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

max_step = 1000
learning_rate = 0.001
dropout = 0.9
data_dir = "/tmp/mnist"
# log_dir下将会分为两个目录, train, test,分别存放了train, test的summary
log_dir = "/tmp/tensorflow" 

mnist = input_data.read_data_sets(data_dir, one_hot=True)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config)

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")

with tf.name_scope("input_shape"):
    image_shape_input = tf.reshape(x, [-1, 28, 28, 1])
    tf.summary.image("input", image_shape_input, 10) # 命名,数据, 显示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)

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("bias"):
            biases = bias_variable([output_dim, ])
            variable_summaries(biases)
        with tf.name_scope("linear_compute"):
            preactivate = tf.matmul(input_tensor, weights) + biases
            tf.summary.histogram("linear", preactivate)
        activations = act(preactivate, name="activation")
        tf.summary.histogram("activations", activations)
        return activations

hidden1 = nn_layer(x, 784, 500, "layer_1")

with tf.name_scope("dropout"):
    keep_prob = tf.placeholder(tf.float32)  # 这里使用了一个placeholder, 可以使用variable, assign代替
    tf.summary.scalar("dropout_keep_probability", keep_prob)
    dropped = tf.nn.dropout(hidden1, keep_prob)

# predict
y = nn_layer(dropped, 500, 10, "layer_2", act=tf.identity)

with tf.name_scope("loss"):
    diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
    with tf.name_scope("total"):
        cross_entropy = tf.reduce_mean(diff)

tf.summary.scalar("loss", cross_entropy)

with tf.name_scope("train"):
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

with tf.name_scope("accuracy"):
    with tf.name_scope("correct_pridiction"):
        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)

merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(log_dir+"/train", session.graph)
test_writer = tf.summary.FileWriter(log_dir+"/test")

session.run(tf.global_variables_initializer())


def feed_dict(train):
    if train:
        xs, ys = mnist.train.next_batch(1000)
        k = dropout
    else:
        xs, ys = mnist.test.images, mnist.test.labels
        k = 1.0
    return {x: xs, y_: ys, keep_prob: k}


for i in range(max_step):
    if i % 10 == 0:
        summary, acc = session.run([merged, accuracy], feed_dict=feed_dict(False))
        test_writer.add_summary(summary, i)
    else:
        if i % 100 == 99:
            pass
        else:
                        # summary的类型为string, session.run(tensor) 返回类型可能是由tensor决定的
            summary, _ = session.run([merged, train_step], feed_dict=feed_dict(train=True))
            train_writer.add_summary(summary, i)

summaries:

  • image

  • variable (mean(var)| stddev(var)| max(var)| min(var)| var)

  • preactive

  • activation

  • keep_prob

  • entropy_loss

  • accuracy

  • image
    tf.summary.image('input', image_shape_input, 10)
    由于在input_shape 这个name_scope下, 所以图片的标识为input_shape/input/image/0,这里的image猜测是tensorflow自己加的。

    imageinput.png

  • accuracy

accuracy = tf.reduce_sum(tf.cast(correction_prediction, tf.float32)
tf.summary.scalar("accuracy", accuracy)
accuracy1.png
merged = tf.summary.merge_all()
summary, _ = session.run([merged, train_step], feed_dict=feed_dict(train=True))

merged集合所有的summary, 这里的summary类型为Image, scalar, histogram。session.run的返回值summary为 string, writer.add_summary相当于将这个string写入到文件中。summary格式很复杂, 因为其要包含很多的格式的数据。例如这里的summary包含了scalar, image, histogram。二进制数据与文本数据混合。

��
�input_shape/input/image/0"������"���PNG
�
���9����}�6����B�H�����o/����Q�4k�5O�nz���_�F���f�T��ӛ���Ȼ"u�w��8h\��qbM@�x�<�B�ݒ�9{�<������2tP�  XH    IEND�B`�
��
�input_shape/input/image/1"������"���PNG
�
��ˬO����a�4�r��4W{��?}��    �~ ��>�U�ҫ�[��[��u��s8R}�
���d��|o� �&^�J�d�g�� XY�˕i��� ̋���g1� �;��l�dhs� �����SrZ;�|�`2������p�P�����0��f]z��� �/����5Z��ċ�?��U~]�����y��mc;�    IEND�B`�
��
�input_shape/input/image/2"������"���PNG
�
IHDR   �       Wf�H  �&IDAT(�c`�H0��,�����+J���� �_�&�����������˷o?�0�I��E��pa&�����)(�������1��v��<���Y��?���� ��������ߝaF$%�er{/K>�rM3S�֟0'��E��ك��g�����`�*�d```�7����w�k�J�݇��������Y!�����0�H#x��?(#Ir�3!�L���c�������!�l���'��a``�    i�c���)�To0000��c���Qc`���$U�o~�A��Er��D�f,�zV*�������_�^��˩�� "����$`�    IEND�B`�
��

对于session.run(), 传入的参数为可以为Tensor, Operation(eg: train_step).

""" 
def run(self, fetches, feed_dict=None, options=None, run_metadata=None): 
The `fetches` argument may be a single graph element, or an arbitrarily
    nested list, tuple, namedtuple, dict, or OrderedDict containing graph
    elements at its leaves.  A graph element can be one of the following types:

    * An @{tf.Operation}.
      The corresponding fetched value will be `None`.
    * A @{tf.Tensor}.
      The corresponding fetched value will be a numpy ndarray containing the
      value of that tensor.
    * A @{tf.SparseTensor}.
      The corresponding fetched value will be a
      @{tf.SparseTensorValue}
      containing the value of that sparse tensor.
    * A `get_tensor_handle` op.  The corresponding fetched value will be a
      numpy ndarray containing the handle of that tensor.
    * A `string` which is the name of a tensor or operation in the graph.
"""

Tensor & Operation Name属性

with tf.name_scope("accuracy"):
    with tf.name_scope("correct_pridiction"):
        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))

这里得到的两个变量accuracy, correct_prediction,分别为accuracy/accuracy/Mean:0accuracy/correct_pridiction/Equal:0, 那么这里Tensor的名称在name_scope的基础上再一步添加了Mean:0以及Equal:0, 表示了得到这个Tensor所进行的操作。
Tensorflow为何要使用这么多的name_scope, Operation来作为这里的Tensor的名称呢。为了方便debug么。

,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容