TensorBoard的使用

发布时间 2023-07-12 01:23:20作者: 码头牛牛

一、使用Pytorch导入TensorBoard

SummaryWriter详解

from torch.utils.tensorboard import SummaryWriter
  • SummaryWriter是向事件文件夹log_dir写入事件文件的一个操作,并且这个事件文件可以被Tensorboard进行解析

参数详解:

  • log_dir:输入文件夹的名称(string)。如果为None,默认位置为:runs/**CURRENT_DATETIME_HOSTNAME**

  • 其他不常用参数:comment, purge_step, max_queue, flush_secs, fliename_suffix. 具体用处可以在pycharm中ctrl+单击SummaryWriter查看。

二、SummaryWriter中一些子类函数的使用

1.add_scalar():添加标量到SummaryWriter中

(1)参数详解

  • tag(string): Data的指定方式,图表的标题

  • scalar(float or string/blobname): 需要存储的数值

  • global_step(int): 训练的步数(Global step value to record),结合scalar,那就是训练到多少步的时候scalar的数值是多少。

  • walltime(float): (不常用参数,可选)Optional override default walltime(time.time()) with seconds after epoch of event

更直观的参数解释,可以表示为下图的方式:

(2)代码演示(需要pip tensorborad)

from torch.utils.tensorboard import SummaryWriter

writer=SummaryWriter("logs")  #将事件文件存储到logs这个文件夹底下

#绘制一个y=2x的图像
for i in range(100):
    writer.add_scalar("y=x",2*i,i)  # writer.add_scalar(图像标题,y轴,x轴)
writer.close()

2.add_image():添加image到SummaryWriter

(1)参数详解

  • tag(string): Data的指定方式,图表的标题

  • img_tensor(torch.Tensor, numpy.array, or string/blobname): 图像数据

  • global_step(int): 训练的步数(Global step value to record),结合img_tensor,那就是训练到多少步的时候img_tensor的图像是什么。

  • walltime(float): (不常用参数,可选)Optional override default walltime(time.time()) with seconds after epoch of event

默认输入图像数据形状:

  • (3, H, W):三通道,高,宽

  • 注意:如果输入数据为 (H, W, 3) 也是可以的,但是需要设置dataformats,如dataformats='HWC'

(2)代码演示(需要pip tensorborad)

使用示例:

数据下载地址:百度网盘 请输入提取码 (baidu.com)

提取码:zsh8

① 利用PIL读取图片数据

from PIL import Image
image_path="E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg"  #图片路径
img=Image.open(image_path)  #读取图片信息
print(type(img))


'''
[Run]
<class 'PIL.JpegImagePlugin.JpegImageFile'>
'''
  • 很明显,该数据类型不符合img_tensor的要求,所以不能用PIL读取

② 利用Opencv读取图片,获得numpy型图片数据

利用numpy.array(),对PIL图片进行转换,具体操作如下:

from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np

writer=SummaryWriter("Image")

image_path="E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg"  #图片路径
img_PIL=Image.open(image_path)  #读取图片的PIL格式

img_array=np.array(img_PIL)  #将PIL类型的图片数据转为numpy型数据
print(img_array.shape)   #查看图片数据的格式. [Run] (512, 768, 3);即3通道在最后一位

#添加image到SummaryWriter
#由shape数据可知,3通道在最后一位,所以设置为‘HWC’
writer.add_image("test", img_array, 1, dataformats='HWC')

writer.close()

③ 从PIL到numpy,需要在add_image()中指定shape中每一个数字/维表示的含义

三、如何打开事件文件logs

在上面writer=SummaryWriter("logs")代码的基础上,建立了一个名称为logs的文件,下面我们学习如何打开它。

1. 打开方法:使用Anaconda Prompt或Pycharm的Terminal

(1)具体操作

  • 输入tensorboard --logdir=logs并按回车,需要注意的是:logdir=事件文件所在的文件名。得到如下语句:

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.13.0 at http://localhost:6006/ (Press CTRL+C to quit)

其中,http://localhost:6006/为tensorboard的打开位置,可直接单击打开

  • 但有的时候,一台服务器上有好几个人在使用,如果都指向6006窗口,则会导致与其他人发生冲突,所以我们可以指定一个端口:

    tensorboard --logdir=logs --port=6007

(2)可能存在的错误

打开可能会出现下面这个页面:

存在原因及解决办法如下:

  • tensorboard --logdir=路径中含有中文

    解决方法:把中文改成英文

  • 路径错误

    解决方法:tensorboard --logdir=路径,其中这个输入的路径不用带引号

  • tensorboard语句错误

    解决方法:在一些tensorboard版本中,打开路径的语句为tensorboard --logdir=路径,但在另一些版本中,打开路径的语句为tensorboard --logdir"路径"

2. 可能存在的显示错误

如果反复更改上面的代码并运行,比如说把\(y=2x\)改为\(y=3x\),那么可能会出现这样的图像:

也就是说\(y=2x\)\(y=3x\)会同时出现在同一个图像上,并且还会出现一条拟合这两个函数的线。解决方法如下:

  • 方法一:把--logdir中对应的文件夹找到,并直接删除。然后再运行一次程序,绘制想要的图片。

  • 方法二:创建一个子文件

3.图像事件文件的读取

  • 方法同上

  • 如果要同时读取几张图片,可以有以下方法:

    • writer.add_image("test", img_array, 1, dataformats='HWC')中的step由1改为2或多个,此时可在同一个图像上,翻页显示

    • writer.add_image("test", img_array, 1, dataformats='HWC')中的tag由"test"改为另一个名字,此时可打开一个新的框来显示图像