PyTorch模型训练特征图可视化(TensorboardX)

栏目: Python · 发布时间: 5年前

内容简介:同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流

加入极市 专业CV交流群,与 6000+来自腾讯,华为,百度,北大,清华,中科院 等名企名校视觉开发者互动交流!更有机会与 李开复老师 等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流 点击文末“ 阅读原文 ”立刻申请入群~

极市导读】 Tensorflow有一款非常优秀的可视化工具Tensorboard,而PyTorch自身没有可视化功能,但是我们可以寻找替代品,即TensorBoardX。 本文对TensorBoardX的使用与效果进行了简单的介绍

本文转载自知乎专栏:Keep Learning CV

来源:https://zhuanlan.zhihu.com/p/60753993

已获作者授权,请勿二次转载

0 、前言

  • 本文所有代码解读均基于PyTroch 1.0,Python3;

  • 本文为原创文章,初次完成于2019.03,最后更新于2019.03;

最近复现的一篇论文一直都难以work,上了特征图可视化后一下子就找到了问题所在,所以今天想梳理一下PyTorch里面的特征图可视化。

大家都知道Tensorflow有一款非常优秀的可视化工具Tensorboard,而PyTorch自身没有可视化功能,但是我们可以寻找替代品,即TensorBoardX。安装过程不多介绍,详见下面的参考链接,里面相应有比较丰富的介绍。

https://github.com/tensor-yu/PyTorch_Tutorial

1、Loss可视化

最常见的可视化就是loss曲线作图,这个实现相对比较简单,不多做介绍了

tb_logger.add_scalar('loss_train', loss, curr_step)
PyTorch模型训练特征图可视化(TensorboardX)

2、输入图片和标签的可视化

模型不work,第一个应该检查的就是输入输出有没有没给对,因此我们需要将传递给model的 input 和 label 可视化一下。

传递给网络的图片格式往往是 [B,C,H,W] ,范围[0, 1],数据类型tensor.FloatTensor,但是add_iamge() 能够接受的格式是[C,H,W], 范围[0,1],数据类型tensor.FloatTensor。

一个是三维的,一个是四维的,这很好解决,我们把每个batch的第一张图拿出来就行了:inptu[0]的形状就是[C,H,W],符合输入要求。

tb_logger.add_image('image', input[0].cpu(), curr_step)

tensoroard里面如果出现了猫咪本尊的正确可视化结果,就说明输入图片没问题

PyTorch模型训练特征图可视化(TensorboardX)

如果你在Dataloader里对输入图片做了Normalize,显示会出现问题,出现如下所示的乱码,此时需要通过make_grid()函数做一些处理,函数用法具体可见后面的描述。

PyTorch模型训练特征图可视化(TensorboardX)

3、单通道特征图的可视化

有时候我们需要把网络内部分节点的特征图可视化出来,这时候上面的方法就不能用了,因为特征图的每个像素点上的数值范围不是[0,1],而是可正可负,可大可小,因此需要做一些特殊处理。这里就要用到 torchvision.utils.make_grid( )函数,把输入的特征图做一个归一化,把参数normalize设置为True即可,它能帮我们把数据的输入范围调整至[0, 1]之间

def make_grid(tensor, nrow=8, padding=2,
normalize=False, range=None, scale_each=False, pad_value=0):

更多其他参数的用法参见源码:

https://github.com/pytorch/vision/blob/master/torchvision/utils.py

这里我把三个中间特征图拼在了一块显示:

from torchvision.utils import make_grid

tb_logger.add_image('feature_map', make_grid([feature_map1, feature_map2, fetare_map3], padding=20, normalize=True, scale_each=True, pad_value=1), curr_step)
PyTorch模型训练特征图可视化(TensorboardX)

需要注意的是:

  • make_grid() 输入的是Tensor,而不是numpy.ndarray

  • torchvision.utils.make_grid() 将一组图片绘制到一个窗口,其本质是将一组图片拼接成一张图片

4、多通道特征图的可视化

多通道的特征图的显示和上面的单通道存在一些区别,假设我们从batsh_size=16,channel=20的一个tensor想取出一个多通道特征图可视化,只需要如下操作

feature_map[0].deatch().cpu().unsqueeze(dim=1)

这样就能把一个形状为 [16,20, H, W] 的tesnor取出并转换为 [20, 1, H ,W] 的形状,这与为什么要这么转换,详解第五章节。

完整代码和效果图如下:

tb_logger.add_image('channels', make_grid(feature_map[0].detach().cpu().unsqueeze(dim=1), nrow=5, padding=20, normalize=False, pad_value=1), curr_step)
PyTorch模型训练特征图可视化(TensorboardX)

这里我贴一下原图

PyTorch模型训练特征图可视化(TensorboardX)

可以看到,在多通道特征图中不同的通道对于不同的类别的响应是存在差异的,有的通道对chair响应比较强烈,有的通道对person或者tv响应比较强烈,符合预期。

类似的,table和person也会有差异

PyTorch模型训练特征图可视化(TensorboardX)
PyTorch模型训练特征图可视化(TensorboardX)

5、make_grid()通道数的问题

测试发现,输入 [1, H, W] 的数据没问题,但是[20, H, W] 就不行,[20, 1, H, W] 就可以

这是因为单通道 [1, H, W] 不存在歧义,但是多通道就不行,比如说[3, H, W] 到底是一张三通道的图还是三张单通道的图,存在歧义

因此想要显示一张多通道的特征图可以这么转换:[1, C, H, W] --> [C, 1, H, W],显性地指明tensor形状。

6、总结

特征图可视化在模型复现过程中十分有用,可用于定位模型错误所在,但是在tensor的数据格式、尺寸、维度上存在许多讲究,使用时需要额外小心。

附录一: 相关函数源码

其实想要熟练使用,还是多看看make_grid的源码和样例吧:

https://github.com/pytorch/vision/blob/master/torchvision/utils.py

https://gist.github.com/anonymous/bf16430f7750c023141c562f3e9f2a91

附录二: 网络结构可视化工具

Caffe网络可视化工具:

http://ethereon.github.io/netscope/#/editor

PyTorch等网络的可视化工具:

https://github.com/waleedka/hiddenlayer

大概是这么个效果,相对清晰一些

PyTorch模型训练特征图可视化(TensorboardX)
(完)

点击左下角 阅读原文 ”, 即可申请加入极市 目标跟踪、目标检测、工业检测、人脸方向、视觉竞赛等技术交流群, 更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流, 一起来让思想之光照的更远吧~

PyTorch模型训练特征图可视化(TensorboardX)

△长按关注极市平台

觉得有用麻烦给个在看啦~    PyTorch模型训练特征图可视化(TensorboardX)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

嵌入式系统开发之道

嵌入式系统开发之道

2011-12 / 69.00元

《嵌入式系统开发之道:菜鸟成长日志与项目经理的私房菜》用平易朴实的语言,以一个完整的嵌入式系统的开发流程为架构,通过一位“菜鸟”工程师与项目经理的诙谐对话,故事性地带出嵌入式系统概念及开发要素,并点出要成为一名称职的嵌入式系统工程师,在实际工作中所必须具备的各项知识及技能。 《嵌入式系统开发之道:菜鸟成长日志与项目经理的私房菜》可以分为三大部分:第1、3、4、17、18、19章和附录D为嵌入......一起来看看 《嵌入式系统开发之道》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具