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中进行查看,可以发现多了一张图片
若在同一个标题重复添加图片,则它们之间通过步长来区分,即在不同步长下的图片不同,注意,不会覆盖原步长下已经有的图片。