首页 > 其他分享 >小白学视觉 | CNN的一些可视化方法

小白学视觉 | CNN的一些可视化方法

时间:2024-03-27 17:29:57浏览次数:38  
标签:layer img heatmap 可视化 小白学 CNN output grads

本文来源公众号“小白学视觉,仅用于学术分享,侵权删,干货满满。

原文链接:一个算法工程师复现算法的踩坑总结

作者 | yishun@知乎

来源丨https://zhuanlan.zhihu.com/p/53683453

编辑 | 极市平台

0 导读

对神经网络进行可视化分析不管是在学习上还是实际应用上都有很重要的意义,基于此,本文介绍了3种CNN的可视化方法:可视化中间特征图,可视化卷积核,可视化图像中类激活的热力图。每种方法均附有相关代码详解。

注:本文所有资料均来自Keras之父、Google人工智能研究员Francois Chollet的大作:《Python深度学习》,建议大家直接去看原文,这里只是结合楼主的理解做点笔记。

1 引言

有一些同学认为深度学习、神经网络什么的就是一个黑盒子,没办法、也不需要分析其内部的工作方式。个人认为这种说法“谬之千里”。

首先,站在自动特征提取或表示学习的角度来看,深度学习还是很好理解,即通过一个层级结构,由简单到复杂逐步提取特征,获得易于处理的高层次抽象表示。其次,现在也已经有很多方法对神经网络进行分析了,特别是一些可视化方法,可以很直观的展示深度模型的特征提取过程。

对神经网络进行可视化分析不管是在学习上还是实际应用上都有很重要的意义,基于此,本文将介绍以下3种CNN的可视化方法:

  1. 可视化中间特征图。

  2. 可视化卷积核。

  3. 可视化图像中类激活的热力图。

2 可视化中间特征图

这种方法很简单,把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可,如下述代码所示:

import matplotlib.pyplot as plt
#get feature map of layer_activation
plt.matshow(layer_activation[0, :, :, 4], cmap='viridis')

把多个特征图可视化后堆叠在一起可以得到与下述类似的图片。

上图为某CNN 5-8 层输出的某喵星人的特征图的可视化结果(一个卷积核对应一个小图片)。可以发现越是低的层,捕捉的底层次像素信息越多,特征图中猫的轮廓也越清晰。越到高层,图像越抽象,稀疏程度也越高。这符合我们一直强调的特征提取概念。

3 可视化卷积核

想要观察卷积神经网络学到的过滤器,一种简单的方法是获取每个过滤器所响应的视觉模式。我们可以将其视为一个优化问题,即从空白输入图像开始,将梯度上升应用于卷积神经网络的输入图像,让某个过滤器的响应最大化,最后得到的图像是选定过滤器具有较大响应的图像。

核心代码如下所示(利用Keras框架):

def generate_pattern(layer_name, filter_index, size=150):
    layer_output = model.get_layer(layer_name).output
    loss = K.mean(layer_output[:, :, :, filter_index])
    grads = K.gradients(loss, model.input)[0]
    grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5)
    iterate = K.function([model.input], [loss, grads])

    input_img_data = np.random.random((1, size, size, 3)) * 20 + 128.
    step = 1.
    for i in range(40):
        loss_value, grads_value = iterate([input_img_data])
        input_img_data += grads_value * step

    img = input_img_data[0]
    return deprocess_image(img)

将输入图片张量转换回图片后进行可视化,可以得到与下述类似的图片:

block1_conv1 层的过滤器模式

block2_conv1 层的过滤器模式

block3_conv1 层的过滤器模式

block4_conv1 层的过滤器模式

随着层数的加深,卷积神经网络中的过滤器变得越来越复杂,越来越精细。模型第一层( block1_conv1 )的过滤器对应简单的方向边缘和颜色,高层的过滤器类似于自然图像中的纹理:羽毛、眼睛、树叶等。

4 可视化图像中类激活的热力图

即显示原始图片的不同区域对某个CNN输出类别的“贡献”程度,如下面图片所示:

可以看到,大象头部对“大象”这个类别的“贡献”程度较高,而且这种方法似乎可以在一定程度上进行无监督的目标检测。

下面是书中原文,可能有点绕口。

我们将使用的具体实现方式是“Grad-CAM: visual explanations from deep networks via gradient-based localization”这篇论文中描述的方法。这种方法非常简单:给定一张输入图像,对于一个卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。直观上来看,理解这个技巧的一种方法是,你是用“每个通道对类别的重要程度”对“输入图像对不同通道的激活强度”的空间图进行加权,从而得到了“输入图像对类别的激活强度”的空间图。

代码如下所示:

african_elephant_output = model.output[:, 386]
last_conv_layer = model.get_layer('block5_conv3')
grads = K.gradients(african_elephant_output, last_conv_layer.output)[0]
pooled_grads = K.mean(grads, axis=(0, 1, 2))
iterate = K.function([model.input],
                     [pooled_grads, last_conv_layer.output[0]])
pooled_grads_value, conv_layer_output_value = iterate([x])
for i in range(512):
    conv_layer_output_value[:, :, i] *= pooled_grads_value[i]
heatmap = np.mean(conv_layer_output_value, axis=-1)
heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)
plt.matshow(heatmap)

得到的热力图如下所示:

经下述代码处理后,可以得到本节开始时的图片。

import cv2
img = cv2.imread(img_path)
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
superimposed_img = heatmap * 0.4 + img
cv2.imwrite('/Users/fchollet/Downloads/elephant_cam.jpg', superimposed_img)

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

标签:layer,img,heatmap,可视化,小白学,CNN,output,grads
From: https://blog.csdn.net/csdn_xmj/article/details/136986803

相关文章

  • 如何在电脑桌面上创建可视化工作计划日程表?
    对于职场人士来说,高效的时间管理和工作计划是提升工作效率、确保任务按时完成的关键。一款优秀的电脑工作计划软件,不仅能够帮助我们清晰地规划每一项任务,还能提醒我们按时完成,从而避免遗漏或延误。那么,电脑工作计划软件哪个好用呢?好用的电脑桌面日程软件选择哪款?这里我为大家推荐......
  • Verilog 仿真可视化
            DigitalJS是一个基于JavaScript实现的开源数字电路模拟器,旨在模拟由硬件设计工具(如Yosys)合成的电路。由弗罗茨瓦夫大学的MarekMaterzok开发,源文件托管于Github上。DigitalJS的开源网址如下:https://github.com/tilk/digitaljs        下面这......
  • 水闸之夜:3D可视化技术下的水利新篇章
    在宁静的夜晚,当城市的霓虹灯逐渐暗淡,你是否曾想过,那些默默守护着城市安全的水闸,在科技的魔力下,正焕发出别样的光彩?今天,就让我们一起走进夜晚水闸3D模型,感受科技为水利带来的无限魅力。 夜晚,月光如水,洒在静静流淌的河面上。而此刻,通过3D可视化技术,那些平日里看似平凡的水闸,仿佛......
  • 极高创新性!基于斑马算法优化并行卷积神经网络注意力机制结合支持向量机ZOA-PCNN-AT-SV
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 可视化文件目录树
    Hello!我是”小恒不会java“思考今天突然看到某文里面:检查目录文件。引发了我的思考:首先应该看看目录树,检查一下命令行如何检查?我的电脑系统是win11,最简单的就是自带的文件系统功能还有就是命令行工具:tree命令(Windows和部分Linux发行版中自带)可以在终端中直接输出当前目......
  • 小白学视觉 | 图像上的 OpenCV 算术运算
    本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。原文链接:图像上的OpenCV算术运算1OpenCV简介图像可以进行算术运算,例如加法、减法和按位运算(AND、OR、NOT、XOR)。这些操作可以帮助改善输入图像的属性。图像算法对于分析输入图像的属性是必要的,可以将操作后......
  • VoxelRCNN
    PDF:VoxelR-CNN:TowardsHighPerformanceVoxel-based3DObjectDetectionCODE:https://github.com/djiajunustc/Voxel-R-CNN一、大体内容现有基于Point-based的目标检测方法可以保留精确点的位置,具有更好的性能,但是由于无序的存储方式,计算量很大。而Voxel-based方法更容......
  • 10. 一起学习机器学习 -- Convolutional Neural Networks (CNNs)
    ConvolutionalNeuralNetworks(CNNs)ThepurposeofthisnotebookistopracticeimplementingandtrainingCNNs.Westartwitha1-dimensionalconvolutionallayerinNumPy.WewillthenusePyTorch,anoptimisedmachinelearningframeworkforPythonbas......
  • 触手可及的绿意:体验园艺展示3D可视化的魅力
    在繁忙的都市生活中,我们渴望拥有一片属于自己的绿色天地,但受限于空间、时间等因素,许多人只能将这个梦想埋藏在心底。随着科技的不断发展,3D可视化技术应运而生,让绿色梦想变得触手可及。 园艺展示三维模型通过先进的三维建模和渲染技术,将园艺设计以立体、逼真的形式呈现在我们眼......
  • 基于GA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览优化前:   优化后:   2.算法运行软件版本matlab2022a 3.算法理论概述      时间序列预测是许多领域中的核心问题,如金融市场分析、气候预测、交通流量预测等。近年来,深度学习在时间序列分析上取得了显著的成果,尤其是卷积神经网络......