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

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

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

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

梯度上升方法做可视化

文章目录

  • 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.rhkb.cn/news/144652.html

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

相关文章

BUUCTF reverse wp 21 - 30

[ACTF新生赛2020]rome 无壳, 直接拖进IDA32 y键把v2改成char[49], n键重命名为iuput int func() {int result; // eaxint v1[4]; // [esp14h] [ebp-44h]char input[49]; // [esp24h] [ebp-34h] BYREFstrcpy(&input[23], "Qsw3sj_lz4_Ujwl");printf("Please…

力扣 -- 44. 通配符匹配

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//为了调整映射关系s s;p p;//多开一行多开一列vector<vector<bool>> dp(m1,vector<bool>(n1,false));//初始化//dp[0]…

Mysql——三、SQL语句(上篇)

Mysql 一、SQL语句基础1、SQL简介2、SQL语句分类3、SQL语句的书写规范 二、数据库操作三、MySQL 字符集1、变量2、utf8和utf8mb4的区别 四、数据库对象五、SELECT语句1、简单的SELECT语句2、SQL函数2.1 聚合函数2.2 数值型函数2.3 字符串函数2.4 日期和时间函数2.5 流程控制函数…

JAVA:实现Excel和PDF上下标

1、简介 最近项目需要实现26个小写字母的上下标功能,自己去网上找了所有Unicode的上下标形式,缺少一些关键字母,顾后面考虑自己创建上下标字体样式,以此来记录。 2、Excel Excel本身是支持上下标,我们可以通过Excel单元格的样式来设置当前字体上下标,因使用的是POI的m…

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 Object.defineProperty(),对于这个方法&#xff0c;更多的还是停留在面试的时候&#xff0c;面试官问你vue2和vue3区别的时候&#xff0c;不免要提一提这个方法…

【知识点】JavaScript中require的一些理解

以下内容源自个人理解&#xff0c;若有错误欢迎指出。 猜想 多个文件中require同一个文件时&#xff0c;对于首次出现的require&#xff0c;会去读取文件并执行一遍&#xff0c;然后加入缓存&#xff1b;之后当再次require到这个文件时&#xff0c;只会指向这个缓存&#xff0c…

Django(21):使用Celery任务框架

目录 Celery介绍Celery安装Celery使用项目文件和配置启动Celery编写任务调用异步任务查看任务执行状态及结果 设置定时和周期性任务配置文件添加任务Django Admin添加周期性任务启动任务调度器beat Flower监控任务执行状态Celery高级用法与注意事项给任务设置最大重试次数不同任…

px4的gazebo仿真相机模型报错解决办法,返回值256

&#x1f449;事情起因&#xff1a;我想做关于PX4无人机的摄像头仿真&#xff0c;根据PX4的官网文件 Tools/sitl_gazebo文件夹里面有对应的模型可以使用&#xff0c;我就想在mavros_posix_sitl文件里面修改vehicle参数&#xff0c;比如直接将vehicle“iris_stereo_camera”。然…

PyTorch 模型性能分析和优化 — 第 1 部分

一、说明 这篇文章的重点将是GPU上的PyTorch培训。更具体地说&#xff0c;我们将专注于 PyTorch 的内置性能分析器 PyTorch Profiler&#xff0c;以及查看其结果的方法之一&#xff0c;即 PyTorch Profiler TensorBoard 插件。 二、深度框架 训练深度学习模型&#xff0c;尤其是…

Springboot中使用拦截器、过滤器、监听器

一、Servlet、Filter&#xff08;过滤器&#xff09;、 Listener&#xff08;监听器&#xff09;、Interceptor&#xff08;拦截器&#xff09; Javaweb三大组件&#xff1a;servlet、Filter&#xff08;过滤器&#xff09;、 Listener&#xff08;监听器&#xff09; Spring…

嵌入式Linux应用开发-面向对象-分层-分离及总线驱动模型

嵌入式Linux应用开发-面向对象-分层-分离及总线驱动模型 第八章 驱动设计的思想&#xff1a;面向对象/分层/分离8.1 面向对象8.2 分层8.3 分离8.4 写示例代码8.5 课后作业 第九章 驱动进化之路&#xff1a;总线设备驱动模型9.1 驱动编写的 3种方法9.1.1 传统写法9.1.2 总线设备…

QT信号槽

目录 信号槽的概念 按钮的常用信号 自定义槽函数 自定义信号函数 自定义槽和信号注意的事项 信号与槽的拓展 lambda表达式 信号槽的概念 信号槽是Qt框架引以为豪的机制之一。所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c…

布隆过滤器Bloom Filter

本章代码gitee仓库&#xff1a;布隆过滤器 文章目录 0. 前言1. 布隆过滤器的概念2. 布隆过滤器的实现2.1 哈希函数2.2 插入和判断 3. 布隆过滤器的删除4. 布隆过滤器的误判 0. 前言 我们在玩某款游戏的时候&#xff0c;刚注册的话&#xff0c;我们需要取一个昵称&#xff0c;这…

【Java】复制数组的四种方式

1. System.arraycopy() 用来将一个数组的&#xff08;一部分&#xff09;内容复制到另一个数组里面去。 定义&#xff1a; void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);例&#xff1a; int[] arr1 { 1, 2, 3, 4, 5 }; int[] arr2 new…

CSS详细基础(四)显示模式

本帖开始介绍CSS中更复杂的内容 目录 一.显示模式 1.行内元素 2.块级元素 3.行内块元素 二.背景样式 一.显示模式 顾名思义&#xff0c;在CSS中&#xff0c;元素主要有3种显示模式&#xff1a;行内元素、块级元素、行内块元素~ 所谓块级元素&#xff0c;指的是该元素在…

ROS2 从头开始​​:第6部分 - ROS2 中的 DDS,用于可靠的机器人通信

一、说明 在这篇文章中,我们将重点关注 ROS 2的通信栈DDS,其中这是介于管理节点通信与控制节点通信环节,是上位机决策体系与下位机的控制体系实现指令-执行-反馈的关键实现机制。 二、ROS工程的概念框架 现代机器人系统非常复杂,因为需要集成各种类型的传感器、执行器和其…

Vue封装全局SVG组件

1.SVG图标配置 1.安装插件 npm install vite-plugin-svg-icons -D 2.Vite.config.ts中配置 import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path export default () > {return {plugins: [createSvgIconsPlugin({// Specify the icon fo…

JavaScript高阶班之ES6 → ES11(八)

JavaScript高阶班之ES6 → ES11 1、ES6新特性1.1、let 关键字1.2、const关键字1.3、变量的解构赋值1.3.1、数组的解构赋值1.3.2、对象的解构赋值 1.4、模板字符串1.5、简化对象写法1.6、箭头函数1.7、函数参数默认值1.8、rest参数1.9、spread扩展运算符1.9.1、数组合并1.9.2、数…

PYQT制作动态时钟

所有代码&#xff1a; import sys from PyQt5.QtCore import Qt, QTimer, QRect from PyQt5.QtGui import QPixmap, QTransform, QPainter, QImage from PyQt5.QtWidgets import QApplication, QLabel from PyQt5 import uic import newdef adder():global iglobal angle_s, a…

大数据Flink(八十八):Interval Join(时间区间 Join)

文章目录 Interval Join&#xff08;时间区间 Join&#xff09; Interval Join&#xff08;时间区间 Join&#xff09; Interval Join 定义&#xff08;支持 Batch\Streaming&#xff09;&#xff1a;Interval Join 在离线的概念中是没有的。Interval Join 可以让一条流去 Jo…