UP | HOME

Tensorboard 的使用

Table of Contents

1 Tensorflow_4_Tensorboard

epoch_decay learning rate. 随着epoch次数逐渐减小的 learning rate 防止出现 learning rate [步幅过大] 不断从最低点跨过(从左跨到右,又从右跨到左)的情况出现.

learning rate 可以设置为一个 Variable, 然后在每次 epoch 开始时, 通过 tf.run(tf.assign(lr, lr_init*(0.95**epoch))) 来更新.

2 Tensorboard 显示网络结构

代码架构

<<包导入>>

<<数据准备>>
# numpy构造(with/without noise)
# 从已有数据集导入内存

<<图参数>>
# 批次大小, 批次数量
# dropout 保留率
<<图构造>>
# 一模: NN layers, name_scope for TB
# 两函: err fn(单点错误), loss fn(整体错误)
# 两器: 初始化器, 优化器
# 准确率计算

<<图计算>>
# 运行两器
# 获得准确率
# summary Writer for TB
# 绘图
 1: import tensorflow as tf
 2: from tensorflow.examples.tutorials.mnist import input_data
 3: 
 4: # 载入数据
 5: mnist = input_data.read_data_sets("MNIST", one_hot=True)
 6: 
 7: # 设置批次大小
 8: batch_size = 100
 9: # 计算共有多少批次
10: n_batch = mnist.train.num_examples // batch_size
11: 
12: # TB:想在TB把某几个node放在一起显示为一个整体模块, 要把他们置于一个命名空间
13: with tf.name_scope('input'):                            # (name_scope)
14:     # 定义两个 placeholder <<< 需要调整到 name_scope 下
15:     x = tf.placeholder(tf.float32, [None, 784], name='x-input')
16:     y = tf.placeholder(tf.float32, [None, 10], name='y-input')
17: 
18: 
19: # TB:想在TB把某几个node放在一起显示为一个整体模块, 要把他们置于一个命名空间
20: with tf.name_scope('layer'):
21:     # 创建简单神经网络(无隐藏层)
22:     with tf.name_scope('wights'):
23:         W = tf.Variable(tf.zeros([784, 10]), name='W')
24:     with tf.name_scope('bias'):
25:         b = tf.Variable(tf.zeros([10]), name='bias')
26:     with tf.name_scope('score'):
27:         score = tf.matmul(x, W) + b
28:     with tf.name_scope('softmax'):
29:         prediction = tf.nn.softmax(score)
30: 
31: # 二函,二器
32: init = tf.global_variables_initializer()
33: optimizer = tf.train.GradientDescentOptimizer(0.2)
34: loss = tf.reduce_mean(tf.square(y-prediction))
35: train = optimizer.minimize(loss)
36: 
37: # 预测对错存在一个向量中
38: correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(prediction, 1)) # (count correct prediction)
39: # 计算准确率
40: accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
41: 
42: # 图计算
43: with tf.Session() as sess:
44:     sess.run(init)
45:     # TB: 这里需要添加一个 writer
46:     writer = tf.summary.FileWriter('/home/yiddi/git_repos/on_ml_tensorflow/logs/', sess.graph) # (writer)
47:     writer.close()
48:     # 采取训练一轮就测试一轮的方式
49:     for epoch in range(2):
50:         # 训练模型
51:         acc_train = 0
52:         for batch in range(n_batch):
53:             batch_xs, batch_ys = mnist.train.next_batch(batch_size)
54:             _, acc_train = sess.run([train, accuracy], feed_dict={x:batch_xs, y:batch_ys})
55: 
56:         # 测试模型
57:         # 测试集必须使用已经训练完毕的模型
58:         acc_test = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels})
59:         print("Iter " + str(epoch) + " ,Train:" + str(acc_train) + " ,Test:" + str(acc_test))

screenshot_2018-07-30_00-33-23.png

TensorBoard使用第一步就是要建立一个命名空间, 其下定义placeholder, 并且赋名.

其次需要在图计算时把图对象写入文档中

                             文件夹位置
                               -------
writer = tf.summary.FileWriter('logs/', sess.graph) (writer)
                                        ----------
                                        本对话所计算的 graph 对象引用

当你第二次次运行的你 NN 代码的时候, 第一次的 graph 可能还存储在内存中. 这时候使用 TensorBoard 去观察是两张图叠加到一起的结果.

为了防止图被重复的载入内存, 应按照如下步骤运行:

# 1. <<get-pid>>
# 2. <<kill-pid>>
# 3. <<del-graph-summary>>
# 4. build, compute graph and write it into summary file
# 5. <<run-tensorboard>>

TODO: It's better to give a :var to get-pid which represent the session name of python src block which used to build and compute graph

ps -aux | grep "python" | grep -E "(lec4|tensorboard)" | grep -v "grep" | awk '{print $2}'
17474
17480

TODO: 这个 kill-pid 只能接受 sequence 类型不能接受单体, 修正使其可以接受单体.

(defun r1l(tbl)
  (mapcar (lambda (x) (number-to-string (car x))) tbl)
  )
(mapcar #'shell-command-to-string
        (mapcar (lambda (x) (concat "kill " x)) (r1l pid))))
     
rm -rf /home/yiddi/git_repos/on_ml_tensorflow/logs/*
ls /home/yiddi/git_repos/on_ml_tensorflow/logs

TODO: https://stackoverflow.com/questions/31835337/emacs-org-mode-how-to-run-shell-scripts-with-backgrounded-processes-without-ha

run shell command below in a async manner, the predefined argument ":async t" not avaiable for shell

tensorboard --logdir=/home/yiddi/git_repos/on_ml_tensorflow/logs
注意 org babel 运行结果如果是一个 table 的话, 每一行作为一个 list, 所有行再组成
一个 list, 所以每一个 table 都是二维 list

| 29968 |
| 29973 | ===> ((29968)(29973))


|  29968 |   2342 |
|  29973 | 234234 | ===> ((29968 2352)(29973 234234)(234234 121))
| 234234 |    121 |

TODO: org babel + yasnippet + org table 可以做的事情简直太多了, 比如这种

for i in range(30):
    <<src-block-name>>

可以把这种模式应用到对整个 ML 代码架构的定义和组织上.

比如 table 是可以放置代码名字在上面的, 而且支持 spreadsheet, 可以形成一个 table:

参数1 参数2 参数3 loss acc_test acc_train
             

table ===> 散点图(elisp or python 都可以 用来绘制 acc-test acc-train 关系图) 等等, 甚至还可以写程序根据两者数据的趋势自动调整参数,之后再进行训练.

      自动调参, 自动训练, 自动绘图 ->-+
         ^                            |
         |                            |
         +----------------------------+