政安晨:【Keras机器学习示例演绎】(十九)—— 可视化网络学习内容

目录

简介

设置

建立特征提取模型

设置梯度上升过程

设置端到端滤波器可视化回路

可视化目标层中的前 64 个滤波器


政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: TensorFlow与Keras机器学习实战

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

本文目标:显示 convnet 过滤器响应的视觉模式。

简介


在本示例中,我们将研究图像分类模型能学习到哪些视觉模式。我们将使用在 ImageNet 数据集上训练的 ResNet50V2 模型。

我们的过程很简单:我们将创建输入图像,最大限度地激活目标层

选在模型中间的某个位置:层 conv3_block4_out)中的特定滤波器。这些图像代表了过滤器响应模式的可视化。

设置

import osos.environ["KERAS_BACKEND"] = "tensorflow"import keras
import numpy as np
import tensorflow as tf# The dimensions of our input image
img_width = 180
img_height = 180
# Our target layer: we will visualize the filters from this layer.
# See `model.summary()` for list of layer names, if you want to change this.
layer_name = "conv3_block4_out"

建立特征提取模型

# Build a ResNet50V2 model loaded with pre-trained ImageNet weights
model = keras.applications.ResNet50V2(weights="imagenet", include_top=False)# Set up a model that returns the activation values for our target layer
layer = model.get_layer(name=layer_name)
feature_extractor = keras.Model(inputs=model.inputs, outputs=layer.output)

设置梯度上升过程


我们要最大化的 "损失 "只是目标层中特定滤波器激活的平均值。为避免边界效应,我们将边界像素排除在外。

def compute_loss(input_image, filter_index):activation = feature_extractor(input_image)# We avoid border artifacts by only involving non-border pixels in the loss.filter_activation = activation[:, 2:-2, 2:-2, filter_index]return tf.reduce_mean(filter_activation)

我们的梯度上升函数只需计算上述损失相对于输入图像的梯度,并更新更新图像,使其趋向于更强地激活目标滤波器的状态。

@tf.function
def gradient_ascent_step(img, filter_index, learning_rate):with tf.GradientTape() as tape:tape.watch(img)loss = compute_loss(img, filter_index)# Compute gradients.grads = tape.gradient(loss, img)# Normalize gradients.grads = tf.math.l2_normalize(grads)img += learning_rate * gradsreturn loss, img

设置端到端滤波器可视化回路

我们的流程如下

* 从接近 "全灰 "的随机图像(即视觉上的净图像)开始
* 重复应用上文定义的梯度上升阶跃函数
* 通过对输入图像进行归一化处理、居中裁剪并将其限制在 [0, 255] 范围内,将生成的输入图像转换为可显示的形式。

def initialize_image():# We start from a gray image with some random noiseimg = tf.random.uniform((1, img_width, img_height, 3))# ResNet50V2 expects inputs in the range [-1, +1].# Here we scale our random inputs to [-0.125, +0.125]return (img - 0.5) * 0.25def visualize_filter(filter_index):# We run gradient ascent for 20 stepsiterations = 30learning_rate = 10.0img = initialize_image()for iteration in range(iterations):loss, img = gradient_ascent_step(img, filter_index, learning_rate)# Decode the resulting input imageimg = deprocess_image(img[0].numpy())return loss, imgdef deprocess_image(img):# Normalize array: center on 0., ensure variance is 0.15img -= img.mean()img /= img.std() + 1e-5img *= 0.15# Center cropimg = img[25:-25, 25:-25, :]# Clip to [0, 1]img += 0.5img = np.clip(img, 0, 1)# Convert to RGB arrayimg *= 255img = np.clip(img, 0, 255).astype("uint8")return img

让我们在目标图层中使用滤镜 0 试试看:

from IPython.display import Image, displayloss, img = visualize_filter(0)
keras.utils.save_img("0.png", img)

这就是目标层 0 号滤波器响应最大化的输入结果:

display(Image("0.png"))

可视化目标层中的前 64 个滤波器

现在,让我们将目标层中的前 64 个滤波器做成一个 8x8 的网格,以了解模型学习到的不同视觉模式的范围。

# Compute image inputs that maximize per-filter activations
# for the first 64 filters of our target layer
all_imgs = []
for filter_index in range(64):print("Processing filter %d" % (filter_index,))loss, img = visualize_filter(filter_index)all_imgs.append(img)# Build a black picture with enough space for
# our 8 x 8 filters of size 128 x 128, with a 5px margin in between
margin = 5
n = 8
cropped_width = img_width - 25 * 2
cropped_height = img_height - 25 * 2
width = n * cropped_width + (n - 1) * margin
height = n * cropped_height + (n - 1) * margin
stitched_filters = np.zeros((width, height, 3))# Fill the picture with our saved filters
for i in range(n):for j in range(n):img = all_imgs[i * n + j]stitched_filters[(cropped_width + margin) * i : (cropped_width + margin) * i + cropped_width,(cropped_height + margin) * j : (cropped_height + margin) * j+ cropped_height,:,] = img
keras.utils.save_img("stiched_filters.png", stitched_filters)from IPython.display import Image, displaydisplay(Image("stiched_filters.png"))

演绎展示:

Processing filter 0
Processing filter 1
Processing filter 2
Processing filter 3
Processing filter 4
Processing filter 5
Processing filter 6
Processing filter 7
Processing filter 8
Processing filter 9
Processing filter 10
Processing filter 11
Processing filter 12
Processing filter 13
Processing filter 14
Processing filter 15
Processing filter 16
Processing filter 17
Processing filter 18
Processing filter 19
Processing filter 20
Processing filter 21
Processing filter 22
Processing filter 23
Processing filter 24
Processing filter 25
Processing filter 26
Processing filter 27
Processing filter 28
Processing filter 29
Processing filter 30
Processing filter 31
Processing filter 32
Processing filter 33
Processing filter 34
Processing filter 35
Processing filter 36
Processing filter 37
Processing filter 38
Processing filter 39
Processing filter 40
Processing filter 41
Processing filter 42
Processing filter 43
Processing filter 44
Processing filter 45
Processing filter 46
Processing filter 47
Processing filter 48
Processing filter 49
Processing filter 50
Processing filter 51
Processing filter 52
Processing filter 53
Processing filter 54
Processing filter 55
Processing filter 56
Processing filter 57
Processing filter 58
Processing filter 59
Processing filter 60
Processing filter 61
Processing filter 62
Processing filter 63

图像分类模型通过将其输入分解为 "向量基 "纹理过滤器来观察世界。


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

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

相关文章

基于Rust的多线程 Web 服务器

构建多线程 Web 服务器 在 socket 上监听 TCP 连接解析少量的 HTTP 请求创建一个合适的 HTTP 响应使用线程池改进服务器的吞吐量优雅的停机和清理注意:并不是最佳实践 创建项目 ~/rust ➜ cargo new helloCreated binary (application) hello package~/rust ➜ma…

kaggle之皮肤癌数据的深度学习测试

kaggle之皮肤癌数据的深度学习测试 近期一直在肝深度学习 很久之前,曾经上手搞过一段时间的深度学习,似乎是做轮胎花纹的识别,当初用的是TensorFlow,CPU版本的,但已经很长时间都没弄过了 现在因为各种原因&#xff…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行,但很多开发人员仍然不清楚它是如何实际运作的,这是非常正常的。 平台工程是与 DevOps 并行吗?还是可以相互替代?或者 DevOps 和平台工程是两个完全不同的概念? 一种比较容易将两者区分开来的方…

Nginx(三): 项目实战之conf

conf文件详解 #user nobody; # 设置了Nginx的工作进程数。这里设置为1,表示只有一个工作进程。通常在多核CPU的服务器上,可以设置为与CPU核心数相等的值以提高性能 worker_processes 1;# 设置了Nginx工作进程的最大文件打开数量限制。这里设置为65535…

打包的意义 作用等前端概念集合 webpack基础配置等

基础网页是什么? 在学校最基础的三剑客 原生JS CSS H5就可以开发静态网页了 对于浏览器而言也能识别这些基础的文件和语法,真正的所见即所得,非常直接。 为什么要使用框架库? 对于常用的前端框架而言,无论是Vue Rea…

Unity和iOS 原生专题一 unity打包设置C#设置 Xcode添加OTHER_LDFLAGS和Info.plist设置

一、 获取 PBXProject PBXProject的很多操作都是通过guid的 var pbxProject new PBXProject(); 二 、获取projectPath var projectPath PBXProject.GetPBXProjectPath(iosProjectPath); 三 、读取pbxProject 文件 pbxProject.ReadFromFile(projectPath); 四 、 读取Uni…

普通屏幕已过时?裸眼3D屏幕显示效果更胜一筹!

随着多媒体技术的迅猛进步,我们日常生活中的内容展现方式,已经经历了前所未有的变革。在这其中,裸眼3D屏幕的应用,无疑是最为引人注目的亮点,它相较于传统屏幕,在显示效果上展现出了鲜明的优势,…

RGB灯珠的控制-单片机通用模板

RGB灯珠的控制-单片机通用模板 一、RGB控制的原理二、RGB.c的实现三、RGB.h的实现四、color色彩空间变换以及控制渐变一、RGB控制的原理 ①通过IO发送脉冲识别0/1编码,组合24Bit的RGB数据,从而控制RGB;②每个RGB灯珠通过DIN、DOU进行级联起来;③通过HSV色彩转换成RGB从而控…

ArcGIS批量寻找图层要素中的空洞

空洞指的是图层中被要素包围所形成的没有被要素覆盖的地方,当图层要素数量非常庞大时,寻找这些空洞就不能一个一个的通过目测去寻找了,需要通过使用工具来实现这一目标。 一、【要素转线】工具 利用【要素转线】工具可以将空洞同图层要素处于…

【触摸案例-多点触摸的案例 Objective-C语言】

一、我们来做这个多点触摸的案例 1.首先呢,按着这个option键啊,可以模拟多点触摸, 然后呢,再去怎么着去画圈儿, 它这个里边就会产生一个imageView,跟着你去变,会有这么一个效果, 那么,首先啊,我们新建一个项目, Name:03-多点触摸的案例 1)首先,我们把控制器的v…

Xcode for Mac:强大易用的集成开发环境

Xcode for Mac是一款专为苹果开发者打造的集成开发环境(IDE),它集成了代码编辑器、编译器、调试器等一系列开发工具,让开发者能够在同一界面内完成应用的开发、测试和调试工作。 Xcode for Mac v15.2正式版下载 Xcode支持多种编程…

【OpenCV】(一)wechat_qrcode检测二维码

一、注意: opencv-4.8.0之前的版本wechat_qrcode检测二维码是矩形检测; opencv-4.8.0的版本wechat_qrcode检测二维码是关键点检测; 二、C代码 代码目前是通用的(仅在opencv-4.5.5、opencv-4.8.1上测试过)&#xff1…

ShardingSphere 5.x 系列【25】 数据分片原理之 SQL 解析

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 分片执行流程1.1 Simple Push Down1.2 SQL Federation2. SQL 解析2.1 解析…

力扣700,二叉搜索树中的搜索

700. 二叉搜索树中的搜索 - 力扣(LeetCode) 法1,递归 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返…

道可云元宇宙每日资讯|苹果推出开放语言模型OpenELM

道可云元宇宙每日简报(2024年4月26日)讯,今日元宇宙新鲜事有: 工信部发布中关村园区建设方案:加快突破元宇宙核心技术 4 月 25 日,工业和信息化部、科学技术部、北京市人民政府印发了《中关村世界领先科技…

分布式WEB应用中会话管理的变迁之路

Session一词直译为“会话”,意指有始有终的一系列动作/消息。Session是Web应用蓬勃发展的产物之一,在Web应用中隐含有“面向连接”和“状态保持”两个含义,同时也指代了Web服务器与客户端之间进行状态保持的解决方案。 在Web应用…

web server apache tomcat11-23-APR

前言 整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

基于JAVA实现的推箱子小游戏

Java推箱子小游戏实现: 推箱子小游戏曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了,甚至在新一代人的印象中都已毫无记忆了。。。但是,这款游戏可以在一定程度上锻炼自己的编程能力。 窗口画面设计:i…

8点法估计基础矩阵

估计基础矩阵 文章目录 估计基础矩阵8点法归一化 8点法 8点法 根据两幅图像中8个对应点对之间的关系,采用SVD求 解最小二乘方 约束:det(F) 0 假设已知N对点的对应关系: { x i , x i ′ } i 1 N \{x_i,x^{\prime}_i\}_{i1}^N {xi​,xi′​…

Mysql索引规范及原理分析

1 Mysql存储引擎 MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。 存储引擎是MySQL将数据存储在文件系统中的存储方…