目录
1 什么是Tensorboard?
在深度学习领域,网络内部如同黑箱,其中包含大量的连接参数,这给人工调试造成极大的困难。
Tensorboard
则是神经网络的可视化工具,可以记录训练过程的数字、图像、运行图等内容,方便研究人员对训练参数进行统计,观察神经网络训练过程并指导参数优化。
2 Tensorboard安装
参考Anaconda安装与Python虚拟环境配置保姆级图文教程(附速查字典)创建一个实验用的虚拟环境。进入相应虚拟环境后,输入以下指令即可安装。
pip install tensorboardX
pip install tensorboard
安装完成后,进入环境
python
from torch.utils.tensorboard import SummaryWriter
若上述指令不报错即说明安装成功。
3 Tensorboard可视化流程
Tensorboard
可视化过程主要为:
- 为某次实验创建数据记录句柄
writer = SummaryWriter(path)
其中path是数据记录日志的存储路径。 - 通过
writer
实例的add_xxx
方法向日志写入不同类型的观察数据,主要类型有>> Scalars>
> :在模型训练期间显示不同的有用信息> >> Graphs>
> :显示模型> >> Histogram>
> :使用直方图显示权重> >> Distribution>
> :显示权重分布> >> Projector>
> :显示主成分分析和T-SNE算法,用于降维 - 启动
Tensorboard
可视化引擎tensorboard --logdir=<your_log_dir>
其中<your_log_dir>
可以是单次实验的日志所在路径,也可以是多次实验的父级目录,Tensorboard
会自动横向比较各次实验曲线。
4 Tensorboard可视化实例
4.1 常量可视化
这边给大家提供一个很方便的装饰器,实现过程如下
from tensorboardX import SummaryWriter
import os, time
classVisualizer:def__init__(self)->None:pass@staticmethoddefvisual_scale(title:str, path:str, cover:bool=True):'''
* @breif: 可视化模型标量数据
* @param[in]: title -> 图表名称
* @param[in]: path -> 可视化数据存储路径
* @param[in]: cover -> 是否覆盖已有可视化数据
'''defscale(func):defwrap(*args,**kwargs):
writer = SummaryWriter(log_dir=Visualizer.coverFile(path, cover))
result = func(*args,**kwargs)iflen(result)>0:
data_num =len(result[next(iter(result))])for i inrange(data_num):
writer.add_scalars(title,{k: v[i]for k, v in result.items()}, i)return result
return wrap
return scale
使用起来只需要一句话,注意要构造一个字典,记录将要传递给
tensorboard
的数据:
@visual_scale('loss','./log/fcnn')defmain(model, epochs:int, save:bool=False)->None:# 生成优化器——随机梯度下降
optimizer = torch.optim.SGD(model.parameters(),1e-3)
lossParam ={"trainLoss":[],"validLoss":[]}for i inrange(epochs):
lossParam["trainLoss"].append(train(i, epochs, model, optimizer))
lossParam["validLoss"].append(validate(i, epochs, model))if save:
torch.save(model.state_dict(),r"model/{}.pth".format(model.__str__))return lossParam
4.2 特征图可视化
同样用装饰器的形式构造一个可视化卷积核的工具函数
defvisual_kernal(title:str, path:str, append:bool=False):defkernal(func):defwarp(*args,**kwargs):ifnot append and os.path.exists(path):
delFiles(path)
writer = SummaryWriter(log_dir=path)
result = func(*args,**kwargs)try:
model = kwargs['model']for name, param in model.named_parameters():if'conv'in name.lower()and'weight'in name:
Cout, Cin, Kh, Kw = param.size()
kernelAll = param.reshape(-1,1, Kw, Kh)# 每个通道的卷积核
kernelGrid = vutils.make_grid(kernelAll, nrow=Cin)
writer.add_image(f'{title}--{name}', kernelGrid, global_step=0)except:raise AttributeError("被修饰函数传入的模型不存在或参数格式有误!")return result
return warp
return kernal
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《Pytorch深度学习实战》
- 《机器学习强基计划》
- 《运动规划实战精讲》
- …
👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
版权归原作者 Mr.Winter` 所有, 如有侵权,请联系我们删除。