! pip install tensorboardX
因为colab是notebook的形式,每次只能运行一个代码块。因此要想在colab上运行tensorboardx需要执行以下指令。
% load_ext tensorboard
运行这个语句以后就相当于开启了tensorboardx的服务。
到这里准备步骤都已经做完了,下面就是运行代码和可视化
在代码的最开始需要使用下面的语句,创建一个 SummaryWriter 的示例。
writer = SummaryWriter('runs/example')
在colab上推荐大家用runs/xx这样命名,如果不写runs不会默认创建到此文件夹下。
在代码执行以后就可以在runs的文件夹下看到example的文件夹。
writer = SummaryWriter(comment='example')
也可以这样进行命名,文件夹名称为“运行时间”-example
使用pytorch进行神经网络训练时,想要生成loss或者其他评价指标的折线图,使用add_scalar
add_scalar(tag, scalar_value, global_step=None, walltime=None)
参数:
main_tag(string)
- 该图的标签(名称)。
tag_scalar_dict(dict)
- 曲线图的y坐标
global_step(int)
- 曲线图的 x 坐标
walltime(float)
- 为 event 文件的文件名设置时间,默认为 time.time()
import numpy as np
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/example1')
for epoch in range(100):
writer.add_scalar('1',np.random.rand(),epoch)
writer.close()
这段代码实现了随机数的曲线图。
% tensorboard --logdir=runs/example1
运行上述代码,显示运行结果的可视化。
可以看到“1”为曲线图的名称,横坐标为epoch,纵坐标为random值。
如果有多个参数可以使用:
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
在神经网络训练过程中,需要将多次调参结果进行对比,比如不同lr的loss情况。
import numpy as np
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/example1')
for epoch in range(100):
writer.add_scalar('1',np.random.rand(),epoch)
writer.close()
import numpy as np
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/example2')
for epoch in range(100):
writer.add_scalar('1',epoch,epoch)
writer.close()
例如,第一次运行的是第一段代码,第二次运行的是第二段代码。
runs
文件夹下就会有两个文件夹,example1
和example2
。
但是这两段代码在writer.add_scalar
中对于图片的命名是一样的,tensorboardx会自动识别到同一张图下。
% tensorboard --logdir=runs
只需要在运行时改成父级文件夹即可。
可以看到,两次运行的曲线画在了“1”这张图中。
在神经网络训练中,无法预估运行多少epoch可以获得自己想要的结果,有时候不需要训练完全部epoch。
tensorboardx必须运行writer.close()
才能把训练的结果传入,因此如果提前停止就运行不到writer.close()
。
在此,只需要添加try/except
语句。
import numpy as np
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/example3')
class Infinit:
def __iter__(self):
return self
def __next__(self):
return None
i=0
for epoch in Infinit():
i=i+1
writer.add_scalars('2',{'xsinx':epoch*np.sin(epoch),'xcosx':epoch*np.cos(epoch)},epoch)
try:
writer.close()
except KeyboardInterrupt:
writer.close()
Infinit()
是一个死循环,这段代码如果不强行中断就会一直运行下去。
右键可以中断执行。
最下面异常提示为KeyboardInterrupt
,因此在except后输入KeyboardInterrupt
,也可以根据自己的需求修改为其他异常。