可视化pytorch网络特征图
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网络特征图相关推荐
- pytorch中使用TensorBoard进行可视化Loss及特征图
pytorch中使用TensorBoard进行可视化Loss及特征图 安装导入TensorBoard 安装TensorBoard pip install tensorboard 导入TensorBoa ...
- 【caffe-windows】全卷积网络特征图分析
前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求,这么神奇的网络是时候分析一波了,我个人的学习方法调试代码,然后对照论文看理论 本次分析 ...
- pytorch实现特征图可视化,代码简洁,包教包会
是不是要这样的效果 技术要点 1.选择一层网络,将图片的tensor放进去 2.将网络的输出plt.imshow 代码可直接复制使用,需要改的就是你的图片位置 import torch from to ...
- Pytorch可视化语义分割特征图
简介 深度学习中有时候可视化特征图是必要的,特别是对于语义分割任务,合理分析特征图也许能够发现新的idea!接下来讲解一种Pytorch框架下的可视化方法,这里采取的网络模型为Deeplabv3+,首 ...
- 数据可视化—复杂网络关系图的绘制
数据可视化的含义 将抽象概念进行形象性表达,将抽象语言进行具象图形可视的过程. 以数据为工具,以可视化为手段,去达到描述真实,探索世界的目的. 以数据的视角,去看待世界. 数据可视化其实是一个处于不断 ...
- pytorch以特征图的输入方式训练LSTM模型
训练的时候总是会遇到这样的任务: 特征有很多维度,每个维度都有相同的embedding或长度 训练的时候想按照类似这样的二维图,训练LSTM模型,最后得出这张图对应的1个或多个结果 文章目录 步骤一: ...
- html关系图数据可视化,可视化图表—网络关系图
描述 也称为「网络地图」或「节点链路图」. 这种图表使用节点/顶点和连接线来显示事物之间的连接关系,并帮助阐明一组实体之间的关系类型. 这些节点通常是圆点或小圆圈,但也可以使用图标.节点之间的连接关系 ...
- AlexNet层级分析(涉及:卷积核操作下下层网络特征图size计算;对通道和卷积核尺寸及通道前层feature map和卷积核的运算关系的解释)
先盗一图,摘自ImageNet Classification with Deep Convolutional Neural Networks(Hinton) 注:看到这个结构,可以得到以下结论(以2. ...
- pytorch根据特征图训练LSTM Stacked AutoEncoder
文章目录 步骤一:构造训练数据 步骤二:构造LSTM模型 构造三:构建训练数据 构造建模三件套 步骤四:训练模型并保存 全部代码 步骤一:构造训练数据 def get_train_data(clust ...
最新文章
- 拼多多java开发一面、二面合并面经
- 【响应式Web前端设计】Bootstrap入门Demo(导航栏)
- javascript随堂练习(分支,循环语句)
- 回顾build 2016:你好,这是微软迄今最好的Windows开发平台
- csv 字符串_Python实现json转csv格式
- Hive数据倾斜优化
- thymeleaf 获取yml中的值_Thymeleaf模板引擎学习
- 转:Linux网络IO并行化技术概览
- OA、CRM、进销存集成了,美女也不再愁了
- python入门——P49乱入:生成器
- 在计算机里面建一个新的文档,电脑上的word怎么新建文档
- 电子招投标——电子投标书制作教程
- 从全班同学的成绩中找出最高成绩(遍历一位数组)
- Java百宝箱——实现ip地址、手机号、身份证号归属地查询
- 我的【藏羚头条】开发运营经验
- airpods自动连接不上_首先在airpods pro上收听空间音频
- 【多模态学习】本周学习历程,附链接
- Java数字化智慧校园平台源码,智慧学校源码+微信小程序+人脸电子班牌
- 【知识网络分析】作者合作网络(Co-authorship)
- 如何在苹果Mac中将 APFS 格式 U 盘抹成通用格式?
热门文章
- 华为手机如何压缩视频?录屏压缩全都要
- H2N-Gly-Pro-Glu-COOH,32302-76-4
- 前端面试题之Promise
- Google Earth Engine(GEE)——NDVI、NDWI和NDBI用来进行增加分类精度的验证结果(随机森林和cart分类)
- “多规合一”下的改革红利,详解国内10大城市的城市更新实践与创新
- 技术专家太玄:企业数字化转型中数据底座“湖仓一体化”l 华坤道威专访
- attrib 未重置系统文件 - 解决办法
- GSL中的BLAS支持
- PTA基础编程题目集7-27 冒泡法排序
- 自己用js写的日历(在考勤中使用,显示员工的日期的考勤情况)