05 Tensorboard使用

SummaryWriter类的使用

首先从utils这个工具箱中导入tensorboard和SummaryWriter类

from torch.utils.tensorboard import SummaryWriter

查看SummaryWriter类的定义(按Ctrl键查看),第一句话是这样的

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

说明SummaryWriter类是直接向log_dir这个文件夹写入的一个事件文件,这个事件文件可以被TensorBoard进行解析。

然后来看看SummaryWriter类初始化函数的定义

def __init__(  
    self,  
    log_dir=None,  
    comment="",  
    purge_step=None,  
    max_queue=10,  
    flush_secs=120,  
    filename_suffix="",  
):

可以看到,我们需要去输入一个文件夹的名称(不输也可以).

Examples::  
  
    from torch.utils.tensorboard import SummaryWriter  
    # create a summary writer with automatically generated folder name.    
    writer = SummaryWriter()    
    # folder location: runs/May04_22-14-54_s-MacBook-Pro.local/  
    # create a summary writer using the specified folder name.    
    writer = SummaryWriter("my_experiment")    
    # folder location: my_experiment  
    # create a summary writer with comment appended.    
    writer = SummaryWriter(comment="LR_0.1_BATCH_16")    
    # folder location: runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/

可以看到可以不加参数,有一个默认文件夹,同时可以设置一个相应的参数,LR表示学习速率,还可以设置BATCH size。

然后可以回到代码文件中来创建我们的实例了,一般用writer来表示实例化对象

writer = SummaryWriter("logs") //将事件文件存入logs文件夹中

然后我们主要会使用SummaryWriter类中的add_image和add_scalar方法,最后需要close

writer.add_image()  //添加图片 
writer.add_scalar()  //添加标量()
  
writer.close()

add_scalar()方法的使用

add_scalar函数的定义如下

def add_scalar(  
    self,  
    tag,  
    scalar_value,  
    global_step=None,  
    walltime=None,  
    new_style=False,  
    double_precision=False,  
):
// Add scalar data to summary.  
Args:  
    tag (string): Data identifier    
    scalar_value (float or string/blobname): Value to save    
    global_step (int): Global step value to record    
    walltime (float): Optional override default walltime (time.time())      with seconds after epoch of event    
    new_style (boolean): Whether to use new style (tensor field) or old      style (simple_value field). New style could lead to faster data loading.

可以看到,add_scalar主要用于向summary中添加标量数据,tag类似于一张图片的标题,scalar_value是我们需要保存的数值(纵坐标),global_step是对应的步数(横坐标)。

我们可以尝试写一下,比如这样:

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

可以发现文件夹中多了一个事件文件

在这里插入图片描述

我们可以在终端打开

在这里插入图片描述

默认打开的是6006端口,我们也可以自己指定,来防止和别人冲突

在这里插入图片描述

点击进去就是我们的一个图,我们可以对其进行变换处理

在这里插入图片描述

但如果我们向同一个标题再写入一次数据的话,就会出现非常糟心的情况,比如我们同时写入y=2x和y=3x,都写在y=2x这个标题上,则图片会变成这样

在这里插入图片描述

这是因为在执行新的事件时,会延续上一个事件继续写,有两种解决办法,一种是将以前的logs文件删掉,或者在训练新数据时,重新建立一个子文件夹。

add_image方法的使用

add_image函数定义如下

def add_image(  
    self, tag, img_tensor, global_step=None, walltime=None, dataformats="CHW" 

	//Add image data to summary.  
  
	Note that this requires the ``pillow`` package.  
  
Args:  
    tag (string): Data identifier    
    img_tensor (torch.Tensor, numpy.array, or string/blobname): Image data    
    global_step (int): Global step value to record    
):

tag还是标题,img_tensor是图像的数据类型,可以是torch.Tensor或numpy.array或string或其他。

我们在控制台进行尝试,先输入文件路径

image_path="data/train/ants_image/0013035.jpg"

这里不能用PIL来保存图片数据,因为PIL导入的图片格式为PIL格式,无法用到add_image中,因此我们用numpy型。

from PIL import Image
img_PIL = Image.open(image_path)
import numpy as np
img_array = np.array(img_PIL)

之后我们就能调用add_image方法来进行图片数据导入了

writer.add_image("test", img_array, 1)

第一个参数test是标题,第二个是图片数据,第三个是步长(横坐标)。

但此时会报错,这是因为我们没有设置图片数据的表示方式,查看add_image定义,可以发现这样一段话

img_tensor: Default is :math:`(3, H, W)`. You can use ``torchvision.utils.make_grid()`` to  
convert a batch of tensor into 3xHxW format or call ``add_images`` and let us do the job.  
Tensor with :math:`(1, H, W)`, :math:`(H, W)`, :math:`(H, W, 3)` is also suitable as long as  
corresponding ``dataformats`` argument is passed, e.g. ``CHW``, ``HWC``, ``HW``.

我们可以用CHW/HWC/HW来对图片数据进行设置。

先查看numpy型图片的格式

print(img_array.shape)

输出:
(512, 768, 3)

可以发现通道在最后面,是HWC格式。

writer.add_image("test", img_array, 1, dataformats='HWC')

在tensorboard中进行查看,可以发现多了一张图片

在这里插入图片描述

若在同一个标题重复添加图片,则它们之间通过步长来区分,即在不同步长下的图片不同,注意,不会覆盖原步长下已经有的图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值