点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

仅作学术分享,不代表本公众号立场,侵权联系删除

转载于:作者丨Pascal@知乎

0、前言

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

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

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

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

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

1、Loss可视化

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

tb_logger.add_scalar('loss_train', loss, curr_step)

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

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

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

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

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

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

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

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)

需要注意的是:

  • 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)

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网络可视化工具

Netscope
https://ethereon.github.io/netscope/%23/editor

PyTorch等网络的可视化工具

https://github.com/waleedka/hiddenlayer

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

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

收藏 | PyTorch模型训练特征图可视化(TensorboardX)相关推荐

  1. 卷积神经网络特征图可视化及其意义

    文章目录 特征图可视化方法 1. tensor->numpy->plt.save 2. register_forward_pre_hook函数实现特征图获取 3. 反卷积可视化 特征图可视 ...

  2. PyTorch 模型训练实用教程(六):监控模型——可视化

    本章将介绍如何在 PyTorch 中使用 TensorBoardX 对神经网络进行统计可视化,如Loss 曲线.Accuracy 曲线.卷积核可视化.权值直方图及多分位数折线图.特征图可视化.梯度直方 ...

  3. PyTorch 模型训练实用教程(附代码)

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx PyTorch 能在短时间内被众多研究人员和工程师接受并推崇是因为其有着诸多优点,如采用 Py ...

  4. CNN可视化技术总结(一)--特征图可视化

    导言: 在CV很多方向所谓改进模型,改进网络,都是在按照人的主观思想在改进,常常在说CNN的本质是提取特征,但并不知道它提取了什么特征,哪些区域对于识别真正起作用,也不知道网络是根据什么得出了分类结果 ...

  5. yolov5特征图可视化

    文章目录 前言 一.效果图 二.使用步骤 1.使用方法 2.注意事项 总结 参考 前言 最近写论文需要观察中间特征层的特征图,使用的是yolov5的代码仓库,但是苦于找不到很好的轮子,于是参考了很多, ...

  6. caffe for windows的matlab接口(四):权重和特征图可视化的一个例子

    模型读取 参照三,想实现一个自己图像的可视化过程: 首先我发现自己训练出的model没有deploy文件.查阅了下:"如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.pro ...

  7. 卷积神经网络特征图可视化热图可视化

    文章目录 前言 一.可视化特征图 二.热力图可视化(图像分类) 总结 前言 使用pytorch中的钩子将特征图和梯度勾出来,从而达到可视化特征图(featuremap)和可视化热图(heatmap)的 ...

  8. 深度学习网络和特征图可视化的工具介绍

    1.深度学习网络结构画图工具: 网络结构画图工具https://cbovar.github.io/ConvNetDraw/ 输入:层信息 输出:网络结构图 网络结构图实例 2.caffe可视化工具 输 ...

  9. 【总结】Keras+VGG16特征图可视化,帮助你深入理解VGG16

    Keras+VGG16特征图可视化 一.VGG16结构理解 1. 可视化结构图 2. VGGNet各级别网络结构图 3. VGG16网络结构图 二.Keras实现VGG16 代码实现 三.VGG16特 ...

最新文章

  1. 【Java学习】从一个简单的HelloWorld项目中入门maven
  2. C++程序的多文件组成
  3. C#[抽象类,接口]
  4. Redis 持久化之RDB和AOF
  5. python(5)- 基础数据类型
  6. 使用CMD命令修改Windows本地账户密码
  7. python函数复用_【python学习-4】可复用函数与模块
  8. Python学习笔记(数据类型)
  9. 插画素材 | 圣诞节设计离不了!
  10. android 中tools命名空间的全解
  11. python无限弹窗代码_python弹窗程序教程(附源码解析)
  12. javascript简易的动画效果
  13. 单片机应用系统设计技术——多功能出租车计费器
  14. opencv读取颜色通道
  15. python web 数据可视化框架_利用django框架,手把手教你搭建数据可视化系统(一)...
  16. 一个小兔子的大数据见解2
  17. mysql版本在哪看_mysql版本查询(mysql版本有哪些)
  18. 如何理解接口隔离原则?
  19. webpack的摇树、拆包、热更新、按需加载等难点
  20. sync包——互斥锁

热门文章

  1. 这些算法工程师,他们真的是太难了!
  2. ICLR 2020被爆半数审稿人无相关领域经验,同行评审制度在垮塌?
  3. 真相!30K拿到互联网大厂offer,网友:我服了!
  4. 首次!腾讯全面公开整体开源路线图
  5. 2019全球AI 100强,中国占独角兽半壁江山,但忧患暗存
  6. 美团面试题:String s = new String(111)会创建几个对象?
  7. 用漫画了解 Linux 内核到底长啥样!
  8. 我去,你写的 switch 语句也太老土了吧
  9. 2020 腾讯广告算法大赛:突破高分瓶颈方案分享
  10. 半年 5 战 5 金:Kaggle 史上最快 GrandMaster 是如何炼成的?