楼主Pytorch系列中,TensorBoardX的使用教程是一直在规划中的,因总总原因耽搁了,后有读者私信,能不能补上TensorBoardX的使用案例,才想起补上这个坑。
首先来一下,tensorboardX和Tensorboard的区别吧。
以下皆翻译自 https://tensorboardx.readthedocs.io/en/latest/tutorial.html
谷歌的tensorflow的tensorboard是一个web服务器,用于可视化神经网络的训练过程,它可视化标量值、图像、文本等,主要用于保存tensorflow中的事件,比如学习率、loss等。遗憾的是,其他深度学习框架缺少这样的工具,因此,tensorboardX就出现了,这个软件包的目的是让研究人员使用一个简单的界面来记录PyTorch中的事件(然后在tensorboard中显示可视化)。tensorboardX软件包目前支持记录标量、图像、音频、直方图、文本、嵌入和反向传播路径
Pytorch猫狗大战系列:
猫狗大战1-训练和测试自己的数据集
猫狗大战2-AlexNet
猫狗大战3-MobileNet_V1&V2
猫狗大战3-MobileNet_V3
TensorFlow 2.0猫狗大战系列
猫狗大战1、制作与读取record数据
猫狗大战2、训练与保存模型
一、安装tensorboardX
pip3 install tensorboardX
二、使用TensorboardX
2.1 创建 SummaryWriter
想要记录任何事件、日志等,都必须先创建一个SummaryWriter
调用SummaryWriter(object)这个类
class SummaryWriter(object):
def __init__(
self,
logdir: Optional[str] = None,
comment: Optional[str] = "",
purge_step: Optional[int] = None,
max_queue: Optional[int] = 10,
flush_secs: Optional[int] = 120,
filename_suffix: Optional[str] = '',
write_to_disk: Optional[bool] = True,
log_dir: Optional[str] = None,
comet_config: Optional[dict] = {"disabled": True},
**kwargs):
"""Creates a `SummaryWriter` that will write out events and summaries
to the event file.
Args:
logdir: Save directory location. Default is
runs/**CURRENT_DATETIME_HOSTNAME**, which changes after each run.
Use hierarchical folder structure to compare
between runs easily. e.g. pass in 'runs/exp1', 'runs/exp2', etc.
for each new experiment to compare across them.
comment: Comment logdir suffix appended to the default
``logdir``. If ``logdir`` is assigned, this argument has no effect.
purge_step:
When logging crashes at step :math:`T+X` and restarts at step :math:`T`,
any events whose global_step larger or equal to :math:`T` will be
purged and hidden from TensorBoard.
Note that crashed and resumed experiments should have the same ``logdir``.
max_queue: Size of the queue for pending events and
summaries before one of the 'add' calls forces a flush to disk.
Default is ten items.
flush_secs: How often, in seconds, to flush the
pending events and summaries to disk. Default is every two minutes.
filename_suffix: Suffix added to all event filenames in
the logdir directory. More details on filename construction in
tensorboard.summary.writer.event_file_writer.EventFileWriter.
write_to_disk:
If pass `False`, SummaryWriter will not write to disk.
comet_config:
A comet config dictionary. Contains parameters that need to be
passed to comet like workspace, project_name, api_key, disabled etc
"""
以下对参数的解释
- logdir 事件保存的路径,默认为 运行/程序的当前\u日期时间\u主机名,每次运行后更改
- comment 默认目录保存的路径的后缀,如果logdir有值,那这个值就不生效
一般用这两个参数就够了
from tensorboardX import SummaryWriter
# SummaryWriter encapsulates everything
writer = SummaryWriter(logdir='runs/exp-1')
# creates writer object. The log will be saved in 'runs/exp-1'
writer2 = SummaryWriter()
# creates writer2 object with auto generated file name, the dir will be something like 'runs/Aug20-17-20-33'
writer3 = SummaryWriter(comment='3x learning rate')
# creates writer3 object with auto generated file name, the comment will be appended to the filename. The dir will be something like 'runs/Aug20-17-20-33-3xlearning rate'
以上执行,可以看到,runs目录多出三个文件夹,分别对应writer、writer2、writer3
2.2 用浏览器查看tensorboardX生成的事件
在命令行
tensorboard --logdir=./exp-1
浏览器打开 http://localhost:6006/ 即可
2.3 使用Add scalar记录数字常量
add_scalars(main_tag: str,
tag_scalar_dict: Dict[str, float],
global_step: Optional[int] = None,
walltime: Optional[float] = None)`
参数:
- tag (string): 数据名称,不同名称的数据使用不同曲线展示
- scalar_value (float): 数字常量值
- global_step (int, optional): 训练的 step
- walltime (float, optional): 记录发生的时间,默认为 time.time()
如以下demo:记录 y = x 2 + 1 ( x > 0 ) y = x^2+1 (x>0) y=x2+1(x>0)
"""
* * *** * * * *
* * * ** * *
**** * ** * *
* * * ** * *
* * ** * * ****
@File : writer_loger.py
@Date : 2021/11/10
@Require :
@Author : https://blog.csdn.net/hjxu2016/
@Funtion : 用tensorboardX来记录事件 y = x^2 (x>0)
"""
from tensorboardX import SummaryWriter
if __name__ == "__main__":
# SummaryWriter encapsulates everything
writer = SummaryWriter(logdir='runs/exp-1')
def func(x):
y = x**2+1
return y
for i in range(10):
writer.add_scalar('equation', func(i), global_step=i)
writer.add_scalar('exponential', 2 ** i, global_step=i)
记录了两个曲线:
2.4 使用 add_image来记录图片
def add_image(
self,
tag: str,
img_tensor: numpy_compatible,
global_step: Optional[int] = None,
walltime: Optional[float] = None,
dataformats: Optional[str] = 'CHW')
参数
- tag (string): 数据名称
- img_tensor (torch.Tensor / numpy.array): 图像数据
- global_step (int, optional): 训练的 step
- walltime (float, optional): 记录发生的时间,默认为 time.time()
- dataformats (string, optional): 图像数据的格式,默认为 ‘CHW’,还可以是 ‘CHW’、‘HWC’ 或 ‘HW’ 等
如Demo记录五个图像:
def writer_img():
# SummaryWriter encapsulates everything
writer = SummaryWriter(logdir='runs/exp-add_image')
img_list = glob.glob(os.path.join("./data", "*.jpg"))
for i in range(1, 6):
image = cv2.imread(img_list[i])
writer.add_image('countdown',
cv2.cvtColor(image, cv2.COLOR_BGR2RGB),
global_step=i,
dataformats='HWC')
进入tensorboard查看,还能调整对比度等
注意,这个add_image 一次只能插入一张图像,如果想插入多张图像,可以多张图片拼合成一张图片后,再插入。
2.5 使用add_histogram插入直方图
def add_histogram(
self,
tag: str,
values: numpy_compatible,
global_step: Optional[int] = None,
bins: Optional[str] = 'tensorflow',
walltime: Optional[float] = None,
max_bins=None):
参数
- tag (string): 数据名称
- values (torch.Tensor, numpy.array, or string/blobname): 用来构建直方图的数据
- global_step (int, optional): 训练的 step
- bins (string, optional): 取值有 ‘tensorflow’、‘auto’、‘fd’ 等, 该参数决定了分桶的方式,详见这里。
- walltime (float, optional): 记录发生的时间,默认为 time.time()
- max_bins (int, optional): 最大分桶数
参考资料:
详解PyTorch项目使用TensorboardX进行训练可视化
官网地址:https://tensorboardx.readthedocs.io/en/latest/tutorial.html