TensorBoard:可视化学习

我是一个很懒的人,我想试试

希望我能坚持到最后,把tensorflow的官方教程全部翻译出来

提高自己,也帮助他人

TensorBoard: Visualizing Learning

使用 TensorFlow 计算,如训练一个大型的深度神经网络,可能会非常的复杂与难以理解。为了使其容易理解,调试和优化 TensorFlow 程序,我们有一套叫做 TensorBoard 的可视化工具。你可以使用 TensorBoard 可视化你的 TensorFlow 图,绘制图执行的量化指标,并通过它以图像的形式显示附加的数据。当 TensorBoard 设置完成后,它看起来就像下面这样:

MNIST TensorBoard

本教程旨在教会你入门简单的 TensorBoard 用法。还有其他的资源是可用的。如 TensorBoard's GitHub 有很多关于 TensorBoard 使用的信息,包括了提示,技巧以及调试信息。

Serializing the data

TensorBoard 通过读取 TensorFlow 事件文件来操作,它包括了运行 TensorFlow 过程中生成的汇总数据。以下是 TensorBoard 在一般的生命周期中产生的汇总数据。

首先,创建你想要收集汇总数据的 TensorFlow 图,并决定你想要哪个节点使用 汇总操作 注释(annotate)。

例如,假设你要训练一个卷积神经网络识别 MNIST 数字,你想要记录在整个训练过程中学习率是如何变化的,目标函数是如何变化的。通过向节点附加 tf.summary.scalar 操作来收集这些数据,并分别输出学习率和损失。然后给每个 scalar_summary 一个有意义的 tag,如'learning rate' or 'loss function'

也许你想要可视化一个特定层的激活分布,或者梯度或者权重的分布。可以通过分别向梯度输出和权重变量附加 tf.summary.histogram 操作来收集这些数据。

有关可用的汇总操作的所有详细信息,请查阅有关文档summary operations

在 TensorFlow 中,操作只有当你执行或者一个操作依赖它的输出时才会执行。我们创建的汇总节点(summary nodes)都围绕在你的图的边上:没有一个操作的运行是依赖它们的。所以,为了生成汇总节点,我们需要运行所有的汇总节点。手动管理这些是很乏味的,所以使用 tf.summary.merge_all 联合它们到一个操作来生成所有的汇总数据。

然后你可以只执行合并汇总操作,它将在一个给定的步骤将所有的汇总数据生成一个序列化的Summary protobuf 对象。最后,为了将这个汇总数据写入到硬盘,传递汇总 protobuf 到tf.summary.FileWriter

FileWriter 的构造函数是带有 logdir 参数的——这个 logdir 非常重要,是所有的事件输出的目录。FileWriter 在构造函数中也可以使用Graph 这个可选参数。如果接收到一个Graph 对象,那么 TensorBoard 将随着张量 shape 信息可视化 graph。这将使你更好的理解图中运行情况:请查阅 Tensor shape information

注意你已经修改了你的 graph,并有了一个 FileWriter ,你已准备开始运行你的网络了!如果你需要,你可以在每一步中运行合并汇总操作并保存大量的训练数据。这样你将得到超出你需要的很多的数据,相反你可以考虑每 n 个步骤运行一次合并汇总操作。

以下代码实例修改于 simple MNIST tutorial ,我们只是增加了一些汇总操作,并每十个步骤运行一次它们。如果你运行这个并启动 tensorboard --logdir=/tmp/tensorflow/mnist ,你将能够可视化这些统计数据,例如在训练期间,权重或者准确率是如何变化的。以下只是代码的部分,完整代码 在这

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)

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 layer
    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('pre_activations', preactivate)
    activations = act(preactivate, name='activation')
    tf.summary.histogram('activations', activations)
    return activations

hidden1 = nn_layer(x, 784, 500, 'layer1')

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)

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.nn.softmax_cross_entropy_with_logits on the
  # raw outputs of the nn_layer above, and then average across
  # the batch.
  diff = tf.nn.softmax_cross_entropy_with_logits(targets=y_, logits=y)
  with tf.name_scope('total'):
    cross_entropy = tf.reduce_mean(diff)
tf.summary.scalar('cross_entropy', cross_entropy)

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), tf.argmax(y_, 1))
  with tf.name_scope('accuracy'):
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)

# Merge all the summaries and write them out to /tmp/mnist_logs (by default)
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train',
                                      sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')
tf.global_variables_initializer().run()

在我们初始化 FileWriters 之后,我们必须在我们训练和测试模型时附加汇总到 FileWriters

# 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 summaries

def 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.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(FLAGS.max_steps):
  if i % 10 == 0:  # Record summaries and test-set accuracy
    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:  # Record train set summaries, and train
    summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
    train_writer.add_summary(summary, i)

你现在已经准备好使用 TensorBoard 可视化这些数据。

Launching TensorBoard

运行 TensorBoard,请使用以下命令(或者 python -m tensorboard.main)

tensorboard --logdir=path/to/log-directory

其中logdir 指向FileWriter 序列化其数据的目录。如果logdir 目录包含单独运行的序列化数据的子目录,TensorBoard 将可视化所有的这些运行的数据。一旦 TensorBoard 运行起来,输入 localhost:6006 到你的 web 浏览器,已查看 TensorBoard。

当浏览 TensorBoard 时,你将在右上角看到导航标签。每个标签表示可以可视化的一系列序列化数据。

有关如何使用 graph 选项卡可视化图的更多信息,请查阅 TensorBoard: Graph Visualization

有关 TensorBoard 的更多的使用信息,请查阅 TensorBoard's GitHub

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

推荐阅读更多精彩内容