TensorFlow-6-TensorBoard 可视化学习
学习资料: https://www.tensorflow.org/get_started/summaries_and_tensorboard
中文翻译: http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/summaries_and_tensorboard.html
今天学的内容是 TensorBoard 它的作用就是可以把复杂的神经网络训练过程给可视化,可以更好地理解 调试 优化程序。
在之前的几节,我们都只是建立了模型,例如这个代码: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py
这一节我们我们可以把想看的东西显示出来,如 accuracy,cross entropy,bias 和 weights 等等。
先来看效果:
如下图,就可以在 Tensorboard 的 scalars 下看到 accuracy,cross entropy,dropout,layer1 和 layer2 的 bias 和 weights 的趋势
主要用到的了下面四个方法 其他可以看 Summary Operations: https://www.tensorflow.org/api_guides/python/summary
- tf.summary.scalar
- tf.summary.histogram
- tf.summary.merge_all
- tf.summary.FileWriter
1. tf.summary.scalar
当你想知道 learning rate 如何变化时,目标函数如何变化时,就可以通过向节点附加 tf.summary.scalar
操作来分别输出学习速度和期望误差,可以给每个 scalary_summary
分配一个有意义的标签为 'learning rate' 和 'loss function',执行后就可以看到可视化的图表。
2. tf.summary.histogram
当你想看 activations, gradients 或者 weights 的分布时,可以用 tf.summary.histogram
。
如下图,显示了每一步的分布,越靠前面就是越新的步数的结果。
3. tf.summary.merge_all
在 TensorFlow 中,所有的操作只有当你执行,或者一个操作依赖于它的输出时才会运行。为了生成 summaries,我们需要运行所有 summary nodes,所以就用 tf.summary.merge_all
来将它们合并为一个操作,这样就可以产生所有的 summary data。
4. tf.summary.FileWriter
最后,为了将 summary data 写入磁盘,需要将 Summary protobuf 对象传递给 tf.summary.FileWriter
。在这个造函数中包含了参数 logdir
,这个 logdir 很重要,所有事件都会写到它所指的目录下。
那么上面的图是怎么产生的呢?
完整代码有点长,请前往链接: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py
如果是 mac 的话,可以在终端运行上述代码:
$ python mnist_with_summaries.py
然后就可以看到打印过程:
注意代码里将 log dir 定义为下面这个地址:
所以在打开 tensorboard 时,输入相应的位置:
$ tensorboard --logdir=/tmp/tensorflow/mnist/logs/mnist_with_summaries
输入上述命令后,会打印一个 IP 地址,在浏览器打开
这样,就可以看到 bar 上的几个板块了:
除上面几个外,还可以在 graphs 里可以看到 TensorFlow model。 更详细的可以查看: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tensorboard
再聊细一点:
关于 scalars 的生成 代码中有这样几行:
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)
在这里对 wights 和 bias 作用了 variable_summaries
。
而 variable_summaries
里面有计算 mean,max,min,stddev 的 tf.summary.scalar
操作。
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)
执行后,就可以看到下图:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyQt5 技巧篇-增加一个类级变量,类级变量的设置方法,类级"常量"设置方法
- PyQt5 技巧篇-按钮隐藏并保留位置,设置按钮的可见度,设置按钮透明度
- PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
- PyQt5 技巧篇-QWidget、Dialog界面固定大小设置
- 力扣:地下城游戏,手把手教你做困难题
- RN布局
- 学会MySQL主从复制读写分离,看这篇就够了
- Canal+Kafka实现MySQL与Redis数据同步
- 超详细canal入门,看这篇就够了
- 详细讲解!RabbitMQ防止数据丢失
- 详细讲解!从秒杀聊到ZooKeeper分布式锁
- 正确使用 wait/notify/notify方法以及源码解析
- 秒杀商品超卖事故:Redis分布式锁请慎用!
- 3D开发是一个生态,ThingJS支持js,css,json,html外部资源引用
- 手把手教你实现xxl-job分布式任务调度平台搭建