神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明
(一) SummaryWriter
这里先讲解 SummaryWriter ,TensorBoard 会在第二大点进行说明。
SummaryWriter 是 PyTorch 中的一个非常实用的工具,它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来,并可以与 TensorBoard 配合使用,实现数据的可视化。以下是对 SummaryWriter 库的详细介绍:
1)概述
SummaryWriter 是 torch.utils.tensorboard
包中的一个类,它允许用户将训练过程中的关键信息(如损失值、准确率、学习率、模型权重分布、图像等)写入到指定的事件文件中。这些信息随后可以被 TensorBoard 解析和展示,从而帮助开发者更好地理解和监控模型的训练过程。
2)代码使用步骤
- 安装 TensorBoard:在使用 SummaryWriter 之前,需要确保已经安装了 TensorBoard 。可以使用 pip 命令进行安装:
pip install tensorboard
。 - 导入 SummaryWriter:在代码中导入 SummaryWriter 类:
from torch.utils.tensorboard import SummaryWriter
。 - 实例化 SummaryWriter:创建一个 SummaryWriter 对象,并指定一个日志目录(
log_dir
),用于保存事件文件。- 例如:
writer = SummaryWriter('runs/my_experiment')
,或者writer = SummaryWriter('logs')
。 - 如果没有指定日志目录,那么当开始记录数据时,会自动在当前代码的目录下创建一个名为
runs
的文件夹,同时在此文件夹下创建一个以当前时间、日期和主机名命名的子目录,用于保存时间文件,类似于./runs/YYYYMMDD_HHMMSS_hostname/
这样的路径。
- 例如:
- 记录数据(第三小点会详细介绍):在训练过程中,使用 SummaryWriter 对象的各种方法记录需要的数据。例如,使用
add_scalar
记录损失值,使用add_histogram
记录权重分布等。 - 关闭 SummaryWriter:在训练结束后,调用
writer.close()
方法关闭 SummaryWriter 对象,确保所有数据都被正确写入事件文件。 - 启动 TensorBoard(见下方第二大点):在命令行中使用
tensorboard --logdir=事件文件所在的文件夹名
命令启动 TensorBoard服务。然后,在浏览器中访问http://localhost:6006
,就可以看到 TensorBoard 的可视化界面了。
3)记录不同数据的代码
-
记录标量信息:使用
add_scalar
方法,可以记录如 损失值、准确率 等标量信息。这些信息通常以曲线图的形式在 TensorBoard 中展示,便于观察其变化趋势。writer = SummaryWriter('logs') writer.add_scalar('曲线图标题',scalar_value,global_step) # scalar_value 表示曲线图纵坐标数值 # global_step 表示曲线图横坐标数值
-
记录张量信息:通过
add_histogram
等方法,可以记录 模型权重、梯度 等张量信息。TensorBoard 会以直方图的形式展示这些张量的分布,有助于分析模型的稳定性和收敛性。 -
记录图像信息(注意图像格式):使用
add_image
方法记录 图像 数据。这对于处理图像任务的模型来说尤其有用,因为可以直观地看到模型对输入图像的预测结果或中间层的特征图。writer = SummaryWriter('logs') writer.add_image("图片标题",image_tensor,global_step,dataformats='HWC') # image_tensor 表示图片的数据格式,只能是 torch.tensor 或者 numpy.ndarray 或者 string 格式 # global_step 表示步长,从0开始!! # dataformats 表示图片的具体格式是CHW(通道数,高,宽)还是HWC(高,宽,通道数)还是HW。默认是CHW
-
torch.tensor
格式的图片,可以由transforms
工具转成,具体会在后续transforms
模块中进行讲解。在将图片转换成
tensor
格式时,代码会自动将像素值从(0,255)放缩到(0,1)之间 。 -
numpy.ndarray
格式的图片,有两种生成方式:-
通过
opencv
库中的工具直接读取:# 导入cv2库 img_path = "dataset/train/bees/bees(3).jpg" img_cv = cv2.imread(img_path)
-
通过 numpy 库,间接生成:
# 导入PIL.Image库,和numpy库 img_path = "dataset/train/bees/bees(3).jpg" img_PIL = Image.open(image_path) img_array = np.array(img_PIL)
nimpy.ndarray
格式的图片,是由 RGB 三个通道的值组成的,每个元素的值,都在(0,255)之间。 -
-
-
记录模型结构:在训练开始前,可以使用
add_graph
方法记录模型的结构。这有助于开发者理解模型的复杂性,并在TensorBoard 中直观地查看模型的层次结构和参数。
4)注意事项
- 日志目录的选择:为了避免日志文件的混乱,建议为每个实验或模型训练任务指定一个唯一的日志目录。
- 数据的实时性:SummaryWriter 是异步更新文件内容的,这意味着在训练过程中记录的数据可能不会立即显示在TensorBoard 中。但是,这并不会影响数据的准确性和完整性。
- 资源的占用:长时间运行 TensorBoard 可能会占用较多的系统资源。因此,建议在需要时才启动 TensorBoard 服务,并在完成后及时关闭。
5)示例
代码中的
SummaryWriter
中的字母S
和W
一定要大写。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('logs')
# y=x
for i in range(100):
writer.add_scalar('y=x', i, i,)
writer.close()
(二) TensorBoard
要确保安装的 TensorBoard 版本与 PyTorch 兼容,一般使用指令
pip install tensorboard==2.12.0
来安装(此时的 torch 版本为 2.4.1),原先安装好了也可以通过此指令进行覆盖。
1)使用方法
查看记录好的数据日志文件,将其可视化
运行下面这两个命令时,TensorBoard 会启动一个本地服务器,并在 默认网页浏览器中 打开一个新的标签页或窗口,显示 TensorBoard 的用户界面。在这个界面中,可以看到各种图表和可视化工具,它们展示了训练过程中记录的各种指标,如损失、准确率、模型参数分布等。
-
默认端口号:
tensorboard --logdir=日志目录路径 # 例如:tensorboard --logdir=logs,logs就在当前代码文件夹中,是相对路径
日志目录路径:
- 如果 日志目录路径 是一个相对路径(即不以斜杠
/
开头),那么它会被解释为相对于你当前工作目录的路径。 - 如果 日志目录路径 是一个绝对路径(即以斜杠
/
开头,或者在 Windows 上以盘符开头后跟冒号和斜杠,如C:/logs
),那么它会被直接解释为那个位置的路径。
- 如果 日志目录路径 是一个相对路径(即不以斜杠
-
指定端口号:
tensorboard --logdir=日志目录路径 --port=指定端口号 # 例如:tensorboard --logdir=logs --port=6007,logs就在当前代码文件夹中,是相对路径
2)问题及解决办法
-
已经画了一个图像,第二次画图时,如果图像内容变了,但是图像标题没变的话,两个图像就会重合紊乱,
建议换标题,或者删除所有的日志文件,重新运行。
-
其他的问题,诸如显示不全、显示不出等,都可以通过删除所有的日志文件,换个端口重新运行来解决。
3)演示(结合 SummaryWriter )
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
import cv2
writer = SummaryWriter('logs')
image_path = "E:\\4_Data_sets\\1\\train\\ants_image\\ants(2).jpg"
img_cv = cv2.imread(image_path)
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print("img_cv :",type(img_cv))
print("img_PIL :",type(img_PIL))
print("img_array :",type(img_array))
print(img_array.shape)
writer.add_image("test",img_array,2,dataformats='HWC')
# y=x
for i in range(100):
writer.add_scalar('y=x', i, i,)
writer.close()
-----------------------------------------------------------------------------------------------------------------
# 运行结果:
img_cv : <class 'numpy.ndarray'>
img_PIL : <class 'PIL.JpegImagePlugin.JpegImageFile'>
img_array : <class 'numpy.ndarray'>
(375, 500, 3)
在终端执行 tensorboard --logdir=logs --port=6007
并打开相应网址之后的运行结果:
上一篇 | 下一篇 |
---|---|
神经网络入门实战(五) | 待发布 |