Pytorch中Tensorboard的学习

1、Tensorboard介绍

  TensorBoard 是 TensorFlow 开发的一个可视化工具,用于帮助用户理解和调试机器学习模型的训练过程。尽管它最初是为 TensorFlow 设计的,但通过 PyTorch 的 torch.utils.tensorboard 模块,PyTorch 用户也可以方便地使用 TensorBoard 来记录和可视化模型训练中的各种数据(记得先安装tensorboard包,pytorch不自带)。
  SummaryWriter 是 PyTorch 中与 TensorBoard 交互的核心类,用于将数据写入日志文件,供 TensorBoard 解析和展示。

1.1 TensorBoard 的核心功能

  1. 训练指标可视化:
    记录损失(Loss)、准确率(Accuracy)、学习率(Learning Rate)等标量数据,并绘制曲线。

  2. 模型结构可视化:
    展示神经网络的计算图(模型结构)。

  3. 直方图和分布:
    可视化权重、梯度等张量的分布变化。

  4. 图像和音频:
    记录输入图像、生成样本或中间特征图。

  5. 嵌入向量可视化:
    对高维数据进行降维(如 PCA 或 t-SNE),展示在 2D/3D 空间中的分布。

1.2 SummaryWriter 的基本用法

  1. 初始化 SummaryWriter
from torch.utils.tensorboard import SummaryWriter# 创建 SummaryWriter 对象
writer = SummaryWriter(log_dir="runs/experiment_1")

参数:

  • log_dir:日志文件的保存路径(默认生成 runs/ 目录下的时间戳文件夹)。
  1. 记录标量数据(Scalars)
for epoch in range(100):loss = train_model()accuracy = calculate_accuracy()# 记录损失和准确率writer.add_scalar("Loss/train", loss, epoch)writer.add_scalar("Accuracy/train", accuracy, epoch)
  1. 记录图像(Images)
images, _ = next(iter(dataloader))
writer.add_images("Input_images", images, epoch)
  1. 记录直方图(Histograms)
weights = model.layer.weight.data
writer.add_histogram("Weights/layer", weights, epoch)
  1. 记录模型结构(Graph)
dummy_input = torch.randn(1, 3, 224, 224)  # 输入示例
writer.add_graph(model, dummy_input)
  1. 关闭 Writer
    writer.close()

1.3 启动 TensorBoard

在命令行中运行以下命令启动 TensorBoard:

tensorboard --logdir=runs/

然后通过浏览器访问 http://localhost:6006 查看可视化结果。

1.4 关键方法详解

常用方法

方法功能
add_scalar(tag, scalar_value, global_step)记录单个标量(如 Loss)
add_scalars(main_tag, tag_scalar_dict, global_step)记录多个标量(如 Loss 和 Accuracy)
add_image(tag, img_tensor, global_step)记录单张图像(格式需为 CxHxW)
add_images(tag, img_tensor, global_step)记录多张图像(格式为 NxCxHxW)
add_histogram(tag, values, global_step)记录张量分布直方图
add_graph(model, input_to_model)记录模型计算图

1.5 使用示例

import torch
from torch.utils.tensorboard import SummaryWriter# 初始化
writer = SummaryWriter("runs/demo")# 模拟训练过程
for epoch in range(100):# 假设训练逻辑loss = 1.0 / (epoch + 1)accuracy = 0.8 - 0.002 * epoch# 记录标量writer.add_scalar("Loss/train", loss, epoch)writer.add_scalar("Accuracy/train", accuracy, epoch)# 记录随机直方图weights = torch.randn(100)writer.add_histogram("Random_weights", weights, epoch)# 记录模型结构(假设 model 已定义)
dummy_input = torch.randn(1, 3, 224, 224)
writer.add_graph(model, dummy_input)# 关闭 Writer
writer.close()

1.6 注意事项

  1. 数据频率:
    避免在每个训练步(step)都记录大量数据,否则日志文件会过大。

  2. 实验管理:
    使用不同的 log_dir 区分不同实验(如 runs/exp1, runs/exp2)。

  3. 张量格式:
    图像数据需符合 CxHxW 格式(通道优先)。

  4. 性能影响:
    高频记录可能影响训练速度,需权衡监控需求与效率。

1.7 总结

  • TensorBoard 是模型训练可视化的标准工具,支持标量、图像、直方图等多种数据。
  • SummaryWriter 是 PyTorch 与 TensorBoard 的桥梁,通过简单的方法将数据写入日志。
  • 典型工作流程:
    记录数据 → 启动 TensorBoard → 浏览器查看 → 分析优化模型。

通过结合 TensorBoard 和 SummaryWriter,可以直观地监控模型训练过程,快速定位问题(如过拟合、梯度消失等),是深度学习开发中的必备技能。

2、Tensorboard实操

2.1 测试Tensorboard

2.1.1 add_scalar 函数介绍

  将单个标量值(如损失、准确率、学习率)记录到 TensorBoard 日志中,生成随时间/步骤变化的曲线图,便于可视化分析。

基本语法

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

参数说明
tag (字符串)

  • 标识数据的标签,决定在 TensorBoard 中的图表标题和分组。
  • 支持层级命名(如 “train/loss” 和 “val/loss”),TensorBoard 会自动按斜杠分组显示。

scalar_value (浮点数或标量张量)

  • 要记录的具体数值(如 loss.item() 或 accuracy)。

global_step (整数, 可选)

  • 当前记录的“步骤”,通常是迭代次数、epoch 数或自定义的计数器。
  • 作为曲线的横坐标,需确保递增以正确显示变化趋势。

walltime (浮点数, 可选)

  • 覆盖默认的时间戳(记录时刻),一般无需手动设置。

示例代码

from torch.utils.tensorboard import SummaryWriter# 创建 SummaryWriter,日志保存到 runs/test 目录
writer = SummaryWriter("runs/test")for i in range(100):# 记录 y=3x 的标量值:tag为"y=3x",值为3*i,步骤为iwriter.add_scalar("y=3x", 3 * i, i)writer.close()  # 关闭写入器,确保数据保存
  • tag=“y=3x”:在 TensorBoard 中生成名为 y=3x 的曲线图。
  • scalar_value=3*i:每次迭代记录的值(模拟 y=3x 函数)。
  • global_step=i:横轴表示迭代步骤,从 0 到 99 递增。

使用建议
命名规范

  • 使用清晰的层级标签(如 “train/loss”、“val/accuracy”)以便在 TensorBoard 中分类查看。

步骤连续性

  • global_step 应单调递增(如 0,1,2,…),避免跳跃或重复,否则图表可能混乱。

高效记录

  • 避免高频调用(如每个 batch 都记录),可每隔若干步记录一次以减少开销。

查看结果
运行后,使用以下命令启动 TensorBoard:

tensorboard --logdir=runs/test

在浏览器中打开提示的链接,即可看到 y=3x 的线性增长曲线。

注意事项

  • 路径引号问题:确保路径字符串使用英文引号(如 “runs/test”),而非中文引号“”或‘’。
  • 及时关闭 Writer:调用 writer.close() 或在 with 块中使用,防止日志未保存。

相关方法

add_scalars:同时记录多个标量(如训练和验证损失对比):

writer.add_scalars("loss", {"train": train_loss, "val": val_loss}, epoch)

其他记录方法:如 add_image(记录图像)、add_histogram(权重分布)等,用于多维数据可视化。

2.1.2 实例

from torch.utils.tensorboard import SummaryWriter# 创建一个 SummaryWriter 对象
writer = SummaryWriter("runs/test")
for i in range(100):writer.add_scalar("y=3x", 3*i, i)
writer.close()

  运行上述程序之后,会发现程序所在目录中多了个文件夹runs,文件夹runs中有一个文件夹test:

在这里插入图片描述
  如果想要查看可视化结果,可以在终端执行命令:

tensorboard --logdir=runs/

在这里,logdir=事件文件所在的文件夹,在本例中为logdir=test(注意不是logdir = runs/test,只能是一级目录):

tensorboard --logdir=test     

运行之后,返回结果:

TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)

点击网址,即可查看可视化结果。

在这里插入图片描述

如果打开网址看不到你的数据结果,尝试把相对路径(test)换为绝对路径再重新运行并打开网址即可。
  另外,如果想要更改端口号(即上面网址中的6006),可以在终端执行以下命令:

tensorboard --logdir=test --port=6007 

2.2 读取图像数据

2.2.1 add_jmage函数介绍

  SummaryWriter 中的 .add_image 方法用于将图像数据记录到 TensorBoard 中,帮助用户可视化训练过程中的图像变化。

基本语法

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

参数说明:

  • tag (str): 图像的名称标识,用于在 TensorBoard 中分类显示。
  • img_tensor (Tensor): 图像张量,支持多种格式(需通过 dataformats 指定)。
  • global_step (int, 可选): 记录的步骤(如训练步数或 epoch),用于滑动查看图像变化。
  • walltime (float, 可选): 自定义时间戳,默认使用当前时间。
  • dataformats (str, 可选): 图像张量的格式,默认为 ‘CHW’(通道数 × 高度 × 宽度)。

图像张量格式
常见格式:

  • 单图像:(C, H, W)(默认)或 (H, W, C)(需设置 dataformats=‘HWC’)。
  • 灰度图:(1, H, W) 或 (H, W)(需设置 dataformats=‘HW’)。
  • 批量图像:使用 .add_images 或 torchvision.utils.make_grid 合并为网格后记录。

数据类型与范围:

  • 浮点型:数值范围应为 [0.0, 1.0]。
  • 整型(uint8):数值范围应为 [0, 255]。

使用步骤

  1. 导入库并创建 SummaryWriter:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
  1. 准备图像张量:

从随机数据生成:

img = torch.rand(3, 64, 64)  # 3通道,64x64,范围[0,1]

从文件加载并转换:

from PIL import Image
import numpy as np
import torch# 读取图像并转为张量
image = Image.open("example.jpg")
img_array = np.array(image)
if img_array.ndim == 3:img_tensor = torch.from_numpy(img_array.transpose(2, 0, 1))  # HWC → CHW
else:img_tensor = torch.from_numpy(img_array).unsqueeze(0)       # 灰度图添加通道维度
img_tensor = img_tensor.float() / 255.0  # 归一化到[0,1]
  1. 记录图像:
writer.add_image('my_image', img_tensor, global_step=0)
  1. 处理多张图像(网格):
import torchvisionimages = torch.randn(16, 3, 64, 64)        # 16张图像
grid = torchvision.utils.make_grid(images, nrow=4)  # 合并为4x4网格
writer.add_image('16_images_grid', grid, 0)

注意事项

  • 数据范围:若张量值超出 [0, 1] 或 [0, 255],需手动归一化:
img = (img - img.min()) / (img.max() - img.min())  # 归一化到[0,1]
  • 格式匹配:若张量形状与 dataformats 不匹配,TensorBoard 可能无法正确显示。
    例如:(H, W, C) 需设置 dataformats=‘HWC’。单通道灰度图 (H, W) 需设置 dataformats=‘HW’。
  • GPU 张量:若张量在 GPU 上,需先移至 CPU:
img_tensor = img_tensor.cpu()

示例代码

from torch.utils.tensorboard import SummaryWriter
import torchwriter = SummaryWriter()# 生成随机图像(3通道,64x64)
img = torch.rand(3, 64, 64)
writer.add_image('random_image', img, 0)# 记录多张图像的网格
images = torch.randn(16, 3, 64, 64)
grid = torchvision.utils.make_grid(images, nrow=4)
writer.add_image('image_grid', grid, 0)writer.close()

运行后,在命令行启动 TensorBoard:

tensorboard --logdir=runs

通过以上步骤,可有效利用 .add_image 监控模型输入、输出或中间特征图,提升训练过程的可解释性。

2.2.2 示例

  接下来使用SummaryWriter类中的.add_image()方法来读取图像数据。使用的图像为.jpg格式文件:

在这里插入图片描述

由于PIL中Image.open()打开的图片类型为<class ‘PIL.JpegImagePlugin.JpegImageFile’>,而方法add_image()中
img_tensor 参数必须为图像张量: (torch.Tensor, numpy.ndarray, or string/blobname)

        Args:tag (str): Data identifierimg_tensor (torch.Tensor, numpy.ndarray, or string/blobname): Image dataglobal_step (int): Global step value to recordwalltime (float): Optional override default walltime (time.time())seconds after epoch of eventdataformats (str): Image data format specification of the formCHW, HWC, HW, WH, etc.

因此,使用img_array = np.array(img_PIL)将PIL类型图像转换为numpy.ndarray类型图像。

>>> import numpy as np
>>> img_array = np.array(img_PIL)
>>> type(img_array)
<class 'numpy.ndarray'>
>>> img_array.shape
(512, 768, 3)

  此外,转换为numpy.ndarray类型图像之后,方法add_image()中参数dataformats (str, 可选): 图像张量的格式,默认为 ‘CHW’(通道数 × 高度 × 宽度)。而转换之后的格式为(H x W x C),因此需要设置该参数为dataformats=‘HWC’。

完整代码:

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image# 创建一个 SummaryWriter 对象
writer = SummaryWriter("runs")
image_path = "hymenoptera_data/train/ants/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)writer.add_image("train", img_array, 1, dataformats='HWC')
for i in range(100):writer.add_scalar("y=3x", 3*i, i)
writer.close()

  在终端执行命令:

tensorboard --logdir=E:\my_pycharm_projects\project1\runs  

运行:

TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)

点击网址,即可查看可视化结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39355.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

哪吒汽车:一边熬夜蹦迪,一边找药投医

两年前&#xff0c;威马CEO沈晖发了个短视频&#xff0c;内容是“活下去&#xff0c;像牲口一样活下去”。 如今最能体会沈晖当时心情的&#xff0c;估计就是方运舟了。 作为哪吒汽车创始人兼董事长&#xff0c;他连续多次被限高&#xff0c;为了让哪吒汽车活下去&#xff0c…

2025 cs144 Lab Checkpoint 1小白超详细版

cs144官网&#xff1a;https://cs144.github.io/ 我的github&#xff1a;https://github.com/Albert-tru/cs144-2025 文章目录 1 手动发送internet数据报协议号5、7&#xff1f;思路&#xff1f; 2 实现一个Reassembler类2.1 几个帮助理解代码的Q&AQ1&#xff1a;insert的参…

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用&#xff0c;而 OpenCV 作为一个强大的图像处理库&#xff0c;提供了丰富的函数来实现各类图像处理任务。形态学操作&#xff08;Morphological Operations&#xff09;是其中常用的技术&#xff0c;尤其适用于二值图像的处理。常见的…

单链表的查找和插入,删除操作

1.单链表的查找 snode* slistfind(snode* stlheap, stltype x) {while (stlheap){if (stlheap->data x){return stlheap;}stlheap stlheap->next;}return NULL; } 2.单链表的插入操作 2.1在指定位置之前插入节点 void slistinsert(snode** stlheap, snode* pos, stl…

一文速通Python并行计算:00 并行计算的基本概念

一文速通 Python 并行计算&#xff1a;00 并行计算的基本概念 摘要&#xff1a; 该文介绍了 Python 并行计算的核心概念、编程模型及其应用&#xff0c;并介绍了了并行程序的性能分析与优化方法&#xff0c;如并行效率、加速比及 Amdahl 定律。此外&#xff0c;该文介绍了共享…

vue中keep-alive组件的使用

keep-alive是vue的内置组件&#xff0c;它的主要作用是对组件进行缓存&#xff0c;避免组件在切换时被重复创建和销毁&#xff0c;从而提高应用的性能和用户体验。它自身不会渲染一个 DOM 元素&#xff0c;也不会出现在父组件链中。使用时&#xff0c;只需要将需要缓存的组件包…

Python Excel表格数据对比工具

【Excel对比工具】提升工作效率的神奇助手&#xff1a;基于PyQt5和Pandas的文件数据对比应用 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例…

注册登录表单

html登录页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个登录页面</t…

JAVA:Spring Boot @Conditional 注解详解及实践

1、简述 在 Spring Boot 中&#xff0c;Conditional 注解用于实现 条件化 Bean 装配&#xff0c;即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制&#xff0c;常用于实现模块化、可配置的组件加载。 本文将详细介绍 Conditional 相关的注解&…

Java高频面试之集合-17

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;JDK 8 对 HashMap 主要做了哪些优化呢&#xff1f;为什么要这么做&#xff1f; JDK 8 对 HashMap 的主要优化及原因 JDK…

力扣DAY24 | 热100 | 回文链表

前言 简单 √ 是反转链表的衍生题&#xff0c;很快写完了。不过没考虑到恢复链表结构的问题。 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

Unity跨平台构建快速回顾

知识点来源&#xff1a;人间自有韬哥在&#xff0c;豆包 目录 一、发布应用程序1. 修改发布必备设置1.1 打开设置面板1.2 修改公司名、游戏项目名、版本号和默认图标1.3 修改 Package Name 和 Minimum API Level 2. 发布应用程序2.1 配置 Build Settings2.2 选择发布选项2.3 构…

手敲NLP相关神经网络,熟悉神经网络的结构与实现!

一、NNLM 二、word2vec 三、TextCNN 四、TextRNN 五、TextLSTM 六、Bi-LSTM 七、seq2seq 八、seq2seq&#xff08;attention&#xff09;

Spring MVC 拦截器使用

javaweb过滤器和springmvc拦截器&#xff1a; 拦截器的概念 拦截器使用 1/创建拦截器类&#xff0c;类中实现 handler执行前&#xff0c;执行后与渲染视图后的具体实现方法 public class GlobalExceptionHandler implements HandlerInterceptor {// if( ! preHandler()){re…

数据库分类、存储引擎、介绍、Mysql、SQL分类

DAY17.1 Java核心基础 数据库 关系型数据库&#xff08;传统数据库&#xff0c;安全可靠&#xff0c;数据量大&#xff09;&#xff1a;Mysql、Oracle、SQLServer 非关系型数据库nosql&#xff08;缓存数据库&#xff0c;高并发项目中&#xff0c;存储热点数据&#xff0c;短信…

Extend module 01:Keyboard

目录 一、Keyboard &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;扫描原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、Keyboard接口函数封装 三、踩坑日记 &a…

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导&#xff0c;为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取&#xff0c;从而提供了更接近人类能力的抓取指导。 论文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具&#xff0c;而 AWX 则是 Ansible 的开源 Web 管理平台&#xff0c;提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX&#xff0c;使用 M…

Vulhub-jangow-01-1.0.1通关攻略

第0步&#xff1a; 打开靶机&#xff0c;按下shift&#xff0c;出现下图界面 在此页面按下e键&#xff0c;进入如下界面&#xff0c; 将ro 替换为 rw signie init/bin/bash 替换完毕后&#xff0c;按下Ctrl键X键&#xff0c;进入如下页面 ip a查看网卡信息 编辑配置文件网卡信…