TensorBoard是一个用于可视化机器学习实验结果的工具,可以帮助我们更好地理解和调试训练过程中的模型。
在PyTorch中,我们可以使用TensorBoardX库来与TensorBoard进行交互。TensorBoardX是一个PyTorch的扩展,它允许我们将PyTorch的训练中的关键指标和摘要写入TensorBoard的事件文件中。
3.1 TensorBoard使用
安装TensorBoard: pip install tensorboard
- add_scalar()的使用,常用来绘制(train/val loss)
- add_image()的使用,常用来观察训练结果
学习TensorBoard的目的:
- 训练过程中的loss是如何变化的。
- 模型在不同阶段的输出
3.1.1 SummaryWriter类
SummaryWriter 是 PyTorch 中 TensorBoard 的核心类,用于向 TensorBoard 写入各种类型的日志数据,方便可视化训练过程中的指标、图像、模型结构等信息。通过它可以实时监控训练进度,分析模型性能。
常用方法:
(1)、def__init__()

**功能:**初始化 SummaryWriter 对象
参数说明:
log_dir:日志文件保存路径,默认生成 runs/ 目录
comment:日志目录的附加注释
flush_secs:自动刷新到磁盘的时间间隔(秒)
(2)、add_acalars()

**功能:**同时记录多个标量数据(如同时记录训练和验证损失)
参数说明:
main_tag:主标签
tag_scalar_dict:键值对形式的多个标量
(3)、add_scalar()

**功能:**记录标量数据(如损失值、准确率)
参数说明:
tag:数据标签(如 'loss/train')
scalar_value:要记录的标量值
global_step:训练步数,用于横轴坐标
(4)、add_image()

**功能:**记录单个图像
参数说明:
tag:数据标签
img_tensor:图像张量,需注意数据格式(默认 CHW)
支持 PIL 图像转换为张量后传入
(5)、add_images()

功能:一次记录多张图像
参数说明:
tag:数据标签
img_tensor:包含多个图像的张量
(6)、add_histogram()

**功能:**记录张量的直方图(如权重分布、梯度分布),用于观察参数变化趋势
(7)、add_text()

**功能:**记录文本信息(如超参数设置、训练日志)
**参数说明:**text_string:要记录的文本内容
(8)、close()

**功能:**关闭 SummaryWriter,释放资源,建议在程序结束时调用。
3.1.2 add_scalar() 方法使用

**功能:**记录标量数据(如损失值、准确率)
参数说明:
tag:数据标签(如 'loss/train')
scalar_value:要记录的标量值(y轴)
global_step:训练步数,用于横轴坐标(x轴)
例如: y=x
python
from torch.utils.tensorboard import SummaryWriter
# 创建SummaryWriter实例,指定日志文件保存到"Logs"目录下
# 如果该目录不存在,会自动创建
writer = SummaryWriter("Logs")
# 循环100次,模拟训练过程中的100个步骤
for i in range(100):
# 向TensorBoard添加标量数据
# 参数说明:
# "y=x":数据的标签名称,用于在TensorBoard中识别该曲线
# i:要记录的标量值(这里y值等于x值)
# i:全局步骤值(x轴坐标,这里与y值相同)
writer.add_scalar("y=x", i, i)
# 关闭SummaryWriter,释放资源,确保所有日志数据都被写入文件
writer.close()
运行上述代码后,会产生一个Logs文件夹,如下图:

如何打开上述文件?
在终端输入:tensorboard ---logdir=Logs # logdir=事件文件所在的文件夹名
点击链接跳转:

为了和别人冲突,也可以指定端口打开tensorboard,输入指令:
tensorboard --logdir=Logs --port=6007
例如:y=2x
修改这行代码,其他与y=x例子代码一样


当tag与y不一致时的情况:

下面这种情况是不对的

每向 writer 中写入新的事件,也记录了上一个事件。
如何解决?
把logs文件夹下的所有文件删掉,程序删掉,重新开始或:重新写一个子文件,即创建新的 SummaryWriter("新文件夹")删掉logs下的文件,重新运行代码,在 Terminal 里按 Ctrl+C ,再输入命令:
tensorboard --logdir=logs --port=6007就可以出现名字为y=2x,但实际纵坐标是y=3x数值的图像。
3.1.3 add_image()的使用

功能: 记录单张图片
参数说明:
tag:对应图像的title
img_tensor:图像的数据类型,只能是torch.Tensor、numpy.array、string/blobnaem
global_step:训练步骤,int 类型
在python控制台输出图片类型,发现其类型是PIL.格式,不符合add_image()中的img_tensor参数所需要的图片类型数据格式。需要将其利用opencv(numpy.array())读取图片,来获得numpy型图片数据。

由于我的python版本是3.6需要装opencv的版本有限制,要装
pip install opencv -python==4.3.0.38

这是将PIL.格式转成numpy.ndarray格式
( 1 )、程序:在 TensorBoard 显示蚂蚁图片
python
from torch.utils.tensorboard import SummaryWriter # 导入SummaryWriter类
import numpy as np
from PIL import Image
# 创建实例
writer = SummaryWriter("Logs") # 把对应的事件文件存储到logs文件夹下
image_path = "Datasets/train/ants_image/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape) # (512,768,3) 即(H,W,C)(高度,宽度,通道)
writer.add_image("test", img_array, 1, dataformats='HWC') # 第1步
writer.close()
运行结果:

( 2 )、程序: TensorBoard 显示蜜蜂
将上面的程序修改路径即可,就改一行代码。其他跟上面一样
image_path = "Datasets/train/bees_image/16838648_415acd9e3f.jpg"

在一个title下,通过滑块显示每一步的图形,可以直观地观察训练中给model提供了哪些数据,或者想对model进行测试时,可以看到每个阶段的输出结果。
如果想要单独显示,重命名一下title即可,即 writer.add_image() 的第一个字符串类型的参数。