在上一节内容中学习了tensorboard中曲线绘制方法scalar和直方图统计方法histogram,本节内容仍然要学习tensorboard的其他方法,主要分为3个方面:(1)对图像进行可视化的方法add_image,和在对图像进行可视化时的1个实用工具torchvision.utils.make_grid:将图像进行网格化;(2)AlexNet模型中卷积核与特征图可视化;(3)可视化当前网络add_graph 和工具包torchsummary:打印整个网络的信息。
4、add_image()
功能:记录图像
add_image(tag,img_tensor,global_step=None,
walltime=None,dataformats='CHW')
tag:图像的标签名,图的唯一标识
img_tensor:图像数据,注意尺度
global_step:x轴
dataformats:数据形式,CHW(默认形式),HWC,HW
解释
img_tensor:图像数据尺度
通常数据输入到网络中后就不再符合RGB的0-255区间了,会是一系列的浮点数即0—1或-1—1之间的小数,而无法对其可视化。这时,对img_tensor输入就有了规定:如果输入图像数据范围在[0,1],就乘以255即[0,1]*255→[0,255];如果检测到输入数据存在大于1的像素值如1.1,就会默认为输入数据范围是[0,255],该大于1的像素点就为0-255范围内的1.1。(见实例)
dataformats:输入数据img_tensor的形式,具体有3种形式可选,CHW为默认形式,HW为灰度图像。
实验
由于add_image方法不能在同一界面下看到多幅图像的可视化结果,因此选择采用Pytorch提供的make_grid函数。
5、torchvision.utils.make_grid
功能:制作网格图像
make_grid(tensor,nrow=8,padding=2,normalize=False,
range=None,scale_each=False,pad_value=0)
tensor:图像数据,B*C*H*W 形式
nrow:行数(列数自动计算)
padding:图像间距(像素单位,默认为2)
normalize:是否将像素值标准化
range:标准化范围
scalge_each:是否单张图维度标准化
pad_value:padding的像素值
解释
tensor:tensor是要可视化的图像数据,可以根据1个Batch的形式输入,不需要手动划分,其中B为batch_size;
nrow:行数,其列数自动计算;比如想要可视化的批量数据为16张,设置行数为4,自动计算得到列数为4;
padding:可视化图像之间的像素间距,也就是分割线宽,通常默认设置为2;
pad_value:分割线的像素值。
实验
结果
(2)特征图可视化
add_graph能够可视化模型的计算图,也就是数据流的方向,通常可以用来观察模型结构。
6、add_graph()
功能:可视化模型计算图
add_graph(model,input_to_model=None,verbose=False)
model:模型,必须是nn.Module
input_to_model:模型接收的数据
verbose:是否打印计算图结构信息
该方法必须在pytorch_1.3及以上版本使用,否则web端查看的计算图存在bug。
add_graph查看到的计算图还是相对复杂的,为了便于观察和调试,下面还有一种方法torchsummary。
7、torchsummary
功能:查看模型信息,便于调试
add_graph(model,input_size,batch_size=-1(默认),verbose=False)
model:pytorch模型
input_size:模型输入size
batch_size:batch size
device:‘cuda’ or 'cpu'
打印模型每一层的shape,以及模型的参数总量
实验
writer = SummaryWriter(comment='test_your_comment', filename_suffix="_test_your_filename_suffix")
# 模型
fake_img = torch.randn(1, 3, 32, 32)
lenet = LeNet(classes=2)
writer.add_graph(lenet, fake_img)
writer.close()
# torchsummary
from torchsummary import summary
print(summary(lenet, (3, 32, 32), device="cpu"))