做网站的步骤 优帮云,手机app开发公司排行,网络营销师培训学校,可以推广的app有哪些PyTorch框架学习十五——可视化工具TensorBoard一、TensorBoard简介二、TensorBoard安装及测试三、TensorBoard的使用1.add_scalar()2.add_scalars()3.add_histogram()4.add_image()5.add_graph()之前的笔记介绍了模型训练中的数据、模型、损失函数和优化器#xff0c;下面将介…
PyTorch框架学习十五——可视化工具TensorBoard一、TensorBoard简介二、TensorBoard安装及测试三、TensorBoard的使用1.add_scalar()2.add_scalars()3.add_histogram()4.add_image()5.add_graph()之前的笔记介绍了模型训练中的数据、模型、损失函数和优化器下面将介绍迭代训练部分的知识而迭代训练过程中我们会想要监测或查看一些中间变量所以先介绍一下PyTorch的可视化使用的是TensorBoard。TensorBoard可以帮助显示很多重要的中间训练过程如可视化损失值、准确率的变化特征图的显示模型的计算图结构以及网络层的权重分布等等非常有利于分析模型的正确性方便理解和调整模型。
一、TensorBoard简介
TensorBoard是TensorFlow中强大的可视化工具支持显示标量、图像、文本、音频、视频和Embedding等多种数据可视化。其在PyTorch中也能使用。
它的运行机制如下图所示
在程序中加入记录可视化数据的代码程序运行的时候会在硬盘生成event file将需要记录和显示的数据存入event fileTensorBoard就可以读取event file里的数据并在终端默认网页进行绘制。
二、TensorBoard安装及测试
TensorBoard的安装也是很简单的打开Anaconda的终端进入需要安装TensorBoard的虚拟环境 然后输入pip install tensorboard就会自动安装 ps可能还需要手动再安装一个future包如果在安装TensorBoard时没有自动安装的话。
用一个例子来试验一下TensorBoard是否可以使用先不用管代码具体什么意思
import numpy as np
from torch.utils.tensorboard import SummaryWriterwriter SummaryWriter(commenttest_tensorboard)for x in range(100):writer.add_scalars(data/scalar_group, {xsinx: x * np.sin(x),xcosx: x * np.cos(x),arctanx: np.arctan(x)}, x)
writer.close()运行没有报错之后在终端进入该虚拟环境该路径下输入tensorboard --logdir./如下图所示 会给出一个网址点进去之后就是TensorBoard的终端网页以及绘制好的图像 以上就是安装以及测试的简介。
三、TensorBoard的使用
首先需要介绍SummaryWriter类
class SummaryWriter(object):def __init__(self, log_dirNone, comment, purge_stepNone, max_queue10,flush_secs120, filename_suffix):功能提供创建event file的高级接口。
主要属性都与event file的创建路径有关
log_direvent file输出文件夹的路径。comment不指定log_dir时文件夹的后缀。filename_suffixevent file文件名后缀。
举几个例子就明白了 首先是指定log_dir的
log_dir ./train_log/test_log_dir
writer SummaryWriter(log_dirlog_dir, comment_scalars, filename_suffix12345678)for x in range(100):writer.add_scalar(ypow_2_x, 2 ** x, x)writer.close()创建的event file的路径如下图所示
都是按照log_dir指定的路径创建此时comment虽然指定但是不起作用event file后面也带上了filename_suffix的后缀12345678。
再来看一下不指定log_dir的例子
writer SummaryWriter(comment_scalars, filename_suffix12345678)for x in range(100):writer.add_scalar(ypow_2_x, 2 ** x, x)writer.close()创建的event file的路径如下图所示 这边的runs/时间设备型号/event file是默认的创建路径comment指定的‘_scalars’是加在了时间设备型号这个文件夹后面即event file的上级目录filename_suffix指定的‘12345678’还是加在event file后面。
以上是SummaryWriter类的使用简介下面将介绍SummaryWriter类下的具体方法用以在TensorBoard中进行绘制。
1.add_scalar()
功能记录标量。
add_scalar(self, tag, scalar_value, global_stepNone, walltimeNone)主要参数
tag图像的标签名图的唯一标识。scalar_value要记录的标量y轴。global_stepx轴。
举例如下
max_epoch 100writer SummaryWriter(commenttest_comment, filename_suffixtest_suffix)for x in range(max_epoch):writer.add_scalar(y2x, x * 2, x)writer.add_scalar(ypow_2_x, 2 ** x, x)writer.close()分别可视化了y2x和ypow_2_x如下图所示
2.add_scalars()
功能在一张图中记录多个标量。
add_scalars(self, main_tag, tag_scalar_dict, global_stepNone, walltimeNone)主要参数
main_tag该图的标签。tag_scalar_dictkey是变量的tagvalue是变量的值。global_stepx轴。
例子的话刚刚测试的时候的代码就是用到了add_scalars()具体见上面。
3.add_histogram()
功能统计直方图与多分位数折线图。
add_histogram(self, tag, values, global_stepNone, binstensorflow, walltimeNone, max_binsNone)主要参数
tag同上。values要统计的参数。global_stepy轴。bins取直方图的bins一般用默认的’tensorflow’。
举例如下
writer SummaryWriter(commenttest_comment, filename_suffixtest_suffix)for x in range(2):np.random.seed(x)data_union np.arange(100)data_normal np.random.normal(size1000)writer.add_histogram(distribution union, data_union, x)writer.add_histogram(distribution normal, data_normal, x)writer.close()可视化了一个正态分布和均匀分布
4.add_image()
功能记录图像将CHW、HWC或HW格式的图像可视化。
add_image(self, tag, img_tensor, global_stepNone, walltimeNone, dataformatsCHW)主要参数
tag同上。img_tensor图像数据注意尺度。global_stepx轴。dataformats数据形式CHW、HWC或HW。
需要注意的是img_tensor这个参数当输入图像的像素全都小于等于1时会自动将所有像素值乘255若有大于1的则保持不变。
举例
writer SummaryWriter(commenttest_your_comment, filename_suffix_test_your_filename_suffix)# img 1 random
fake_img torch.randn(3, 512, 512)
writer.add_image(fake_img, fake_img, 1)
time.sleep(1)# img 2 ones
fake_img torch.ones(3, 512, 512)
time.sleep(1)
writer.add_image(fake_img, fake_img, 2)# img 3 1.1
fake_img torch.ones(3, 512, 512) * 1.1
time.sleep(1)
writer.add_image(fake_img, fake_img, 3)# img 4 HW
fake_img torch.rand(512, 512)
writer.add_image(fake_img, fake_img, 4, dataformatsHW)# img 5 HWC
fake_img torch.rand(512, 512, 3)
writer.add_image(fake_img, fake_img, 5, dataformatsHWC)writer.close()这里构造了五张图片第一张是随机产生的三通道图像第二张是像素值全为1的三通道图像第三张为像素值全为1.1的三通道图像第四张为像素值全都小于1的灰度图像第五张为像素值全都小于1的三通道图像只是通道数在最后一维结果如下图所示
第一张 第二张像素值全乘了2551×255即全为255显示全白 第三张像素值全为1.1超过了1不乘255因为像素值太小显示接近全黑 第四张 第五张 但是add_image单独使用的话有个缺点就是图像只会排成一行一次显示一张通过拖动下面这个东西来切换不同的图像非常麻烦 所以接下来介绍torchvision.utils.make_grid使用它制作网格图像再使用add_image进行显示。
make_grid(tensor, nrow8, padding2,normalizeFalse, rangeNone, scale_eachFalse, pad_value0)功能制作网格图像。
主要参数
tensor图像数据BCHW格式。nrow行数列数通过行数自动计算。padding图像间距像素单位。normalize是否将像素值标准化。range标准化的范围。scale_each是否单张图维度标准化。pad_valuepadding的像素值默认为0黑色。
举例
writer SummaryWriter(commenttest_your_comment, filename_suffix_test_your_filename_suffix)split_dir os.path.join(.., .., data, rmb_split)
train_dir os.path.join(split_dir, train)
# train_dir path to your training datatransform_compose transforms.Compose([transforms.Resize((32, 64)), transforms.ToTensor()])
train_data RMBDataset(data_dirtrain_dir, transformtransform_compose)
train_loader DataLoader(datasettrain_data, batch_size16, shuffleTrue)
data_batch, label_batch next(iter(train_loader))# img_grid vutils.make_grid(data_batch, nrow4, normalizeTrue, scale_eachTrue)
img_grid vutils.make_grid(data_batch, nrow4, normalizeFalse, scale_eachFalse)
writer.add_image(input img, img_grid, 0)writer.close()data_batch是我自己构造的一个包含了16张人民币图像的张量行数为4padding和pad_value都用默认normalize和scale_each都为False然后将构建好的网格图像送入add_image显示结果如下所示 这样一次性全部显示要比拖动来的更为直观。
5.add_graph()
功能可视化模型计算图数据流方向通常观察模型结构。
add_graph(self, model, input_to_modelNone, verboseFalse)主要参数
model模型必须是nn.Module。input_to_model输入给模型的数据。verbose是否打印计算图结构信息。
举例
writer SummaryWriter(commenttest_your_comment, filename_suffix_test_your_filename_suffix)# 模型
fake_img torch.randn(1, 3, 32, 32)lenet LeNet(classes2)writer.add_graph(lenet, fake_img)writer.close()from torchsummary import summary
print(summary(lenet, (3, 32, 32), devicecpu))绘制出了计算图 也可以查看LeNet的内部结构 但是直接分析计算图是比较复杂的这里还给出了一个更直观的包 torchsummary 其中的summary函数可以总结出每一层网络层的输出尺寸、参数量以及占用多少内存等关键信息上述LeNet的信息如下
----------------------------------------------------------------Layer (type) Output Shape Param #
Conv2d-1 [-1, 6, 28, 28] 456Conv2d-2 [-1, 16, 10, 10] 2,416Linear-3 [-1, 120] 48,120Linear-4 [-1, 84] 10,164Linear-5 [-1, 2] 170Total params: 61,326
Trainable params: 61,326
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.01
Forward/backward pass size (MB): 0.05
Params size (MB): 0.23
Estimated Total Size (MB): 0.30
----------------------------------------------------------------
Nonetorchsummary
功能查看模型信息便于调试。
summary(model, input_size, batch_size-1, devicecuda)主要参数
modelPyTorch模型。input_size模型输入size。batch_size就是字面意思。device‘cuda’ 或 ‘cpu’