tensorboardX是为解决pytorch框架可视化训练问题的,不过据说目前pytorch已经支持使用tensorboard进行可视化了。
TensorboardX可以提供中很多的可视化方式,本文主要介绍scalar 和 graph,这在深度网络调试时主要使用的,一个用于显示训练情况,一个用于显示网络结构。
使用TensorboardX
首先,需要创建一个 SummaryWriter 的示例:
from tensorboardX import SummaryWriter
# Creates writer1 object.
# The log will be saved in 'runs/exp'
writer1 = SummaryWriter('runs/exp')
# Creates writer2 object with auto generated file name
# The log directory will be something like 'runs/Aug20-17-20-33'
writer2 = SummaryWriter()
# Creates writer3 object with auto generated file name, the comment will be appended to the filename.
# The log directory will be something like 'runs/Aug20-17-20-33-resnet'
writer3 = SummaryWriter(comment='resnet')
以上展示了三种初始化 SummaryWriter 的方法:
1)提供一个路径,将使用该路径来保存日志
2)无参数,默认将使用 runs/日期时间 路径来保存日志
3)提供一个 comment 参数,将使用 runs/日期时间-comment 路径来保存日志
一般来讲,我们对于每次实验新建一个路径不同的 SummaryWriter,也叫一个 run,如 runs/exp1、runs/exp2。
接下来,我们就可以调用 SummaryWriter 实例的各种 add_something 方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:
tensorboard --logdir=<your_log_dir>
其中的 <your_log_dir> 既可以是单个 run 的路径,如上面 writer1 生成的 runs/exp;也可以是多个 run 的父目录,如 runs/ 下面可能会有很多的子文件夹,每个文件夹都代表了一次实验,我们令 --logdir=runs/ 就可以在 tensorboard 可视化界面中方便地横向比较 runs/ 下不同次实验所得数据的差异。
添加数据
1)标量(scalar)
使用 add_scalar
方法来记录数字常量。
add_scalar(tag, scalar_value, global_step=None, walltime=None)
参数
- tag (string)::数据名称,不同名称的数据使用不同曲线展示
- scalar_value (float): 数字常量值
- global_step (int, optional): 训练的 step
- walltime (float, optional): 记录发生的时间,默认为 time.time()
需要注意,这里的 scalar_value 一定是 float 类型,如果是 PyTorch scalar tensor,则需要调用 .item() 方法获取其数值。我们一般会使用 add_scalar 方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。
Example
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/scalar_example')
for i in range(10):
writer.add_scalar('quadratic', i**2, global_step=i)
writer.add_scalar('exponential', 2**i, global_step=i)
这里,我们在一个路径为 runs/scalar_example
的 run 中分别写入了二次函数数据 quadratic
和指数函数数据 exponential
,在浏览器可视化界面中效果如下:
writer = SummaryWriter('runs/another_scalar_example')
for i in range(10):
writer.add_scalar('quadratic', i**3, global_step=i)
writer.add_scalar('exponential', 3**i, global_step=i)
接下来我们在另一个路径为 runs/another_scalar_example 的 run 中写入名称相同但参数不同的二次函数和指数函数数据,可视化效果如下。我们发现相同名称的量值被放在了同一张图表中展示,方便进行对比观察。同时,我们还可以在屏幕左侧的 runs 栏选择要查看哪些 run 的数据。如下图所示:
2)运行图 (graph)
使用 add_graph
方法来可视化一个神经网络:
add_graph(model, input_to_model=None, verbose=False, **kwargs)
参数
- model (torch.nn.Module): 待可视化的网络模型
- input_to_model (torch.Tensor or list of torch.Tensor, optional): 待输入神经网络的变量或一组变量(即神经网络的输入)
该方法可以可视化神经网络模型,TensorboardX 给出了一个官方样例大家可以尝试。样例运行效果如下:
一些tips
- tensorboard 有缓存,如果进行了一些 runs 文件夹的删除操作,最好重启 tensorboard,以避免无效数据干扰展示效果。
- 如果执行 add 操作后没有实时在网页可视化界面看到效果,试试重启 tensorboard。
参看博客:
一些操作实例
方便理解tensorboardX的具体使用过程
1)Graph:
运行结果
点击Net1部分可以将其网络展开,查看网络内部构造,如下图所示。其他部分可以继续展开查看详情。
2)实现线性回归的训练过程中的loss可视化和模型的保存
打开tensorboard可视化结果如下:
模型可视化:
损失可视化:
3)综合Demo
本Demo代码为TensorboardX提供的官方Demo代码。
可视化结果如下:
参考博客:https://www.jianshu.com/p/46eb3004beca
远程可视化
原理
建立ssh隧道,实现远程端口到本地端口的转发
具体来说就是将远程服务器的6006端口(tensorboard默认将数据放在6006端口)转发到本地的16006端口,在本地对16006端口的访问即是对远程6006端口的访问,当然,转发到本地某一端口不是限定的,可自由选择。
1)Xshell方式
利用Xshell隧道
首先 隧道 在Xshell > 文件 > 当前会话属性 > 连接 > SSH > 隧道
点添加 , 之后 源主机和目标主机 都是 localhost不变,不要自作聪明去给改成本机IP和服务器地址了。
然后就是一个小技巧了,网上的方法多用本机的16006端口。但其实完全没有必要这样做。
直接将侦听端口 和 目标端口 都设置成6006(tensorboard的访问地址) 即可。
运行方法
在服务器端运行 tensorboard --logdir=model_dir(模型地址)
注意模型地址不需要加引号
(tensorboard --logdir=/home/zhongzhanhui/PycharmProject/VDCNN/logs)
本机浏览器访问 127.0.0.1:6006
然后就可以开始看tensorboard的内容啦
参考博客:
2)直接在终端输入
ssh -L 16006:127.0.0.1:6006 account@server.address
训练完模型后(也可以在训练的同时),输入如下命令:
tensorboard --logdir=/path/to/log-directory