tensorboard在pytorch1.1之后就也支持pytorch了

1.tensorboard涉及的类:SummaryWriter

全称是:torch.utils.tensorboard.SummaryWriter

常用的方式就是:

from torch.utils.tensorboard import SummaryWriter

utils就是torch中包括的常用的个工具箱集合罢了,很常用

2.官方文档对SummaryWriter描述:

"""Writes entries directly to event files in the log_dir to be
    consumed by TensorBoard.

    The `SummaryWriter` class provides a high-level API to create an event file
    in a given directory and add summaries and events to it. The class updates the
    file contents asynchronously. This allows a training program to call methods
    to add data to the file directly from the training loop, without slowing down
    training.
    """

大意是:将条目直接写入 log_dir 中的事件文件以供 TensorBoard 使用。

`SummaryWriter` 类提供了一个高级 API,用于在给定目录中创建事件文件,并向其中添加摘要和事件。 该类异步更新文件内容。 这允许训练程序调用方法以直接从训练循环将数据添加到文件中,而不会减慢训练速度

3. SummaryWriter使用方法:

重点解释__init__()函数:

所有的参数都时可选的,

重点介绍一下:

第一个参数 log_dir : 用以保存summary的位置,比如我接下来的例子里,SummaryWriter生成的writer实例的第一个参数都是 ZCH_Tensorboard_Trying_logs ,那么,我的当前代码所在文件夹下方就会出现一个名为 ZCH_Tensorboard_Trying_logs 的文件夹里面装的就是summary

第二个参数是加一些comment

官方文档中还给了点样例,如下:

4. SummaryWriter类中的常用函数 ---- add_scalar()

1. add_scalar()函数的目的是添加一个标量数据(scalar data)到summary中

2. 重要的常用的其实就是前三个参数:

(1)tag:要求是一个string,用以描述 该标量数据图的 标题

(2)scalar_value :可以简单理解为一个y轴值的列表

(3)global_step:可以简单理解为一个x轴值的列表,与y轴的值相对应

3. 代码例子:

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("ZCH_Tensorboard_Trying_logs")      #第一个参数指明 writer 把summary内容 写在哪个目录下

for i in range(100):
    writer.add_scalar("y=x",i,i)

for i in range(100):
    writer.add_scalar("y=2*x",2*i,i)


writer.close()     #将event log写完之后,记得close()

这里,我们用 SummaryWriter 类 构建了一个实例writer,它的第一个参数为:这表明,我们的summary将会被写到名为 ZCH_Tensorboard_Trying_logs 的文件夹下。

因此,运行完后会在当前文件夹目录下多出一个名为 ZCH_Tensorboard_Trying_logs 的文件夹,里面装的就是可以被tensorboard所解释的文件:events.out.tfevents.XXXX.zch.XXXXXX.0

现在,可解释文件已经生成,如何在网页中可视化的看一看呢?

4.可视化展示:

在Pyharm 的 terminal中,键入指令:tensorboard –logdir=XXXX(XXXX就是你要求tensorboard writer把文件写入的那个地方,对于本例来说,即 :ZCH_Tensorboard_Trying_logs)

有的时候,主机可能很多人再用,这个时候,为了防止端口号冲突,我们就可以设定一个特别的主机端口,方法是,将上述命令再多加一个参数:--port=

即,长这样: tensorboard --logdir=ZCH_Tensorboard_Trying_logs --port=6666

5.一个注意:

因为我们每次都在向summary中添加内容,但添加内容的时候,若writer.add_scalar()的第一个参数不变,只改变了之后的描绘数据部分,那么writer.add_scalar()函数就会把此次的数据描绘出的图案 覆盖掉 之前的 第一个参数相同的 那块数据的图案

所以,如果你的代码长这个样子,最终网页上就之会有两个图:

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("ZCH_Tensorboard_Trying_logs")      #第一个参数指明 writer 把summary内容 写在哪个目录下

for i in range(100):
    writer.add_scalar("y=x",i,i)

for i in range(100):
    writer.add_scalar("lll",2*i,i)

for i in range(100):
    writer.add_scalar("lll",5*i,i)

for i in range(100):
    writer.add_scalar("lll",9*i,i)

writer.close()     #将event log写完之后,记得close()

因此,其实我们也可以理解为对于用 add_scalar() 函数 画 标量数据图(scalar data)时,tag 参数有点像是唯一标识的意思。要保证图不被覆盖就要保证 add_scalar() 函数 中 tag参数是唯一的。

6. 两个小提示:

(1)在通过 tensorboard --logdir=ZCH_Tensorboard_Trying_logs –port=6666 指令打开网页后,就可以不用每次对代码修改后就在terminal中执行一次,代码修改完,运行完,直接啥新网页就可以看到更新了

(2)由于每次运行一次,就会在 ZCH_Tensorboard_Trying_logs文件夹中产生一个新的events.out.tfevents.1659857977.zch.34121.0文件,为了防止冗余和出错,简单的做法就是把这些文件都删除再重新运行一下(反正也会生成新的)。

5. SummaryWriter类中的常用函数  ---- add_image()

1.通过官方文档介绍一下这个函数是干吗的:

上图把要注意的部分标出来了: 首先明确这是一个向summary中添加图片的函数,然后该函数的参数还是老三样:

tag函数是该图片可视化的时候的标题;

img_tensor参数传入的是代表你要展示的图片的内容,格式必须要转换为 : torch.Tensor ,Numpy.array ,string ;

[注意] 这里特殊强调一下,图片上也标注了,就是如果我们将图片调整为Numpy.array格式,需要在向add_image()函数中传入一个为了对应 Numpy.array() 数据类型 而明确的 dataformats 参数,参数的目的是指明array的内容(具体解释原因见上图)

然后我也执行了一下通过PIL.Image()打开生成的图片是什么类型,再通过Numpy.array()函数转换后的类型又是个啥样:

可以看到,转换成array格式后,此时的数据组织形式就是HWC ,与defualt的数据组织形式不符合,所以add_image()函数中要加参数:dataformats='HWC'

 PS : 通过Numpy.array()函数,是最方便的读取到(得到)numpy.array形式的方式之一

2.函数对应的大致的使用方法如下:

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


#add_image()常用来观察训练结果:
img_path = "tttimage.jpg"    #文件的相对地址
img = Image.open(img_path)
img.show()
print( type(img) )
#但是,add_image()的第2个参数要求的格式是torch.Tensor ; numpy.array ; string
#转换成numpy.array格式
img = np.array(img)
print( type(img) )


writer = SummaryWriter("ZCH_Tensorboard_Trying_logs")      # 第一个参数指明 writer 把summary内容 写在哪个目录下,那么这条语句的意思就是让summary写到当前路径下的 ZCH_Tensorboard_Trying_logs 文件夹下
writer.add_image("test",img,1,dataformats='HWC')   #这里一定要注意一下:从PIL利用numpy转换到numpy.array格式,需要在add_image()函数的参数中,利用dataformats明确指定出shape中的每一个维度都表示的啥含义(三维的话就应该是'HWC')

writer.close()

3.如何可视化展示的方式同(三)add_scalar()的方法:

再PyCharm的Terminal中执行:tensorboard --logdir=ZCH_Tensorboard_Trying_logs --port=6677

执行结果展示如下hh

4. 同样,与add_scalar()一样,add_image()来添图片同样也是如果tag参数一直就在同一个框中添加,但是,有些情况就是需要在同一个框中添加,那只需要指明这些图片的步骤就好了,比如下例就是同一个框来展示两张图片,只不过通过参数global_step来知名该u图片该tag对应的图片展示框中里面第几个出现

代码如下所示:

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

writer = SummaryWriter("ZCH_Tensorboard_Trying_logs")      # 第一个参数指明 writer 把summary内容 写在哪个目录下,那么这条语句的意思就是让summary写到当前路径下的 ZCH_Tensorboard_Trying_logs 文件夹下

#add_image()常用来观察训练结果:
img_path = "tttimage.jpg"    #文件的相对地址
img = Image.open(img_path)
img = np.array(img)
writer.add_image("test",img,1,dataformats='HWC')   #global_step = 1 表明:在tag=test中,第一张图片是img=tttimage.jpg

img_path = "2222.jpg"    #文件的相对地址
img = Image.open(img_path)
img = np.array(img)
writer.add_image("test",img,2,dataformats='HWC')   #global_step = 2 表明:在tag=test中,第一张图片是img=2222.jpg

writer.close()

 4. 这里踩个坑:

(1)如果我们在使用writer后忘记了关闭writer,那么,代码运行不会出错,在terminal中打开网页版可视化时,tyerminal中也不会输出报错,但网页展示summary会报错,如下图所示:

这时候优先看看是否已经关闭了writer

(2)我通过用writer.add_scalar()先向summary中添加了一些标量数据,接下来我调用writer,close()函数,将writer关闭了

接着,我再次调用writer.add_image()函数向summary中添加了一些图片,但是此时,由于之前的writer已经被我们关闭了,所以在此重新赋值写入图片的writer(有时)会覆盖之前的操作,即,没有标量数据在网页中被可视化展示了,它已经被add_image()所添加的image覆盖掉了

但以不应定一定会覆盖,很神奇,所以建议大家再添加结束之前还是没必要去close()了

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐