【神经网络可视化】 梯度上升,可视化工具,风格转移

news2024/12/28 4:05:55

可视化可以帮助我们更好的理解卷积网络每一层学到了什么,或者说每一个卷积核究竟学到了什么,他是怎么理解图像的

这种的话当我们神经网络结果不太好时,我们可以分析不好的原因

图片来源于李飞飞老师的内容

梯度上升方法做可视化

文章目录

  • 1. 第一层
  • 2. 最后一层
  • 3 中间层
    • 3.2 内部响应分析法
    • 3.3 原图外部分析方法
    • 3.4 遮挡分析法
    • 3.5 梯度传递
    • 3.6 梯度上升
  • 4 其他应用
    • 4.1 风格转移
  • 5 可视化工具
    • 5.1 sailency
    • 5.2 最大化激活

1. 第一层

直接可视化

因为第一层的卷积核通道是3,可以和RGB对应,所以可以直接可视化

发现学到的是一些纹理表示,而我们知道复杂的物体都是可以由简单的纹理组成

在这里插入图片描述

2. 最后一层

降维法

倒数第二层全连接层会输出4096维度的特征

我们通过降维法把他缩小到2维度(x,y)

可以把库中的所有图片进行降维操作,这样一张图片会得到一个x,y的坐标

然后把这张图片放到坐标系里

会发现相近的会在一起

3 中间层

可视化卷积层就很难看到了

3.2 内部响应分析法

输入一张图片,对于某一层的某一个卷积核,看卷积核的输出大小,越大越亮(响应值较大)

3.3 原图外部分析方法

输入一张图片,对于某一层的某一个卷积核,看卷积核对哪些区域的响应值比较大,然后再把对应区域在原图抠出来

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到每一行是一个感兴趣区域

比如第二行这个卷积只对人脸感兴趣,

到后面我们会发现神经网络学习到的是更高层的更有语义信息的内容

3.4 遮挡分析法

输入一张图片,对于分类关键的内容进行遮挡,看看卷积网络的分类置信度有没有下降,下降说明网络学到了关键内容

遮住一些区域,看最后的概率输出

记录一些规则的

在这里插入图片描述

3.5 梯度传递

反向梯度传递

以往都是利用输出对参数求导然后更新

但现在我们利用输出y对输入图片x的每一个像素进行求导

比如有300×400分辨率图片,通道数是3

在这里插入图片描述

我们对输入的每一个像素求导,每一个像素R,G,B各得到1个,总共3个,取3个里面的最大值,然后可视化导数

可以看到

在这里插入图片描述

从这里可以看出网络对哪些像素信息感兴趣,如果是对小狗周围感兴趣,说明网络学习是OK的,如果可视化后是其他区域,则不OK

3.6 梯度上升

之前方法都得需要输入一张图片

直接对神经元反向传递,感觉输出

通常用于生成神经网络中某一层的激活或过滤器的可视化。这种技术的主要思想是通过最大化神经网络某一层的激活或过滤器的响应,来生成图像,从而可以观察该层在输入图像上响应最强的特征。以下是可视化的梯度上升算法的一般步骤:

(1)选择层和目标: 首先,选择要可视化的神经网络的层某一个神经元。比如最后一层1000维的第3维

原始图像为输入全零的图像

(2)计算梯度: 接下来,计算这一个神经元相对于输入图像的梯度。把其他神经元的梯度置零,回传到原始图像加到像素全为零的图像上去

(3)反复进行(1)(2)步

就可以看到下图的情况

在这里插入图片描述

4 其他应用

4.1 风格转移

风格转移网络很好玩

我们可以输入一张风格图

输入一张原图,内容图

输入一张噪声图

(1)初始化网络参数并且固定网络参数

(2)输入噪声图片和风格图片,在每一层计算两者提取特征的损失,计算损失对于输入噪声图片的梯度,然后更新原噪声图片

(3)输入噪声图片和原图,在某一层计算两者提取特征的损失,计算损失对于输入噪声图片的梯度,然后更新原噪声图片

(4)不断迭代(3)(4)
在这里插入图片描述

但是后来人们发现这个需要迭代很多次,耗时较长

就把这个噪声图直接取消了,直接传入原图到一个网络中,使得这个网络的输出尽量的既符合风格图特征,又符合内容图特征

下次给一张图只需要过一个网络就可以了

在这里插入图片描述

5 可视化工具

keras-vis

Keras-vis 是一个基于 Keras 深度学习库的可视化工具,里面实现了上面我们讲到的一些可视化方法原理的工具

5.1 sailency

显著性图salinecy: 原理就是上面讲到的3.5

利用 visualize_saliency函数实现

以下是使用 Keras-vis 中的 saliency 技术的一般步骤:

  1. 选择模型和目标类别: 首先,选择要解释的深度学习模型以及要研究的目标类别(或目标神经元)。
  2. 计算梯度: 使用反向传播(backpropagation)算法计算输入图像相对于目标类别的梯度。这些梯度告诉了你哪些像素对于使模型对目标类别产生更高的概率或激活更重要。
  3. 生成显著性图: 使用计算得到的梯度,可以生成显著性图。通常,你可以使用梯度的绝对值或其他变换来得到显著性图像。显著性图中的像素值表示了相对于目标类别的重要性,较高的值通常对应于模型所关注的区域。
  4. 可视化显著性图: 最后,你可以将生成的显著性图可视化,以理解模型对输入图像的哪些部分关注较多。这通常涉及到将显著性图与原始输入图像叠加,以突出显示关键区域。

以下是一个简单的示例

import numpy as np
import matplotlib.pyplot as plt
from keras.applications import VGG16
from vis.visualization import visualize_saliency
from vis.utils import utils
from keras import activations

# 加载预训练的VGG16模型
model = VGG16(weights='imagenet', include_top=True)

# 选择一个输入图像
input_image_path = 'path_to_your_input_image.jpg'

# 加载输入图像并进行预处理
img = utils.load_img(input_image_path, target_size=(224, 224))
img = utils.preprocess_input(img)

# 获取模型的预测类别
pred_class = np.argmax(model.predict(img))

# 使用Saliency技术生成显著性图
saliency_map = visualize_saliency(model, layer_idx=-1, filter_indices=pred_class, seed_input=img, backprop_modifier='guided')

# 可视化显著性图
plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.imshow(utils.load_img(input_image_path, target_size=(224, 224)))
plt.title('Input Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(saliency_map, cmap='jet')
plt.title('Saliency Map')
plt.axis('off')

plt.tight_layout()
plt.show()

5.2 最大化激活

最大化激活activation: 原理就是上面讲到的3.6

利用 visualize_activation函数实现

方法

  1. 加载模型: 首先,你需要加载一个已经训练好的深度学习模型,可以是图像分类、目标检测或其他类型的模型。
  2. 选择层: 通过 layer_name 参数选择你想要可视化的神经网络层。通常,这是卷积神经网络(CNN)中的某一卷积层或其他感兴趣的层。
  3. 生成激活图像: 使用 visualize_activation 函数生成激活图像。你可以通过 filter_indices 参数来选择特定过滤器(卷积核)的激活,也可以通过 input_range 参数来指定输入图像的像素范围。
  4. 显示结果: 最后,你可以使用 utils.draw_text 函数将生成的激活图像可视化,通常是与输入图像一起显示,以更好地理解模型在输入数据上的激活模式。
from vis.visualization import visualize_activation
from vis.utils import utils
from keras.models import load_model

# 加载已经训练好的模型
model = load_model('your_model.h5')

# 选择一个层进行可视化
layer_name = 'conv2d_1'  # 选择你想可视化的层

# 使用可视化函数生成激活图像
activations = visualize_activation(model, layer_name, filter_indices=0, input_range=(0., 1.))

# 显示可视化结果
utils.draw_text(activations, 'Filter 0')

我们常常说神经网络是黑盒

为什么说黑盒?不是说不知道神经网络学习到了什么,而是不知道他为什么会学到这些信息

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring整合第三方框架-MyBatis整合Spring实现

Spring整合MyBatis的步骤 导入MyBatis整合Spring相关坐标。 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency><dependency><groupId>…

Docker下如何构建包含延迟插件的RabbitMQ镜像

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

低温结霜可视化实验装置的真空压力精密控制技改方案

摘要&#xff1a;低温结霜可视化实验装置主要用于模拟空间环境并研究深冷表面结霜现象&#xff0c;客户希望对现有实验装置的真空系统进行技术升级&#xff0c;以实现0.001Pa~1000Pa范围内真空度的准确控制。为此本文提出了分段控制解决方案&#xff0c;即采用电容真空计、电动…

04. 人工智能核心基础 - 导论(3)

文章目录 人工智能和其他学科的关系为什么学习人工智能怎么学好人工智能&#xff1f;一些问题 Hi&#xff0c;你好。我是茶桁。 基于上一节课咱们的整体强度有点大&#xff0c;而且咱们马上也要进入高强度内容了&#xff0c;那么这一篇咱们就稍微水一篇吧。来聊聊天&#xff0…

publicPath:打包时的配置

vue项目&#xff0c;执行打包命令后&#xff0c;会在项目的根目录中自动创建一个文件夹dist,dist中的文件就是打包后的文件&#xff0c;只需要放到服务器中即可。 【默认情况下&#xff0c;用的绝对路径&#xff0c;需要放到服务器的根目录打开。】 如果希望放到子目录也能运行…

Stm32_标准库_4_TIM中断_PWM波形_呼吸灯

基本原理 PWM相关物理量的求法 呼吸灯代码 #include "stm32f10x.h" // Device header #include "Delay.h"TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructuer;//结构体 GPIO_InitTypeDef GPIO_InitStructur…

Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)

我们知道dnsmap是一个工具&#xff0c;主要用于收集指定域名的子域名信息。它对于渗透测试人员在基础结构安全评估的信息收集和枚举阶段非常有用&#xff0c;可以帮助他们发现目标公司的IP网络地址段、域名等信息。 dnsmap的操作原理 dnsmap&#xff08;DNS Mapping&#xff…

nodejs基于Vue.js健身体育器材用品商城购物网97794

管理员端的功能主要是开放给系统的管理人员使用&#xff0c;能够对用户的信息进行管理&#xff0c;包括对用户、健身器材、器材类型、系统和订单进行查看&#xff0c;修改和删除、新增等&#xff0c;对系统整体运行情况进行了解。用户的功能主要是对个人账号和密码进行更新信息…

26659-2011 铸造用再生硅砂 课堂随笔

声明 本文是学习GB-T 26659-2011 铸造用再生硅砂. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铸造用再生硅砂的术语和定义、分级及牌号、技术要求、试验方法、检验规则以及包 装、标志、运输和储存等要求。 本标准适用于铸…

递归专题训练详解(回溯,剪枝,深度优先)

1.汉诺塔问题 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动…

【二本同学的秋招那些事儿】——中秋国庆双节快乐

&#x1f4a7; 二本同学的秋招那些事儿 \color{#FF1493}{二本同学的秋招那些事儿} 二本同学的秋招那些事儿&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算…

求求,别在sql里格式化数据了

在shigen之前的文章《为什么我们总是被追赶着走》这篇文章中提到了很多的设计乱象&#xff0c;设计的恶心之处至今让我呕吐。其中的sql我说了动辄上百行&#xff0c;而一些略长的部分竟然就是为了一件事——格式化。我直接一个ca&#xff0c;格式化不能用一个VO去处理吗&#x…

【C++进阶(六)】STL大法--栈和队列深度剖析优先级队列适配器原理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 栈和队列 1. 前言2. 栈和队列的接口函数熟悉3. …

django 实现:闭包表—树状结构

闭包表—树状结构数据的数据库表设计 闭包表模型 闭包表&#xff08;Closure Table&#xff09;是一种通过空间换时间的模型&#xff0c;它是用一个专门的关系表&#xff08;其实这也是我们推荐的归一化方式&#xff09;来记录树上节点之间的层级关系以及距离。 场景 我们 …

百度交易中台之内容分润结算系统架构浅析

作者 | 交易中台团队 导读 随着公司内容生态的蓬勃发展&#xff0c;内容产出方和流量提供方最关注的“收益结算”的工作&#xff0c;也就成为重中之重。本文基于内容分润结算业务为入口&#xff0c;介绍了实现过程中的重难点&#xff0c;比如千万级和百万级数据量下的技术选型和…

使用 AI 编程助手 CodeWhisperer,开发如有神助

前段时间体验了chatGPT&#xff0c;听说它可以写代码&#xff0c;结果发现更多的只是一个对答写小作文的百度助手&#xff0c;虽然也能写代码&#xff0c;但不是我想要的&#xff0c;可以在 idea 中可以快速生成代码块的。一个偶然的机会&#xff0c;从微信群里了解到&#xff…

科技云报道:大模型的阴面:无法忽视的安全隐忧

科技云报道原创。 在AI大模型的身上&#xff0c;竟也出现了“to be or not to be”问题。 争议是伴随着大模型的能力惊艳四座而来的&#xff0c;争议的核心问题在于安全。安全有两个方面&#xff0c;一个是大模型带来的对人类伦理的思考&#xff0c;一个是大模型本身带来的隐…

Unity实现设计模式——解释器模式

Unity实现设计模式——解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种按照规定语法进行解析的模式&#xff0c;现实项目中用得较少。 给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来…

在windows的ubuntu LTS中安装及使用EZ-InSAR进行InSAR数据处理

EZ-InSAR&#xff08;曾被称为MIESAR&#xff0c;即Matlab界面用于易于使用的合成孔径雷达干涉测量&#xff09;是一个用MATLAB编写的工具箱&#xff0c;用于通过易于使用的图形用户界面&#xff08;GUI&#xff09;进行干涉合成孔径雷达&#xff08;InSAR&#xff09;数据处理…

网络基础(了解网络知识的前提)

前言 在正式学习网络之前&#xff0c;我们需要了解的一些关于计算机网络的基本知识&#xff0c;本文主要阐述这些基本知识&#xff0c;带着大家一步一步迈进互联网网络的世界&#xff1b; 一、局域网与广域网的概念 在正式了解这些概念的前提是我们要搞懂网络出现的意义&#x…