0. 背景

在目标检测任务中,我们会使用多尺度的特征图进行预测,背后的常识是:浅层特征图包含丰富的边缘信息有利于定位小目标,高层特征图中包含大量的语义信息有利于大目标的定位和识别。为了进一步了解特征图包含的信息,可以通过可视化特征图直观的认识到神经网络学习得到的东西。此外,对于分析网络为什么有效和改进网络也有些许帮助。

1. pytorch提供的函数

1.1. register_forward_hook

利用register_forward_hook在特定的module上添加一个hook函数,对该module的输入和输出特征图进行分析。

1.2 save_image

利用save_image可以将单个通道的特征图拼接,并直接保存到磁盘上。

2.  VGG可视化特征图示例

  • 输入图像example.jpg
  • 代码
import torch
from torch import nn
from torchvision import models, transforms
from PIL import Image
from torchvision.utils import make_grid, save_image
import os
# model
net = models.vgg16_bn(pretrained=True).cuda()
# image pre-process
transforms_input = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])fImg = Image.open("input_image.jpg").convert('RGB')
data = transforms_input(fImg).unsqueeze(0).cuda()
# feature image save path
FEATURE_FOLDER = "./outputs/features"
if not os.path.exists(FEATURE_FOLDER):os.mkdir(FEATURE_FOLDER)
# three global vatiable for feature image name
feature_list = list()
count = 0
idx = 0def get_image_path_for_hook(module): global count  image_name = feature_list[count] + ".png"count += 1image_path = os.path.join(FEATURE_FOLDER, image_name)return image_pathdef hook_func(module, input, output):image_path = get_image_path_for_hook(module)data = output.clone().detach()global idxprint(idx, "->", data.shape)idx+=1data = data.data.permute(1, 0, 2, 3)save_image(data, image_path, normalize=False)for name, module in net.named_modules():if isinstance(module, torch.nn.Conv2d):print(name)feature_list.append(name)module.register_forward_hook(hook_func)out = net(data)
  • 输出log

通过输出的log可以了解到哪些符合要求的特征图以及它们的大小被打印出来了。

features.0
features.3
features.7
features.10
features.14
features.17
features.20
features.24
features.27
features.30
features.34
features.37
features.40
0 -> torch.Size([1, 64, 224, 224])
1 -> torch.Size([1, 64, 224, 224])
2 -> torch.Size([1, 128, 112, 112])
3 -> torch.Size([1, 128, 112, 112])
4 -> torch.Size([1, 256, 56, 56])
5 -> torch.Size([1, 256, 56, 56])
6 -> torch.Size([1, 256, 56, 56])
7 -> torch.Size([1, 512, 28, 28])
8 -> torch.Size([1, 512, 28, 28])
9 -> torch.Size([1, 512, 28, 28])
10 -> torch.Size([1, 512, 14, 14])
11 -> torch.Size([1, 512, 14, 14])
12 -> torch.Size([1, 512, 14, 14])

通过下面两行代码可以得到VGG网络中的所有module以及它们的name,可用于后续的对比验证保存得到的特征图结果时候正确。

for name, layer in net.named_modules():print(name, '->', layer)
features.0 -> Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.1 -> BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.2 -> ReLU(inplace=True)
features.3 -> Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.4 -> BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.5 -> ReLU(inplace=True)
features.6 -> MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
features.7 -> Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.8 -> BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.9 -> ReLU(inplace=True)
features.10 -> Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.11 -> BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.12 -> ReLU(inplace=True)
features.13 -> MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
features.14 -> Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.15 -> BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.16 -> ReLU(inplace=True)
features.17 -> Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.18 -> BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.19 -> ReLU(inplace=True)
features.20 -> Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.21 -> BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.22 -> ReLU(inplace=True)
features.23 -> MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
features.24 -> Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.25 -> BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.26 -> ReLU(inplace=True)
features.27 -> Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.28 -> BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.29 -> ReLU(inplace=True)
features.30 -> Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.31 -> BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.32 -> ReLU(inplace=True)
features.33 -> MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
features.34 -> Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.35 -> BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.36 -> ReLU(inplace=True)
features.37 -> Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.38 -> BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.39 -> ReLU(inplace=True)
features.40 -> Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
features.41 -> BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
features.42 -> ReLU(inplace=True)
features.43 -> MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)

输出特征图的结果

  • features.3.png
  • feature.17.png

通过上述的分析过程,可以得到VGG网络中不同卷积层输出的特征图,同时可以修改module的匹配原则得到其他类型层的输出,也即在合适的module后面添加本文的hook_func函数就可以对其特征图进行可视化。

参考链接

Pytorch可视化特征图_吹吹自然风-CSDN博客_可视化特征图

可视化pytorch网络特征图相关推荐

  1. pytorch中使用TensorBoard进行可视化Loss及特征图

    pytorch中使用TensorBoard进行可视化Loss及特征图 安装导入TensorBoard 安装TensorBoard pip install tensorboard 导入TensorBoa ...

  2. 【caffe-windows】全卷积网络特征图分析

    前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求,这么神奇的网络是时候分析一波了,我个人的学习方法调试代码,然后对照论文看理论 本次分析 ...

  3. pytorch实现特征图可视化,代码简洁,包教包会

    是不是要这样的效果 技术要点 1.选择一层网络,将图片的tensor放进去 2.将网络的输出plt.imshow 代码可直接复制使用,需要改的就是你的图片位置 import torch from to ...

  4. Pytorch可视化语义分割特征图

    简介 深度学习中有时候可视化特征图是必要的,特别是对于语义分割任务,合理分析特征图也许能够发现新的idea!接下来讲解一种Pytorch框架下的可视化方法,这里采取的网络模型为Deeplabv3+,首 ...

  5. 数据可视化—复杂网络关系图的绘制

    数据可视化的含义 将抽象概念进行形象性表达,将抽象语言进行具象图形可视的过程. 以数据为工具,以可视化为手段,去达到描述真实,探索世界的目的. 以数据的视角,去看待世界. 数据可视化其实是一个处于不断 ...

  6. pytorch以特征图的输入方式训练LSTM模型

    训练的时候总是会遇到这样的任务: 特征有很多维度,每个维度都有相同的embedding或长度 训练的时候想按照类似这样的二维图,训练LSTM模型,最后得出这张图对应的1个或多个结果 文章目录 步骤一: ...

  7. html关系图数据可视化,可视化图表—网络关系图

    描述 也称为「网络地图」或「节点链路图」. 这种图表使用节点/顶点和连接线来显示事物之间的连接关系,并帮助阐明一组实体之间的关系类型. 这些节点通常是圆点或小圆圈,但也可以使用图标.节点之间的连接关系 ...

  8. AlexNet层级分析(涉及:卷积核操作下下层网络特征图size计算;对通道和卷积核尺寸及通道前层feature map和卷积核的运算关系的解释)

    先盗一图,摘自ImageNet Classification with Deep Convolutional Neural Networks(Hinton) 注:看到这个结构,可以得到以下结论(以2. ...

  9. pytorch根据特征图训练LSTM Stacked AutoEncoder

    文章目录 步骤一:构造训练数据 步骤二:构造LSTM模型 构造三:构建训练数据 构造建模三件套 步骤四:训练模型并保存 全部代码 步骤一:构造训练数据 def get_train_data(clust ...

最新文章

  1. 拼多多java开发一面、二面合并面经
  2. 【响应式Web前端设计】Bootstrap入门Demo(导航栏)
  3. javascript随堂练习(分支,循环语句)
  4. 回顾build 2016:你好,这是微软迄今最好的Windows开发平台
  5. csv 字符串_Python实现json转csv格式
  6. Hive数据倾斜优化
  7. thymeleaf 获取yml中的值_Thymeleaf模板引擎学习
  8. 转:Linux网络IO并行化技术概览
  9. OA、CRM、进销存集成了,美女也不再愁了
  10. python入门——P49乱入:生成器
  11. 在计算机里面建一个新的文档,电脑上的word怎么新建文档
  12. 电子招投标——电子投标书制作教程
  13. 从全班同学的成绩中找出最高成绩(遍历一位数组)
  14. Java百宝箱——实现ip地址、手机号、身份证号归属地查询
  15. 我的【藏羚头条】开发运营经验
  16. airpods自动连接不上_首先在airpods pro上收听空间音频
  17. 【多模态学习】本周学习历程,附链接
  18. Java数字化智慧校园平台源码,智慧学校源码+微信小程序+人脸电子班牌
  19. 【知识网络分析】作者合作网络(Co-authorship)
  20. 如何在苹果Mac中将 APFS 格式 U 盘抹成通用格式?

热门文章

  1. 华为手机如何压缩视频?录屏压缩全都要
  2. H2N-Gly-Pro-Glu-COOH,32302-76-4
  3. 前端面试题之Promise
  4. Google Earth Engine(GEE)——NDVI、NDWI和NDBI用来进行增加分类精度的验证结果(随机森林和cart分类)
  5. “多规合一”下的改革红利,详解国内10大城市的城市更新实践与创新
  6. 技术专家太玄:企业数字化转型中数据底座“湖仓一体化”l 华坤道威专访
  7. attrib 未重置系统文件 - 解决办法
  8. GSL中的BLAS支持
  9. PTA基础编程题目集7-27 冒泡法排序
  10. 自己用js写的日历(在考勤中使用,显示员工的日期的考勤情况)