当前位置: 代码迷 >> 综合 >> 【PyTorch】11:TensorBoard 可视化
  详细解决方案

【PyTorch】11:TensorBoard 可视化

热度:12   发布时间:2024-02-10 18:20:08.0

文章目录

  • 1. TensorBoard 安装
  • 2. TensorBoard 使用
    • 2.1 SummaryWriter()
    • 2.2 add_scalar()
    • 2.3 add_histogram()
    • 2.4 add_image()
    • 2.5 add_graph()
    • 2.6 add_video()
    • 2.7 make_grid()
    • 2.8 torchsummary
  • 3. 权重和特征图可视化


1. TensorBoard 安装

TensorBoard:TensorFlow 中强大的可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况等。在训练网络时,可以设置不同的参数(比如:权重W、偏置B、卷积层数、全连接层数等),使用TensorBoader可以很直观的辅助选择参数。

在这里插入图片描述


激活虚拟环境,直接命令行安装即可:

pip install tensorboard

在这里插入图片描述
测试:

import numpy as np
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter(comment='test_tensorboard')for x in range(100):writer.add_scalar('y=2x', x * 2, x)writer.add_scalar('y=pow(2, x)', 2 ** x, x)writer.add_scalars('data/scalar_group', {"xsinx": x * np.sin(x),"xcosx": x * np.cos(x),"arctanx": np.arctan(x)}, x)
writer.close()

启动:

tensorboard --logdir=./runs

查看:
在这里插入图片描述
注意:事件文件与代码是同级目录。
在这里插入图片描述


2. TensorBoard 使用

2.1 SummaryWriter()

SummaryWriter 官方文档:LINK。

torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')

功能:提供创建 event file 的高级接口。

主要属性:

  • log_dir:event file 输出文件夹;
  • comment:不指定 log_dir 时,文件夹后缀名;
  • filename_suffix:event file 文件名后缀名。

实例:

log_dir = "./train_log/test_log_dir"
writer = SummaryWriter(log_dir=log_dir, comment='_scalars', filename_suffix="123456")
writer = SummaryWriter(comment='_scalars', filename_suffix="123456")

2.2 add_scalar()

add_scalar(tag, scalar_value, global_step=None, walltime=None)

功能:记录标量。

  • tag:图像的标签名,图的唯一标识;
  • scalar_value:要记录的标量;
  • global_step:x 轴。

add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
  • main_tag :该图的标签;
  • tag_scalar_dict: key 是变量的 tag,value 是变量的值。
from torch.utils.tensorboard import SummaryWritermax_epoch = 100
writer = SummaryWriter(comment='test_comment', filename_suffix="test_suffix")for x in range(max_epoch):writer.add_scalar('y=2x', x * 2, x)writer.add_scalar('y=pow_2_x', 2 ** x, x)writer.add_scalars('data/scalar_group', {"xsinx": x * np.sin(x),"xcosx": x * np.cos(x)}, x)writer.close()

2.3 add_histogram()

add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)
writer = SummaryWriter(comment='test_comment', filename_suffix="test_suffix")for x in range(2):np.random.seed(x)data_union = np.arange(100)data_normal = np.random.normal(size=1000)writer.add_histogram('distribution union', data_union, x)writer.add_histogram('distribution normal', data_normal, x)plt.subplot(121).hist(data_union, label="union")plt.subplot(122).hist(data_normal, label="normal")plt.legend()plt.show()writer.close()

在这里插入图片描述


2.4 add_image()

add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')

功能:记录图像。

  • tag:图像的标签名,图的唯一标识;
  • img_tensor:图像数据,注意尺度;
  • global_step: x 轴;
  • dataformats:数据形式 CHW、HWC、HW。
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')

2.5 add_graph()

add_graph(model, input_to_model=None, verbose=False)

功能:可视化模型计算图。

参数说明:

  • model :模型,必须是 nn.Module
  • input_to_model :输出给模型的数据
  • verbose :是否打印计算图结构信息

2.6 add_video()

add_video(tag, vid_tensor, global_step=None, fps=4, walltime=None)

2.7 make_grid()

torchvision.utils.make_grid(tensor: Union[torch.Tensor, List[torch.Tensor]], nrow: int = 8, padding: int = 2, normalize: bool = False,range: Optional[Tuple[int, int]] = None, scale_each: bool = False, pad_value: int = 0)

功能:制作网格图像。

参数说明:

  • tensor:图像数据, BCH*W 形式;
  • nrow:行数(列数自动计算);
    -padding:图像间距(像素单位);
  • normalize:是否将像素值标准化;
  • range:标准化范围;
    -scale_each:是否单张图维度标准化;
  • pad_value:padding的像素值。

实例:

import os
import torch
import time
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.utils as vutils
from torch.utils.tensorboard import SummaryWriter
from torch.utils.data import DataLoaderimport sys
hello_pytorch_DIR = os.path.abspath(os.path.dirname(__file__)+os.path.sep+".."+os.path.sep+"..")
sys.path.append(hello_pytorch_DIR)
from tools.my_dataset import RMBDataset
from tools.common_tools import set_seed
from model.lenet import LeNetset_seed(1)  # 设置随机种子writer = SummaryWriter(comment='test_your_comment', filename_suffix="_test_your_filename_suffix")split_dir = os.path.join("D:\Project\Pytorch Project\data\CatAndDog", "CatAndDogSplit")
train_dir = os.path.join(split_dir, "train")
# train_dir = "path to your training data"transform_compose = transforms.Compose([transforms.Resize((32, 64)), transforms.ToTensor()])
train_data = RMBDataset(data_dir=train_dir, transform=transform_compose)
train_loader = DataLoader(dataset=train_data, batch_size=16, shuffle=True)
data_batch, label_batch = next(iter(train_loader))img_grid = vutils.make_grid(data_batch, nrow=4, normalize=True, scale_each=True)
# img_grid = vutils.make_grid(data_batch, nrow=4, normalize=False, scale_each=False)
writer.add_image("input img", img_grid, 0)writer.close()

在这里插入图片描述


2.8 torchsummary

torchsummary,仓库地址:LINK。

功能:查看模型信息,便于调试。

参数说明:

  • model: pytorch 模型;
  • input_size :模型输入 size;
  • batch_size: batch size;
  • device: cuda or cpu。

3. 权重和特征图可视化

writer = SummaryWriter(comment='test_your_comment', filename_suffix="_test_your_filename_suffix")alexnet = models.alexnet(pretrained=True)kernel_num = -1
vis_max = 1for sub_module in alexnet.modules():if isinstance(sub_module, nn.Conv2d):kernel_num += 1if kernel_num > vis_max:breakkernels = sub_module.weightc_out, c_int, k_w, k_h = tuple(kernels.shape)for o_idx in range(c_out):kernel_idx = kernels[o_idx, :, :, :].unsqueeze(1)   # make_grid 需要 BCHW,这里拓展C维度kernel_grid = vutils.make_grid(kernel_idx, normalize=True, scale_each=True, nrow=c_int)writer.add_image('{}_Convlayer_split_in_channel'.format(kernel_num), kernel_grid, global_step=o_idx)kernel_all = kernels.view(-1, 3, k_h, k_w)  # 3, h, wkernel_grid = vutils.make_grid(kernel_all, normalize=True, scale_each=True, nrow=8)  # c, h, wwriter.add_image('{}_all'.format(kernel_num), kernel_grid, global_step=322)print("{}_convlayer shape:{}".format(kernel_num, tuple(kernels.shape)))writer.close()
writer = SummaryWriter(comment='test_your_comment', filename_suffix="_test_your_filename_suffix")# 数据
path_img = "./lena.png"     # your path to image
normMean = [0.49139968, 0.48215827, 0.44653124]
normStd = [0.24703233, 0.24348505, 0.26158768]norm_transform = transforms.Normalize(normMean, normStd)
img_transforms = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),norm_transform
])img_pil = Image.open(path_img).convert('RGB')
if img_transforms is not None:img_tensor = img_transforms(img_pil)
img_tensor.unsqueeze_(0)    # chw --> bchw# 模型
alexnet = models.alexnet(pretrained=True)# forward
convlayer1 = alexnet.features[0]
fmap_1 = convlayer1(img_tensor)# 预处理
fmap_1.transpose_(0, 1)  # bchw=(1, 64, 55, 55) --> (64, 1, 55, 55)
fmap_1_grid = vutils.make_grid(fmap_1, normalize=True, scale_each=True, nrow=8)writer.add_image('feature map in conv1', fmap_1_grid, global_step=322)
writer.close()