什么是TensorBoard?
前言
只有光头才能变强。
文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y
回顾前面:
这篇文章主要讲讲TensorBoard的基本使用以及name_scope和variable_scope的区别
一、入门TensorBoard
首先来讲讲TensorBoard是什么吧,我当时是在官方文档里学习的,官网也放出了介绍TensorBoard的视频。我在b站搜了一把,发现也有,大家可以先去看看视频了解一下(其实已经说得很好了):
为了更方便 TensorFlow 程序的理解、调试与优化,于是就有了TensorBoard 这样的的可视化工具
因为我们编写出来的TensorFlow程序,建好一个神经网络,其实我们也不知道神经网络里头具体细节到底做了什么,要人工调试十分困难(就好比你无法想象出递归的所有步骤一样)。有了TensorBoard,可以将TensorFlow程序的执行步骤都显示出来,非常直观。并且,我们可以对训练的参数(比如loss值)进行统计,用图的方式来查看变化的趋势。
1.1 name_scope和variable_scope
在视频中其实也有提到,我们想要TensorBoard的图能够更好地展示(更加有条理),那一般我们需要对其用name_scope取名。
那除了name_scope,还有一个叫做variable_scope。那他们有什么区别呢?顾名思义,name_scope是一个名称作用域,variable_scope是变量作用域。
在前面文章中,创建变量有两种方式,一种是用tf.get_variable()来创建,一种是用tf.Variable()来创建。这两种创建方式也是有区别的。
- 在
tf.name_scope下时,tf.get_variable()创建的变量名不受name_scope的影响,而且在未指定共享变量时,如果重名就会报错。tf.Variable()会自动检测有没有变量重名,如果有则会自行处理(自动创建一个)
比如下面的代码:
with tf.name_scope('name_sp1') as scp1:
with tf.variable_scope('var_scp2') as scp2:
with tf.name_scope('name_scp3') as scp3:
a = tf.Variable('a')
b = tf.get_variable('b')
等同于:
with tf.name_scope('name_sp1') as scp1:
with tf.name_scope('name_sp2') as scp2:
with tf.name_scope('name_scp3') as scp3:
a = tf.Variable('a')
with tf.variable_scope('var_scp2') as scp2:
b = tf.get_variable('b')
这里体现的是如果用get_variable的方式来创建对象,是不受name_scope所影响的。
要注意的是,下面的代码会报错。因为在scp作用域下压根就没有a这个变量,同时又设置成reuse=True。这里因为的是找不到共享变量而出错!
with tf.variable_scope('scp', reuse=True) as scp:
a = tf.get_varialbe('a') #报错
同样地,下面的代码也会报错,因为明明已经有共享变量了,但设置成reuse=false。所以就会报错。
with tf.variable_scope('scp', reuse=False) as scp:
a = tf.get_varialbe('a')
a = tf.get_varialbe('a') #报错
最后,我们再来看这个例子,应该就可以看懂了。
with tf.variable_scope('variable_scope_y') as scope:
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
scope.reuse_variables() # 设置共享变量
var1_reuse = tf.get_variable(name='var1')
var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var1_reuse.name, sess.run(var1_reuse))
print(var2.name, sess.run(var2))
print(var2_reuse.name, sess.run(var2_reuse))
# 输出结果:
# variable_scope_y/var1:0 [-1.59682846]
# variable_scope_y/var1:0 [-1.59682846] 可以看到变量var1_reuse重复使用了var1
# variable_scope_y/var2:0 [ 2.]
# variable_scope_y/var2_1:0 [ 2.]
参考资料:
1.2 TensorBoard例子
下面我们来看一个TensorBoard简单的入门例子,感受一下:
def learn_tensor_board_2():
# prepare the original data
with tf.name_scope('data'):
x_data = np.random.rand(100).astype(np.float32)
y_data = 0.3 * x_data + 0.1
##creat parameters
with tf.name_scope('parameters'):
with tf.name_scope('weights'):
weight = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
tf.summary.histogram('weight', weight)
with tf.name_scope('biases'):
bias = tf.Variable(tf.zeros([1]))
tf.summary.histogram('bias', bias)
##get y_prediction
with tf.name_scope('y_prediction'):
y_prediction = weight * x_data + bias
##compute the loss
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(y_data - y_prediction))
tf.summary.scalar('loss', loss)
##creat optimizer
optimizer = tf.train.GradientDescentOptimizer(0.5)
# creat train ,minimize the loss
with tf.name_scope('train'):
train = optimizer.minimize(loss)
# creat init
with tf.name_scope('init'):
init = tf.global_variables_initializer()
##creat a Session
sess = tf.Session()
# merged
merged = tf.summary.merge_all()
##initialize
writer = tf.summary.FileWriter("/Users/zhongfucheng/tensorboard/loss-2", sess.graph)
sess.run(init)
## Loop
for step in range(201):
sess.run(train)
rs = sess.run(merged)
writer.add_summary(rs, step)
if __name__ == '__main__':
learn_tensor_board_2()
# 启动完了之后,要在命令行上运行tensor_board的命令,指定其目录,最后我们就可以通过6006的默认端口访问我们的图。
(例子来源网络,我改动了一下,出处我忘了,侵删~)
接下来,我们启动一下TensorBoard,看看图是怎么样的,启动命令如下:
tensorboard --logdir=/Users/zhongfucheng/tensorboard/loss-2
启动成功的图:
通过6006端口我们去访问一下,首先我们可以检测到loss值的变更:
我们也可以查看TensorFlow程序大概的执行步骤:
参数w和b的直方图:
总之,TensorBoard可以方便地查看我们参数的变化,以便更好理解我们写的代码。
参考资料:
最后
乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!
觉得我的文章写得不错,不妨点一下赞!
什么是TensorBoard?的更多相关文章
- Tensorflow学习笔记3:TensorBoard可视化学习
TensorBoard简介 Tensorflow发布包中提供了TensorBoard,用于展示Tensorflow任务在计算过程中的Graph.定量指标图以及附加数据.大致的效果如下所示, Tenso ...
- TensorFlow深度学习笔记 Tensorboard入门
转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程: https://ww ...
- TensorBoard:Visualizing Learning 学习笔记
为了更方便的理解.调试和优化TF程序,我们可以使用TensorBoard(可视化工具).可以使用TensorBoard查看graph,绘制图表执行过程中的定量指标.TensorBoard是完全可配置的 ...
- 初识Tensorboard
1.什么是Tensorboard? PPT设计原则中有这样一条,叫"文不如表,表不如图",可见图表在表达中更为直观.明确.程序设计中也是一样,我们经常用图表来描述程序的结构和流程, ...
- tensorflow笔记(三)之 tensorboard的使用
tensorflow笔记(三)之 tensorboard的使用 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7429344.h ...
- TensorFlow框架(2)之TensorBoard详解
为了更方便 TensorFlow 程序的理解.调试与优化,TensorFlow发布了一套叫做 TensorBoard 的可视化工具.你可以用 TensorBoard 来展现你的 TensorFlow ...
- TensorBoard使用
关于TensorBoard的安装是在安装Tensorflow的过程中就已经默认安装好了,所以安装了Tensorflow就不需要再安装TensorBoard,直接使用就可以了. 具体的使用方法: 命令行 ...
- TFboy养成记 tensorboard
首先介绍几个用法: with tf.name_scope(name = "inputs"): 这个是用于区分区域的.如,train,inputs等. xs = tf.placeho ...
- TensorBoard 使用和问题解决
TensorBoard 使用和问题解决 一.启动TensorBoard 1) python tensorflow/tensorboard/tensorboard.py --logdir=path/to ...
- Docker 运行Tensorboard 和 jupyter的正确方法
Docker 运行Tensorboard 和 jupyter的正确方法 网上找了很多方法都是jupyter 运行正常但不知道如何打开Tensorboard.折腾了很久,实验很多中方法最终找到了一个正确 ...
随机推荐
- ASP.NET中直接用C# 动态修改CSS样式
ASP.NET中直接用C# 动态修改CSS样式 wonsoft (wonsoft@163.com) 使用JavaScript控制CSS样式有点麻烦,还是觉得直接使用C#操作更方便快捷,本文通过两个B ...
- Laravel 框架 基础(一)
Laravel 框架 laravel 5.2 在 5.1 基础上继续改进和优化,添加了许多新的功能特性:多认证驱动支持.隐式模型绑定.简化 Eloquent 全局作用域.可选择的认证脚手架.中间件组. ...
- 统一流控服务开源-1:场景&业界做法&算法篇
最近团队在搞流量安全控制,为了应对不断增大的流量安全风险.Waf防护能做一下接入端的拦截,但是实际流量会打到整个分布式系统的每一环:Nginx.API网关.RPC服务.MQ消息应用中心.数据库.瞬间的 ...
- 【Service Fabric】小白入门记录 本地Service Fabric集群安装及设置
本篇内容是自学自记,现在我还不知道Service Fabric究竟是怎么个入门法,反正按照入门教程先进行本地Service Fabric集群的安装,万里路始于足下,要学习总得先把环境装好了才能开始学习 ...
- 数组、ArrayList、List、LinkedList的区别
一.数组 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 1.一维数组 声明一个数组: ]; 初始化一个数组: ] { , , , , }; //定长 声明并初始化: ...
- Oracle-11:联合查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 联合查询的实际上的意义就是从俩个结果集中拿有特定联系的结果封装为一个结果集 数据库脚本给放一份,供测试使用 c ...
- Activity的状态保存
这两个图其实说的是一个意思,具体onSaveInstanceState()这个函数什么时候会调用,在网络上搜了一下 这个第一种情况,我可以解释一下,说的是这个方法只在onResume和onPause之 ...
- 在VirtualBox中安装BlackArch Linux
作者:荒原之梦 安装前的准备 下载系统映像:BlackArch Linux官网下载页面 在本文中我使用的是BlackArch Linux的Live ISO,这样可以减少安装时下载系统的时间.Black ...
- mac里用PyCharm中引用MySqlDB始末
本来想用java来连数据库,然后调用python的,后来想了想,反正是个实验性质的小工程何必搞的这么复杂.直接全部python就好了,于是就为这个想法填了一晚上的坑. 装好了PyCharm的CE版,然 ...
- Python 字符串大小写转换
以下代码演示了如何将字符串转换为大写字母,或者将字符串转为小写字母等: # Filename : test.py # author by : www.runoob.com str = "ww ...