深度学习(14)—— 关于Tensorboard

深度学习(14)—— 关于Tensorboard

文章目录

  • 深度学习(14)—— 关于Tensorboard
    • 前言
    • 1. “一参数一图”
    • 2.“多参数一图”
    • 3. “一栏一图”
    • 4. “一栏多图”
    • 5.使用

在模型训练过程中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文件夹会是这样子的
深度学习(14)—— 关于Tensorboard_第1张图片

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
深度学习(14)—— 关于Tensorboard_第2张图片
深度学习(14)—— 关于Tensorboard_第3张图片

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!!!然后后面使用字典形式列出需要可视化的参数!!!
深度学习(14)—— 关于Tensorboard_第4张图片

深度学习(14)—— 关于Tensorboard_第5张图片
深度学习(14)—— 关于Tensorboard_第6张图片

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

5.使用

昨天太仓促,忘记写怎么查看可视化这些log文件呢?
linux:tensorboard --logdir='logs_dir'
windows:tensorboard.exe --logdir='logs_dir'
(其中的logs_dir是上面创建的文件夹name)

你可能感兴趣的:(深度学习,深度学习,pytorch,tensorboard)