keras_猫狗分类案例(三)_卷机神经网络的可视化(可视化类激活的热力图)_神经网络分类模型热力图cam可视化-程序员宅基地

技术标签: 机器学习案例  神经网络  

卷机神经网络的可视化(可视化类激活的热力图)
参考:https://www.cnblogs.com/zhhfan/p/9978099.html
python深度学习

可视化类激活的热力图
我还要介绍另一种可视化方法,它有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策。这有助于对卷积神经网络的决策过程进行调试,特别是出现分类错误的情况下。
这种方法还可以定位图像中的特定目标。
这种通用的技术叫作类激活图(CAM, class activation map)可视化,它是指对输入图像生成类激活的热力图。类激活热力图是与特定输出类别相关的二维分数网格,对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度。举例来说,对于输入到猫狗分
类卷积神经网络的一张图像, CAM 可视化可以生成类别“猫”的热力图,表示图像的各个部分与“猫”的相似程度, CAM 可视化也会生成类别“狗”的热力图,表示图像的各个部分与“狗”的相似程度。可视化类激活的热力图

代码清单 5-40 加载带有预训练权重的 VGG16 网络
代码清单 5-41 为 VGG16 模型预处理一张输入图像
代码清单 5-42 应用 Grad-CAM 算法
代码清单 5-43 热力图后处理
代码清单 5-44 将热力图与原始图像叠加


# 我们将使用的具体实现方式是“Grad-CAM: visual explanations from deep networks via gradientbased localization” a 这篇论文中描述的方法。这种方法非常简单:给定一张输入图像,对于一个
# 卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。直观上
# 来看,理解这个技巧的一种方法是,你是用“每个通道对类别的重要程度”对“输入图像对不
# 同通道的激活强度”的空间图进行加权,从而得到了“输入图像对类别的激活强度”的空间图。
# 我们再次使用预训练的 VGG16 网络来演示此方法。
# 代码清单 5-40 加载带有预训练权重的 VGG16 网络from keras.applications.vgg16 import VGG16
​
K.clear_session()# Note that we are including the densely-connected classifier on top;
# all previous times, we were discarding it.# 注意,网络中包括了密集连接分类器。在前面所有的例子中,我们都舍弃了这个分类器
model = VGG16(weights='imagenet')
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5
548380672/553467096 [============================>.] - ETA: 0s
Let's consider the following image of two African elephants, possible a mother and its cub, strolling in the savanna (under a Creative Commons license):

elephants

Let's convert this image into something the VGG16 model can read: the model was trained on images of size 224x244, preprocessed according to a few rules that are packaged in the utility function keras.applications.vgg16.preprocess_input. So we need to load the image, resize it to 224x224, convert it to a Numpy float32 tensor, and apply these pre-processing rules.

# 图 5-34 显示了两只非洲象的图像(遵守知识共享许可协议),可能是一只母象和它的小
# 象,它们在大草原上漫步。我们将这张图像转换为 VGG16 模型能够读取的格式:模型在大小为
# 224×224 的图像上进行训练,这些训练图像都根据 keras.applications.vgg16.preprocess_
# input 函数中内置的规则进行预处理。因此,我们需要加载图像,将其大小调整为 224×224,
# 然后将其转换为 float32 格式的 Numpy 张量,并应用这些预处理规则。# 代码清单 5-41 为 VGG16 模型预处理一张输入图像from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np
​
# 目标图像的本地路径
# The local path to our target image
img_path = '/Users/fchollet/Downloads/creative_commons_elephant.jpg'# `img` is a PIL image of size 224x224
img = image.load_img(img_path, target_size=(224, 224))# `x` is a float32 Numpy array of shape (224, 224, 3)
x = image.img_to_array(img)# We add a dimension to transform our array into a "batch"
# of size (1, 224, 224, 3)
# 添加一个维度,将数组转换为(1, 224, 224, 3) 形状的批量
x = np.expand_dims(x, axis=0)# Finally we preprocess the batch
# (this does channel-wise color normalization)
# 对批量进行预处理(按通道进行颜色标准化)
x = preprocess_input(x)
 现在你可以在图像上运行预训练的 VGG16 网络,并将其预测向量解码为人类可读的格式
# 现在你可以在图像上运行预训练的 VGG16 网络,并将其预测向量解码为人类可读的格式
preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])
Predicted: [('n02504458', 'African_elephant', 0.90942144), ('n01871265', 'tusker', 0.08618243), ('n02504013', 'Indian_elephant', 0.0043545929)]
The top-3 classes predicted for this image are:

African elephant (with 92.5% probability)
Tusker (with 7% probability)
Indian elephant (with 0.4% probability)
Thus our network has recognized our image as containing an undetermined quantity of African elephants. The entry in the prediction vector that was maximally activated is the one corresponding to the "African elephant" class, at index 386:

对这张图像预测的前三个类别分别为:
# ‰ 非洲象(African elephant, 92.5% 的概率)
# ‰ 长牙动物(tusker, 7% 的概率)
# ‰ 印度象(Indian elephant, 0.4% 的概率)
# 网络识别出图像中包含数量不确定的非洲象。预测向量中被最大激活的元素是对应“非洲象”
# 类别的元素,索引编号为 386。
# 对这张图像预测的前三个类别分别为:
# • 非洲象(African elephant, 92.5% 的概率)
# • 长牙动物(tusker, 7% 的概率)
# • 印度象(Indian elephant, 0.4% 的概率)
# 网络识别出图像中包含数量不确定的非洲象。预测向量中被最大激活的元素是对应“非洲象”
# 类别的元素,索引编号为 386。
​
np.argmax(preds[0])
386
To visualize which parts of our image were the most "African elephant"-like, let's set up the Grad-CAM process:

# This is the "african elephant" entry in the prediction vector# 为了展示图像中哪些部分最像非洲象,我们来使用 Grad-CAM 算法。
# 代码清单 5-42 应用 Grad-CAM 算法
​
african_elephant_output = model.output[:, 386]# The is the output feature map of the `block5_conv3` layer,
# the last convolutional layer in VGG16# block5_conv3 层的输出特征图,它是 VGG16 的最后一个卷积层
​
last_conv_layer = model.get_layer('block5_conv3')# This is the gradient of the "african elephant" class with regard to
# the output feature map of `block5_conv3`
grads = K.gradients(african_elephant_output, last_conv_layer.output)[0]# This is a vector of shape (512,), where each entry
# is the mean intensity of the gradient over a specific feature map channel
pooled_grads = K.mean(grads, axis=(0, 1, 2))# This function allows us to access the values of the quantities we just defined:
# `pooled_grads` and the output feature map of `block5_conv3`,
# given a sample image
​
iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])# 访问刚刚定义的量:对于给定的样本图像,pooled_grads 和 block5_conv3 层的输出特征图# These are the values of these two quantities, as Numpy arrays,
# given our sample image of two elephants
pooled_grads_value, conv_layer_output_value = iterate([x])# We multiply each channel in the feature map array
# by "how important this channel is" with regard to the elephant class
for i in range(512):
    conv_layer_output_value[:, :, i] *= pooled_grads_value[i]# The channel-wise mean of the resulting feature map
# is our heatmap of class activation
heatmap = np.mean(conv_layer_output_value, axis=-1)
For visualization purpose, we will also normalize the heatmap between 0 and 1:

# 为了便于可视化,我们还需要将热力图标准化到 0~1 范围内。得到的结果如图 5-35 所示。
# 代码清单 5-43 热力图后处理
​
heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)
plt.matshow(heatmap)
plt.show()


这种可视化方法回答了两个重要问题:
# ‰ 网络为什么会认为这张图像中包含一头非洲象?
# ‰ 非洲象在图像中的什么位置?
# 尤其值得注意的是,小象耳朵的激活强度很大,这可能是网络找到的非洲象和印度象的不
# 同之处。
# 最后,我们可以用 OpenCV 来生成一张图像,将原始图像叠加在刚刚得到的热力图上(见
# 图 5-36)。
# 代码清单 5-44 将热力图与原始图像叠加import cv2
​
# We use cv2 to load the original image
img = cv2.imread(img_path)# We resize the heatmap to have the same size as the original image
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))# We convert the heatmap to RGB
heatmap = np.uint8(255 * heatmap)# We apply the heatmap to the original image
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)# 0.4 here is a heatmap intensity factor
# 这里的 0.4 是热力图强度因子
superimposed_img = heatmap * 0.4 + img
​
# Save the image to disk
cv2.imwrite('/Users/fchollet/Downloads/elephant_cam.jpg', superimposed_img)# 这种可视化方法回答了两个重要问题:
# • 网络为什么会认为这张图像中包含一头非洲象?
# • 非洲象在图像中的什么位置?
# 尤其值得注意的是,小象耳朵的激活强度很大,这可能是网络找到的非洲象和印度象的不
# 同之处。

在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wj1298250240/article/details/104172085

智能推荐

精益DevOps:优化流程,提升效能【文末送书】_devops平台提升效率-程序员宅基地

文章浏览阅读4.2k次,点赞25次,收藏15次。本书为IT服务交付团队及其领导者撰写,从精益思想和精益管理的视角,深入探讨了DevOps方法的核心要素(如任务式指挥、摩擦、风险、态势感知等),并结合实际案例,阐述了如何通过DevOps方法解决IT服务交付中的各种问题,如何在整个组织内改善信息流,从而向客户的目标成果迈进。此外,本书还提供了许多实用的工具和技巧,包括OODA循环、Cynefin框架、服务交付的成熟度模型和服务工程负责人等,以帮助读者更好地应用DevOps方法。_devops平台提升效率

React中,使用codeMirror设置代码高度自适应_react codemirror 自适应高度-程序员宅基地

文章浏览阅读4.2k次。在对应的less文件下,设置样式:global .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: auto; color: black; direction: ltr;}..._react codemirror 自适应高度

百问网STM32157适配正点原子7寸电容屏(1024X600)_touchscreen-size-x-程序员宅基地

文章浏览阅读1.5k次。百问网STM32157适配正点原子7寸电容屏(1024X600)文章目录1.修改设备树文件2.修改edt-ft5x06.c(触摸驱动)3.修改QT环境变量(重要,踩坑)1.修改设备树文件由于百问网STM32MP157的触摸IC与HDMI驱动IC复用,因此需要完成以下几个步骤(1)在stm32mp157c-100ask-512d-lcd-v1.dts文件中对i2c4节点增加ft5x06触摸的描述信息,具体参考正点原子STM32MP157开发板的配套源码,如下在正点原子出厂linux源码中找到stm3_touchscreen-size-x

pso神经网络用python_基本pso优化神经网络程序-程序员宅基地

文章浏览阅读901次。clcclearall%一、初始化部分%1.1预处理样本数据%选取训练样本(x,y)fori=1:126x=0+0.0251*(i-1);y(i)=(sin(x)+(x.^2/9+x/3)*exp((-0.5)*(x.^2)))/2;%待逼近函数endAllSamIn=0:0.0251:pi;%训练样本输入AllSamOut=y;%训练样本输出%选取测试样本fori=1:125x=0.0125+..._pid神经网络优化 python

MFC slider滑动条OnNMCustomdrawSlider(NMHDR *pNMHDR, LRESULT *pResult)事件_onnmthemechangedtranslatexslider-程序员宅基地

文章浏览阅读6.8k次。鼠标拖动滑动条的时候,触发事件OnNMCustomdrawSlider(NMHDR *pNMHDR, LRESULT *pResult)但是在窗体被其他页面遮挡重新显示在屏幕最前面的时候也会触发这个事件,例如最小化重新最大化的时候。网友对三种消息类型的解释:NM_CUSTOMDRAW,是子控件通知其父控件它已经完成重画功能,对Slider来说也就是我们每次鼠标按住滑块移动一下就_onnmthemechangedtranslatexslider

jquery-ui日期时间控件实现_jquery ui picker-程序员宅基地

文章浏览阅读7.9k次。日期控件和时间控件为独立控件,日期时间控件要同时导入日期控件和时间控件的js,然后在日期控件添加时间控件显示参数,没有导入时间控件js,日期控件函数设置的时间控件参将包错日期官网网址:http://jqueryui.com/日期控件js:jquery-ui.js对应函数及默认属性设置:function Datepicker()时间官网网址:http://plugins._jquery ui picker

随便推点

经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)_alexnet论文-程序员宅基地

文章浏览阅读5.5k次,点赞41次,收藏106次。AlexNet(ImageNet Classification with Deep Convolutional Neural Networks)论文超详细解读。翻译+总结_alexnet论文

在Ubuntu上编译安装LLVM_ubuntu hexagon llvm 8.5.09-程序员宅基地

文章浏览阅读1.1w次,点赞12次,收藏36次。Motivation两周前实验室要求我配置一个叫Speedy.js的编译器,配置这个编译器需要先配置好LLVM。根据这个编译器作者的教程,乱七八糟配置了一通,踩过一些坑,碰过一些雷,浪费了很多时间。花了两周时间,终于全套配置完成,因此想写个教程,留点知识给以后的自己和需要的各位。Speedy.js不好说,但是LLVM这东西以后有大概率会用的上。环境这是我这次配置LLVM过程中最大的_ubuntu hexagon llvm 8.5.09

Anaconda+Tensorflow_Gpu+Spyder安装记录(2022年10月14日更新)_anaconda navigator安装spyderd慢-程序员宅基地

文章浏览阅读1.9k次,点赞7次,收藏15次。2022年6月13日-记录Anaconda+tensorflow_gpu-2.9.0+spyder5.3.1+py3.9安装过程,回忆一下踩过的坑_anaconda navigator安装spyderd慢

数据预处理流程图思维导图-程序员宅基地

文章浏览阅读2.6k次。_数据预处理流程图

Abnova LiquidCell-负富集细胞分离和回收系统-程序员宅基地

文章浏览阅读129次。艾美捷Abnova LiquidCell 是一种非侵入性负富集系统,用于消耗白细胞 (WBC) 以及计数和回收循环稀有细胞 (CRC)。_负富集

构建稳固的数据基础,GaussDB与产业紧密合作-程序员宅基地

文章浏览阅读17次。为了有效地管理和利用大规模数据,企业需要一个强大而可靠的数据底座。本文将介绍GaussDB的特点和优势,并提供相应的源代码示例,以展示其在数据管理方面的强大功能。总结而言,GaussDB作为一种高性能、可扩展和高可靠性的分布式数据库管理系统,与产业界紧密合作,为企业构建了稳固的数据基础。通过示例代码,我们展示了GaussDB的基本用法,希望能够帮助读者更好地了解和应用这一强大的数据管理工具。它支持数据备份和恢复,以及故障转移和自动故障转移,确保数据库在出现故障时能够自动切换到备用节点,保持业务的连续性。

推荐文章

热门文章

相关标签