tensorboard的使用

Get start tensorboard

Posted by xhhszc on April 25, 2018

tensorboard的使用


1. 在模型中加入要可视化的元素:

以下代码摘自TensorFlow官网 有中文注释的地方即为需要在代码添加可视化的元素。

def variable_summaries(var):#记录变量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)#记录变量var的均值
    with tf.name_scope('stddev'):
      stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
    tf.summary.scalar('stddev', stddev)#记录变量var的方差
    tf.summary.scalar('max', tf.reduce_max(var))#记录变量var的最大值
    tf.summary.scalar('min', tf.reduce_min(var))#记录变量var的最小值
    tf.summary.histogram('histogram', var)#记录变量var的直方图

def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):  
  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'):
  with tf.name_scope('total'):
    cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)
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)#记录准确率的变化

2.在模型中定义好日志的路径

该路径下的日志是tensorboard可视化时所需要调用的信息。 需要注意的是,该路径设置时,可以是相对路径,但要求绝对路径中不含中文字符,否则容易出现问题。

# Merge all the summaries and write them out to /tmp/mnist_logs (by default)
merged = tf.summary.merge_all() # 定义记录所有定义元素的信息的句柄merged
train_writer = tf.summary.FileWriter('/train', sess.graph)# 定义日志文件的句柄
tf.global_variables_initializer().run()#初始化所有变量

3. 在主函数中运行对应的句柄

for i in range(10000):
  if i % 10 == 0:  # 每10次就记录一次日志信息
    summary = sess.run(merged, feed_dict={x: xs, y_: ys, keep_prob: k})
    #运行merged时,需要输入与要记录的日志元素相关的信息,
    #一般情况下,需要提供所有定义的placehoder信息
    test_writer.add_summary(summary, i)#写入日志

4. 运行程序

5.在主函数程序路径下,启用tensorboard

tensorboard --logdir=your/log/direction --port=6006
  • logdir:为第2步中定义的路径,但此处的logdir必须写绝对路径,且路径中不含中文字符。
  • port: 端口号,不填的时候默认为6006,但有时候该端口可能会被占用,因此可以用这个参数换另外的端口 想重点提醒的是,如果不使用tensorboard服务的时候,请务必使用ctrl+c关闭该进程,如果使用ctrl+z的话并不能释放掉占用的端口,下一次再重启tensorboard的话,会显示6006端口已被占用。 #6.将服务器的6006端口重定向到自己机器上来 如果你运行的程序是在本地机器上,那么请忽略这个步骤,直接执行步骤7 但如果你运行的程序在服务器上,需要通过自己的本地电脑查看tensorboard的可视化,那么就需要执行该步骤。
     ssh -L 16005:127.0.0.1:6006 yourUserNameForServer@serverIP
    
  • 16005为转接到本地的端口,可以自行设置
  • 127.0.0.1表示本机 如果你是window系统,推荐你安装mobaxterm,因为并不是所有的shell软件都可以支持这个指令,例如我之前用的Xshell就不支持。

7.在浏览器中查看tensorboard

打开你的浏览器,输入地址。 如果你的程序是在本地机器上,那么输入地址为:localhost:6006 如果你的程序是在服务器上,那么输入地址为:localhost:16005 然后你就可以查看 TensorBoard 了,您会看到右上角的导航标签。每个标签代表一组可供可视化的序列化数据。 这里写图片描述

Tips

步骤4、5、6的顺序并不是固定的,可以有两种顺序:4、5、6或6、4、5