神经网络可视化:卷积核可视化

文章目录

  • 前言
      • 一般过程:
  • 一、代码示例
  • 二、卷积核和输入图片相乘可视化
  • 总结


前言

卷积核可视化是一种用于理解卷积神经网络 (CNN) 中卷积层的工作原理和特征提取能力的方法。通过可视化卷积核,我们可以观察卷积层学习到的特征模式,帮助我们理解网络如何对输入进行处理。

本文给出了一个具体的pytorch实现的例子。
本文还给了一个用权重核和直接卷积图像的例子。

一般过程:

导入必要的库和模型:首先,你需要导入相关的库,如 PyTorch、NumPy 和 Matplotlib,并加载已经训练好的 CNN 模型。

获取卷积层权重:从模型中获取卷积层的权重。这些权重通常存储在模型的卷积层参数中。

可视化卷积核:对于每个卷积层,获取对应的权重,并以图像形式展示。可以使用 Matplotlib 或其他图像处理库来显示卷积核。

可选:对于多通道的卷积核,你可以将每个通道的权重分别可视化,以更好地理解卷积核的组成。


一、代码示例

以resnet50为例进行第一层可视化

import os
import numpy as np
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import models
from torchvision import transformsdef visualize_conv_filters():# 设置GPU设备torch.cuda.set_device(0) # 没有GPU可以删除model = models.resnet50(pretrained=True)model = model.cuda()  # 将模型移动到GPU上 # 没有GPU可以删除# 获取第一个卷积层的权重conv1_weights = model.conv1.weight.data.cpu().numpy()# 调整权重形状,从 [out_channels, in_channels, kernel_size, kernel_size] 变为 [out_channels, kernel_size, kernel_size, in_channels]conv1_weights = np.transpose(conv1_weights, (0, 2, 3, 1))# 可视化卷积核fig, axes = plt.subplots(nrows=8, ncols=8, figsize=(12, 12))for i, ax in enumerate(axes.flat):ax.imshow(conv1_weights[i])ax.axis('off')plt.show()if __name__ == '__main__':visualize_conv_filters()

获得图像:
在这里插入图片描述


二、卷积核和输入图片相乘可视化

把卷积核(作为权重)和图片进行卷积操作

import os
import numpy as np
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import models
from torchvision import transformsdef visualize_conv_filters(model_conv, img_file):# 设置GPU设备# torch.cuda.set_device(gpu_number)# model = models.resnet50(pretrained=True)# model = model.cuda()  # 将模型移动到GPU2上# 获取第一个卷积层的权重conv1_weights = model_conv.weight.data.cpu().numpy()# 调整权重形状,从 [out_channels, in_channels, kernel_size, kernel_size] 变为 [out_channels, kernel_size, kernel_size, in_channels]conv1_weights = np.transpose(conv1_weights, (0, 2, 3, 1))# 读入图像image = Image.open(img_file)image = transforms.ToTensor()(image)image = image.unsqueeze(0)  # 添加批次维度并将图像移动到GPU上# 对每个卷积核进行卷积操作并绘制图像fig, axes = plt.subplots(nrows=8, ncols=4, figsize=(12, 6),dpi=100)al_list = range(conv1_weights.shape[0])for i, ax in zip(al_list, axes.flat):conv1_weight = conv1_weights[i]conv1_weight = torch.from_numpy(conv1_weight).permute(2, 0, 1).cuda()  # 将当前卷积核移动到GPU上# 对图像的每个通道进行卷积操作output_channels = []for channel in range(conv1_weight.size(0)):conv1_weight_ = torch.unsqueeze(conv1_weight, 0)## 重点代码,卷积操作output_channel = torch.nn.functional.conv2d(image[:,channel:channel+1,:,:],conv1_weight_[:,channel:channel+1,:,:],stride=(1, 1), padding=0)output_channels.append(output_channel)# 合并卷积后的通道output = torch.cat(output_channels, dim=1)# 转换为NumPy数组并绘制图像output = output.squeeze(0).cpu().detach().numpy()  # 移除批次维度,并将结果移动到CPU上output = np.transpose(output, (1, 2, 0))  # 调整形状为 [height, width, channels]ax.imshow(output)ax.axis('off')# input('>>')if not os.path.exists('./img/'):os.mkdir('./img/')plt.savefig('./img/abc.png')if __name__ == '__main__':model = models.resnet50(pretrained=True)torch.cuda.set_device(0)img_file = 'img_1.png'visualize_conv_filters(model.conv1, img_file)

原图:
在这里插入图片描述
乘以卷积核之后的可视化结果:
在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了卷积核可视化的计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/185003.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 网页布局

网页布局有很多种方式&#xff0c;一般分为以下几个部分&#xff1a;头部区域、菜单导航区域、内容区域、底部区域&#xff1a; 1&#xff09;、头部区域位于整个网页的顶部&#xff0c;一般用于设置网页的标题或者网页的logo。 <style> body { margin: 0; } /* 头部样…

04【保姆级】-GO语言指针

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

大厂面试题-b树和b+树的理解

为了更清晰的解答这个问题&#xff0c;从三个方面来回答&#xff1a; a.了解二叉树、AVL树、B树的概念 b.B树和B树的应用场景 1.B树是一种多路平衡查找树&#xff0c;为了更形象的理解&#xff0c;我们来看这张图。 二叉树&#xff0c;每个节点支持两个分支的树结构&#xff…

【SVN】

SVN 1 svn使用1.1 主干合并到分支1.2 分支合并到主干1.3 分支建立1.4 创建分支1.5 切换分支1.6 合并分支1.7 删除分支 2 概念理解 1 svn使用 1.1 主干合并到分支 首先&#xff0c;在本地trunk中先update一下&#xff0c;有冲突的解决冲突&#xff0c;保证trunk和repository已…

python使用selenium做自动化,最新版Chrome与chromedriver不兼容

目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址&#xff1a; chrome版本118&#xff1a; https://download.csdn.net/download/qq_35845339/88510476 chrome版本119&#xff1a; chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…

Hybrid综合应用

1、需求 实现不同vlan间PC不可互访&#xff0c;而不同vlan的PC均可访问服务器的特殊效果&#xff0c;具体要求如下。 1&#xff09;在交换机中创建相关vlan 2&#xff09;修改端口模式与pvid 3&#xff09;修改端口允许通过的数据帧 4&#xff09;结果验证&#xff0c;vlan5与…

com.genuitec.eclipse.springframework.springnature

Your IDE is missing natures to properly support your projects. Some extensions on the eclipse marketplace can be installed to support those natures. com.genuitec.eclipse.springframework.springnature 移除 <nature>om.genuitec.eclipse.springframework.…

C++|前言

c|前言 一、什么是C二、C发展史三、C的重要性3.1语言的使用广泛度3.2工作领域3.3校招领域 四、如何学习C4.1别人怎么学4.2自己怎么学 一、什么是C 在上回书已经学习了C语言&#xff0c;我们知道C语言是面向过程语言&#xff0c;C语言是结构化和模块化的语言&#xff0c;适合处理…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

Pycharm加载项目时异常,看不到自己的项目文件

最近看到一个朋友问&#xff0c;他把项目导入pycharm为什么项目里的包不在项目里显示&#xff0c;只在projects file里显示&#xff1f;问题截图如下&#xff1a; Project里看不到自己的项目文件 只能在Project Files里看到自己的项目文件 问题解答 我也是偶然发现的这个方案…

08 # 手写 filter 方法

什么是 filter filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。如果没有元素通过测试&#xff0c;则返回一个空数组。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数…

Qt实现桌面小精灵(含源码)

目录 一、设计思路 二、部分源码演示 三、源码地址 🌈write in front🌈 🧸大家好,我是三雷科技.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由三雷科技原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:三雷科技🧸—CSDN博客 🎁欢…

物联网中的毫米波雷达:连接未来的智能设备

随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;连接设备的方式和效能变得越来越重要。毫米波雷达技术作为一种先进的感知技术&#xff0c;正在为物联网设备的连接和智能化提供全新的可能性。本文将深入探讨毫米波雷达在物联网中的应用&#xff0c;以及它是如…

向量数据库Chroma极简教程

引子 向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后&#xff0c;由于目前大模型的token数限制&#xff0c;很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入&#xff08;embedding&#xff09;算法转变为向量数据&#xf…

京东数据分析:2023年9月京东笔记本电脑行业品牌销售排行榜

鲸参谋监测的京东平台9月份笔记本电脑市场销售数据已出炉&#xff01; 9月份&#xff0c;笔记本电脑市场整体销售下滑。鲸参谋数据显示&#xff0c;今年9月份&#xff0c;京东平台上笔记本电脑的销量将近59万&#xff0c;环比下滑约21%&#xff0c;同比下滑约40%&#xff1b;销…

Go 接口-契约介绍

Go 接口-契约介绍 文章目录 Go 接口-契约介绍一、接口基本介绍1.1 接口类型介绍1.2 为什么要使用接口1.3 面向接口编程1.4 接口的定义 二、空接口2.1 空接口的定义2.2 空接口的应用2.2.1 空接口作为函数的参数2.2.2 空接口作为map的值 2.3 接口类型变量2.4 类型断言 三、尽量定…

这些机器视觉工程师犯法了,竟然在闲鱼或淘宝上卖公司的机器视觉程序架构源码

目录 ​从个人层面来讲&#xff1a;从公司层面来讲&#xff1a; ​从个人层面来讲&#xff1a; 个人是法盲&#xff0c;法律意识淡薄只是一方面&#xff0c;另外一个方面就是对于代码的所有权&#xff0c;以及代码的安全性重视不够。把机器视觉程序架构源码打包在闲鱼或淘宝上…

vue3 开启 https

1、安装mkcert证书创建器 npm i mkcert -g 2、检验是否安装成功 mkcert --version 有版本好出现则成功 3、创建证书颁发机构 mkcert create-ca 会在当前目录生成&#xff0c;ca.crt 和 ca.key 两个文件 4、创建证书 mkcert create-cert 会在当前目录生成&#xff0c;…

CSS特效003:太阳、地球、月球的旋转

GPT能够很好的应用到我们的代码开发中&#xff0c;能够提高开发速度。你可以利用其代码&#xff0c;做出一定的更改&#xff0c;然后实现效能。 css实战中&#xff0c;这种球体间的旋转&#xff0c;主要通过rotate()旋转函数来实现。实际上&#xff0c;蓝色的地球和黑色的月球…

Linux 内核顶层Makefile 详解

目录 Linux 内核获取Linux 内核初次编译Linux 工程目录分析VSCode 工程创建顶层Makefile 详解make xxx_defconfig 过程Makefile.build 脚本分析make 过程built-in.o 文件编译生成过程make zImage 过程 前几章我们重点讲解了如何移植uboot 到I.MX6U-ALPHA 开发板上&#xff0c;从…