目录
Tensorboard
启动tensorboard服务
cd 到 logs 目录所在的同级目录,在命令行输入如下命令,logdir等式右边可以是相对路径或绝对路径。
tensorboard --logdir=logs --port 6006
#如果是Windows环境,要注意路径解析,如
#tensorboard --logdir=r'D:\myboard\test\logs' --port 6006
SummaryWriter类:from torch.utils.tensorboard import SummaryWriter
(摘要编写器)
如果调用SummaryWriter类没有传入log_dir
参数的话,会默认在当前目录下新建一个runs
文件夹用于存放训练过程中的event
事件文件。
使用自动生成的文件夹名称runs
创建SummaryWriter()。
writer = SummaryWriter()
# folder location: runs/May04_22-14-54_s-MacBook-Pro.local/
使用指定的文件夹名称my_experiment
创建SummaryWriter()。
writer = SummaryWriter("my_experiment")
# folder location: my_experiment
创建一个附加注释的SummaryWriter()。
writer = SummaryWriter(comment="LR_0.1_BATCH_16")
# folder location: runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/
writer.add_image(tag, tensor, step) # 添加图像(模型图像,观察训练结果)
writer.add_scalar(tag, tensor, step) # 添加标量(就是一些数据的变化曲线,比如loss)
writer.add_graph(model, input) # 查看模型计算图
writer.close()关闭
打开tensorboard观察图表的方式:在pycharm的终端Terminal中键入tensorboard --logdir=logs --port=6007(最后指定端口的操作是可选的,这里指定端口是为了避免:当前有多人在使用同一个服务器的默认端口进行训练而造成的拥塞
注意:
1)当前面3步运行完之后,再通过第4步指定event文件的存放路径,将event文件们显示进行观察。
2)如果同一logdir下存放了多个相同tag的event文件,则绘图时会发生混乱。解决方案:将此logdir下的文件全部删除,然后重新运行。or构建子文件夹,也就是说创建新的SummaryWriter(‘新文件夹’)
运用writer.add_image()。由上节 P8 可知,add_image能处理的图像数据类型是:torch.Tensor、numpy.array、String。
IL.Image 读取的数据类型是PIL.JpegImagePlugin.JpegImageFile,所以需要转换成 numpy.array 才可放进 add_image 中使用。
利用numpy.array() 将 PIL 转为 numpy.ndarray
from PIL import Image
image_path = 'hymenoptera_data/train/ants/0013035.jpg'
img = Image.open(image_path)
print(type(img)) #
import numpy as np
img_array = np.array(img)
print(type(img_array)) #
img_tensor的默认shape是(3, H, W)
如果要使用其他的shape,则需要通过dataformats来指明一下,即:dataformats=‘CHW’、dataformats=‘HWC’、dataformats=‘HW’
通过将PIL转换为numpy后,虽然满足了img_tensor的数据类型要求,但是没有满足img_tensor的默认shape要求。
因为转换后的numpy的shape是(H,W,C),也就是说channel=3在最后一维,所以还需要在add_image()中添加参数dataformats=(H,W,C)(或者手动调整一下维度,代码为img_array = img_array.transepose(2, 0, 1),然后就不用添加dataformats参数了)。
from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np
writer = SummaryWriter('logs_3') # 实例化一个SummaryWriter为writer,并指定event的保存路径为logs
image_path1 = 'hymenoptera_data/train/ants/0013035.jpg'
image_path2 = 'hymenoptera_data/train/bees/16838648_415acd9e3f.jpg'
img = Image.open(image_path2) # image_path1
img_array = np.array(img)
print(type(img)) #
print(type(img_array)) #
print(img_array.shape)
# 这里的add_image中的tag为'test_image'没有变化,所以在tensorboard中可通过拖动滑块来展示这两张图像
# writer.add_image('test_image', img_array, 1, dataformats='HWC')
writer.add_image('test_image', img_array, 2, dataformats='HWC')
for i in range(10): # 这个add_scalar暂时没有管它,虽然tag没有变,但是因为每次写入的数据都是y=3x所以曲线没有显示混乱
writer.add_scalar('y=3x', 3 * i, i)
writer.close() # 最后还需要将这个writer关闭