torchsummary
torchsummary可以完美又简洁的输出用pytorch写的网络的相关信息。比如每个层的操作,输出维度,模型的总参数量,训练的参数量,网络的暂用内存情况等等。
安装
# conda提示找不到来着。conda源中没有这个模块。
pip install torchsummary
使用-打印出网络结构
from torchsummary import summary
# 然后使用summary函数
summary(model,imput_size,batch_size,device)
# 参数说明:模型(model)、输入尺寸(input_size)、批次大小(batch_size)、运行平台(device)
Tensorboard
首先了解一下基础概念,否则后面可能会很懵。
event files
:tensorboard将数据保存到该类型文件中,默认命名规范格式如events.out.tfevents.timestamp.hostname
,举例说明:events.out.tfevents.1671271852.My-PC-hostname.18300.0
;timestamp表示时间戳,从1970-01-01 00:00:01.000000开始计算,到现在的时间;hostname:表示电脑的主机名。Tensorboard可视化流程是将代码中可视化数据保存到
event files
文件中,然后通过tensorboard --logdir='./runs'
将文件夹runs下的所有event files
的数据展示到网页中。
Tensorboard是tensorflow内置的一个可视化工具,它通过将tensorflow程序输出的日志文件的信息可视化,使得tensorflow程序的理解、调试和优化更加简单高效。它可以帮助我们理解整个神经网络的学习过程、数据的分布、性能瓶颈等等。但它本身是为TensorFlow量身定做,无法直接用于pytorch等其他深度学习框架。在这种情况下,出了TensorboardX,可以辅助tensorboard在其他深度学习框架下的应用。当然在新版本的pytorch中集成了该模块:torch.utils.tensorboard
。
TensorBoard 的主要功能包括:
- 可视化模型的网络架构(
add_graph
) - 跟踪模型指标,如损失和准确性等(
add_scalar
,add_scalars
) - 检查机器学习工作流程中权重、偏差和其他组件的直方图(
add_histogram
) - 显示非表格数据,包括图像(
add_image
)、文本(add_text
)和音频(add_audio
) - 将高维嵌入投影到低维空间(
add_embedding
)
pytorch中使用tensorboard步骤如下:
-
导入tensorboard
from torch.utils.tensorboard import SummaryWriter # 或者 tensorboardX中导入 from tensorboardX import SummaryWriter
-
实例化SummaryWriter类,指明记录日记路径等信息
- log_dir:保存目录位置。默认值为
runs/CURRENT_DATETIME_HOSTNAME
,每次运行后都会更改,因为时间戳。 - comment:不指定log_dir时有效。
- filename_suffix:添加到 log_dir 目录中所有事件文件名的后缀
- log_dir:保存目录位置。默认值为
-
调用相应的API,接口一般格式为:
-
关闭对应的SummaryWriter类,节约资源
Jupyter Notebooks 中使用 TensorBoard
# 加载 TensorBoard notebook 插件
%load_ext tensorboard
# 启动 TensorBoard
%tensorboard --logdir logs
可能会遇到问题:
No dashboards are active for the current data set.
原因是由于可能在某个时间段,运行了Jupyter,导致使用默认的端口开启了tensorboard服务,但是指定的logdir却没有
event files
文件,解决方案如下:关闭之前占用默认端口的tensorboard服务,然后找到指定文件夹重新开启;或者使用另一个端口,比如6666端口:tensorboard --logdir='logs' --port=6666
SummaryWriter最常用方法
add_scalar(self, tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False)
主要参数说明:
tag
:名字scalar_value
:保存标量的数据global_step
:批次数,也可以认为是迭代数,用于表示一种过程。
使用:
# 实例化SummaryWriter类
tb_wirter = SummaryWriter(log_dir="./runs/Exp")
# 添加一条曲线在一张图中可视化
for i in range(200):
tb_wirter.add_scalar(tag='sine wave', scalar_value=np.math.sin(i), global_step=i)
# 关闭SummaryWriter类
tb_wirter.close()
add_scalars(self, main_tag, tag_scalar_dict, global_step=None, walltime=None)
主要参数说明:
main_tag
:名字tag_scalar_dict
:多种数据使用字典方式传入global_step
:批次数
使用:
# 实例化SummaryWriter类
tb_wirter = SummaryWriter(log_dir="./runs/Exp")
# 添加多条曲线在一张图中可视化
for i in range(200):
tb_wirter.add_scalars(main_tag='scalar_group',
tag_scalar_dict={'xsinx': i * np.sin(i),
'xcosx': i * np.cos(i),
'tanx': np.tan(i)},
global_step=i)
# 关闭SummaryWriter类
tb_wirter.close()
add_graph(self, model, input_to_model=None, verbose=False, use_strict_trace=True)
主要参数说明:
model
:网络模型input_to_model
:网络模型的一种输入,对于图像分类问题一般是(batch_size,channel,height,weight)
使用:
# 实例化SummaryWriter类
tb_wirter = SummaryWriter(log_dir="./runs/Exp")
# 以resnet18为例网络结构可视化。注意,必须有关闭SummaryWriter对象操作
resnet18 = models.resnet18(False)
tb_wirter.add_graph(model=resnet18, input_to_model=torch.rand(32, 3, 64, 64))
# 关闭SummaryWriter类
tb_wirter.close()
add_histogram(self, tag, values, global_step=None, bins="tensorflow", walltime=None, max_bins=None)
主要参数说明:
tag
:名字values
:保存的数据global_step
:批次数
使用:
# 实例化SummaryWriter类
tb_wirter = SummaryWriter(log_dir="./runs/Exp")
# 分布和直方图,比如说对每一层网络权重进行统计分布以及画出直方图
resnet18 = models.resnet18(False)
for i in range(5): # 相当于训练5个epochs,然后查看每个epochs中训练后权重分布
for name, param in resnet18.named_parameters():
tb_wirter.add_histogram(tag=name, values=param.clone().cpu().data.numpy(), global_step=i)
# 关闭SummaryWriter类
tb_wirter.close()
add_pr_curve(self, tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)
主要参数说明:
tag
:名字labels
:真实类别predictions
:预测类别分数global_step
:批次数
使用:
# 实例化SummaryWriter类
tb_wirter = SummaryWriter(log_dir="./runs/Exp")
# PR 曲线, 以二分类为例,随机生成类别以及预测分数
labels = np.random.randint(2, size=100)
predictions = np.random.rand(100)
tb_wirter.add_pr_curve(tag='pr_curve', labels=labels, predictions=predictions, global_step=0)
# 关闭SummaryWriter类
tb_wirter.close()
上面所有代码汇总一下:
import numpy as np
import torch
from torch.utils.tensorboard import SummaryWriter
import torchvision.models as models
if __name__ == '__main__':
# tb_wirter = SummaryWriter(log_dir="./runs",comment='')
tb_wirter = SummaryWriter(log_dir="./runs/Exp1")
# 添加一条曲线在一张图中可视化
for i in range(200):
tb_wirter.add_scalar(tag='sine wave', scalar_value=np.math.sin(i), global_step=i)
# 添加多条曲线在一张图中可视化
for i in range(200):
tb_wirter.add_scalars(main_tag='scalar_group',
tag_scalar_dict={'xsinx': i * np.sin(i),
'xcosx': i * np.cos(i),
'tanx': np.tan(i)},
global_step=i)
# 网络结构可视化,必须有关闭SummaryWriter对象操作
resnet18 = models.resnet18(False)
tb_wirter.add_graph(model=resnet18, input_to_model=torch.rand(32, 3, 64, 64))
# 分布和直方图,比如说对每一层网络权重进行统计分布以及画出直方图
for i in range(5): # 相当于训练5个epochs,然后查看每个epochs中训练后权重分布
for name, param in resnet18.named_parameters():
tb_wirter.add_histogram(tag=name, values=param.clone().cpu().data.numpy(), global_step=i)
# PR 曲线, 以二分类为例,随机生成类别以及预测分数
labels = np.random.randint(2, size=100)
predictions = np.random.rand(100)
tb_wirter.add_pr_curve(tag='pr_curve', labels=labels, predictions=predictions, global_step=0)
# 关闭
tb_wirter.close()
使用 TensorBoard.dev 上传和共享结果
TensorBoard.dev 是 TensorBoard 的一个组件,它允许我们在网络上托管机器学习结果。