深度学习(14)—— 关于Tensorboard
文章目录
- 深度学习(14)—— 关于Tensorboard
- 前言
- 1. “一参数一图”
- 2.“多参数一图”
- 3. “一栏一图”
- 4. “一栏多图”
在模型训练过程中loss和acc都会发生变化,常常需要记录这些值,以便后期调整参数时有的根据,我刚开始用tf的时候里面有个function可以记录到checkpoint中,后来换用pytorch,自己懒得琢磨,就直接建立一个log列表记录每个epoch的train-loss,val-loss,train-acc和val-acc,以及其他的参数如learning-rate,weight-decay等。之前在一些代码中看到tensorboard,当时拿来用了用,但是也没有详细研究,直到一周前,一个同门要用,然后师兄自己以前也没研究过,他自己搞明白后,给大家做了个知识普及。好用的东西当然要拿出来和大家分享啦~( 先在此感谢师兄大晚上九点半不回家给大家讲完这个小知识点,属实辛苦)
前言
- 需要先安装好tensorboard的package
- 导入tensorboard
from torch.utils.tensorboard import SummaryWriter
- 创建日志文件夹
创建该文件夹,可以理解为这个项目的log文件都保存在这个文件夹下,里面可以根据参数的不同建立显得子文件夹,在实例化中进行
import os
import torch
log_dir = rf'./logs_{grade}'
if not os.path.exists(log_dir):
os.mkdir(log_dir)
else:
print(f'{log_dir} exist')
- 实例化tensorboard
在大的log文件夹中会新建一个文件夹,文件夹的名字是batch…(我以batch,学习率,weight_decay和gamma值作为子文件夹名)
tb_writer = SummaryWriter(log_dir= f'{log_dir}/batch_{batch_size}_lr_{learning_rate}_wd_{weight_decay}_gamma_{gamma}') # 保存日志到 logs/lr_1e-4_batch_16/ 下
最后的log文件夹会是这样子的
1. “一参数一图”
add_scalar()
tb_writer.add_scalar('train/loss', train_loss, epoch)
tb_writer.add_scalar('train/acc', train_acc, epoch)
tb_writer.add_scalar('val/loss', val_loss, epoch)
tb_writer.add_scalar('val/acc', val_acc, epoch)
tb_writer.add_scalar('learning_rate', optimizer.param_groups[0]["lr"], epoch)
解释一下:最后会产生train,val和learning_rate三栏,第一栏里面有两个figure分别是loss和acc,第二栏有两个figure,第三栏有一个figure
2.“多参数一图”
add_scales()
tb_writer.add_scalars('loss/',{'train':train_loss,'validate':val_loss},epoch)
tb_writer.add_scalars('accuracy/',{'train':train_acc,'validate':val_acc},epoch)
tb_writer.add_scalar('learning_rate',optimizer.param_groups[0]["lr"],epoch)
解释一下:最后会产生loss,accuracy和learning-rate三栏,每一栏只有一个figure,表示不同的阶段。学习率还是一个参数,只有前两个是两个参数。注意,重要的事情说三遍:想要多个参数一定是add_scales
!!!加s,加s,加s!!!然后后面使用字典形式列出需要可视化的参数!!!
OK,截止目前我用只用到这些,其实tensorboard还有其他的功能,如保存模型中间生成的figure等,可以通过这个来检查模型的有效性,但是呢,我还没有看,其实因为我还没试用,但是看效果是OK的。我也付一下test代码,你们用的话自取。
3. “一栏一图”
from PIL import Image
import numpy as np
writer = SummaryWriter(log_dir= f'{log_dir}/lr_1e-4_batch_18')
img_HWC = np.array(Image.open('train_valid/image/1.png').convert('RGB')) # 彩色图
img_HW = np.array(Image.open('train_valid/image/1.png').convert('L')) # 灰度图
# If you have non-default dimension setting, set the dataformats argument.
for i in range(5):
writer.add_image('my_image_HWC', img_HWC, i, dataformats='HWC')
writer.add_image('my_image_HW', img_HW, i, dataformats='HW')
writer.close()
注:保存图片支持numpy和tensor,不支持PIL的image,需要转换!RGB和灰度图是add的时候dataformat是不同的!
4. “一栏多图”
from PIL import Image
import numpy as np
writer = SummaryWriter(log_dir= f'{log_dir}/lr_1e-4_batch_18')
img_batch = np.zeros((5, 584, 565,3))
label_batch = np.zeros((5, 1, 584, 565))
for ind,i in enumerate(os.listdir('train_valid/image/')[0:5]):
image = np.array(Image.open(fr'train_valid/image/{i}'))
label = np.array(Image.open(fr'train_valid/mask/{i}').convert('L'))
img_batch[ind,:,:,:] = image
label_batch[ind,0,:,:] = label
print(label_batch.shape)
# If you have non-default dimension setting, set the dataformats argument.
writer.add_images('batch/image', img_batch, 0, dataformats='NHWC') # 彩色batch
writer.add_images('batch/label', label_batch,0, dataformats='NCHW') # 灰度batch 必须是NCHW
writer.close()
注:可以保存一个batch的图片!保存RGB和灰度图的时候dataformat是不同的!
如果是:
- RGB:NHWC/NCHW都可以
- 灰度:只能NCHW