pytorch参数可视化之torchsummary&Tensorboard

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

Tensorflow官网TensorBoard指南

TensorboardX: tensorboard for pytorch)

首先了解一下基础概念,否则后面可能会很懵。

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步骤如下:

  1. 导入tensorboard

    from torch.utils.tensorboard import SummaryWriter
    # 或者 tensorboardX中导入
    from tensorboardX import SummaryWriter
    
  2. 实例化SummaryWriter类,指明记录日记路径等信息

    writer = SummaryWriter(log_dir = None,comment="",filename_suffix="")
    
    • log_dir:保存目录位置。默认值为 runs/CURRENT_DATETIME_HOSTNAME,每次运行后都会更改,因为时间戳。
    • comment:不指定log_dir时有效。
    • filename_suffix:添加到 log_dir 目录中所有事件文件名的后缀
  3. 调用相应的API,接口一般格式为:

    writer.add_xxx(tag_name, object, iteration-number)
    
  4. 关闭对应的SummaryWriter类,节约资源

    writer.close()
    

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 的一个组件,它允许我们在网络上托管机器学习结果。

tensorboard dev upload --logdir {
    
    logs}

猜你喜欢

转载自blog.csdn.net/weixin_41012765/article/details/128358531