| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 神经网络为什么觉得你的猫是猫:神奇的类激活图CAM技术(附Pytorch实现代码) -> 正文阅读 |
|
[人工智能]神经网络为什么觉得你的猫是猫:神奇的类激活图CAM技术(附Pytorch实现代码) |
1 引言对于一般的分类而言,我们将数据导入神经网络,神经网络告诉我们这是哪一类,而对于一些必要情况下,我们更需要知道神经网络如何做出判断,输入数据的哪些参数影响着神经网络的判断。于是,Bolei Zhou等人发表的论文Learning Deep Features for Discriminative Localization提出了类激活图技术,告诉我们为什么神经网络觉得你的猫是一只猫。 2 类激活图的原理原论文中的解释为:
2.1 公式计算现在有一张图片,我们使用 f k ( x , y ) f_k(x,y) fk?(x,y)表示在最后一个卷积层中,位置 ( x , y ) (x,y) (x,y)在第 k k k个激活图的特征,然后执行全局平均池化GAP我们知。道,对于 c ? n ? n c*n*n c?n?n的特征图(每张特征图 n ? n n*n n?n,共有 c c c张),执行平均池化后只剩下 c ? 1 ? 1 c*1*1 c?1?1,相当于把每张特征图中所有的点求和后取平均。因此,在GAP后我们得到 F k = ∑ x , y f k ( x , y ) F^k = \sum_{x,y}f_k(x,y) Fk=∑x,y?fk?(x,y) (注意论文中该公式没有取平均)。对于一个给定的类 c c c,在最后进行 s o f t m a x softmax softmax激活之前是输入为 S c = ∑ k w k c F k S_c = \sum_kw_k^cF_k Sc?=∑k?wkc?Fk?, w k c w_k^c wkc?是一组权重代表对于一个类c而言,每个特征图 k k k的重要程度,也就是最后全连接层的权重。最后使用softmax输出该类在所有类中的分数 P c = e x p ( S c ) ∑ c e x p ( S c ) P_c = \frac{exp(S_c)}{\sum_c exp(S_c)} Pc?=∑c?exp(Sc?)exp(Sc?)? 。在论文中,最后一层没有使用 b i a s bias bias,因为对于分类的性能几乎没有影响。 总而言之,类别
c
c
c的输出为: 从这个公式来看,类激活图CAM就是将最后一层卷积层中每个特征图按照不同的权重叠加到一起,生成一个加权特征图。 2.2 通俗理解在上述论文中,类激活图使用了GAP(全局平均池化),它省去了全连接层,减少了参数,还能防止过拟合。如下图所示,图源CSDN中的一篇博客 在一个卷积神经网络中,我们卷积到最后可能会有许多的特征图,GAP之前的卷积层告诉我们网络最后的每个特征图是什么样的。对于GAP之后的全连接层而言,它通过一组权重计算得出哪几个特征图对识别猫更有利,我们直接把属于猫(在多分类中可能会有n个类)的权重矩阵和所有的特征图拿出来进行相乘,就可以知道神经网络认为哪些特征图能帮助它识别一只猫,这边是CAM的原理所在。 我们最后的目的是将多个特征图按照权重叠加到一起,生成一个加权特征图,这个加权特征图是一张不同颜色深度的图片,然后将该特征图覆盖在原图上,用不同颜色表示每个像素点对于分类的重要程度,也表示神经网络的关注点所在。 举个例子,在猫狗分类中,我们现在有一张猫的图片,经过网络后再最后一层得到了512×7的特征图,也就是说有512个7*7的特征图,然后我们将这些特征图经过GAP后连接到最后带 s o f t m a x softmax softmax激活的全连接层中分类,这个全连接层的权重的维度为512×2,在这里,我们只去属于猫类的权重(论文中的类别c),即512个权重,与之前的特征图点乘得到7×7的特征图,这7×7的特征图代表了最后一层卷积层中所有特征图的加权和,然后我们将这个特征图用图片的形式画出来,即用不同的颜色表示不同像素点对分类的贡献。 用我不太精湛的画技大概是这样一个过程,希望能帮助大家理解: 3 代码实现首先,我们需要准备猫狗识别的数据集:百度网盘 ,提取码:fxvv 为了便于实现,我简单地调用了ResNet18来训练猫狗识别网络,而且没有使用GPU进行训练,如需使用请添加使用GPU代码。
在训练好网络后,就可以进行提取网络中最后一层卷积层的特征图和全连接层的权重进行计算CAM了,代码参考了 CSDN ‘’鬼扯子‘同学’的一篇博客,稍加修改并添加了注释,具体过程:
4.结果正确的结果: 错误的结果: 结果分析:由于猫狗在毛发,形态等有相似之处,所以神经网络的分类结果并不是太理想,对于猫而言,神经网络分类较为正确,CAM也基本上能关注到猫本身,而对于狗而言,经常会与猫混淆,而且CAM会关注到一些背景,如草地,笼子等。 5 结语与联系方式CAM我是在人体骨架动作识别领域了解到的(参考文献2),作者通过将人体骨架节点和时间作为x和y来推断神经网络在训练过程中着重关注哪些关节点(或者说哪些关节点对于人体骨架动作识别更有利),从而使用多个流,每个流都只输入上一流没有关注到的节点,即CAM分数低的节点,来迫使神经网络关注到更多的信息。可见CAM技术不止局限于图像领域,本文主要是我对于CAM的一些理解以及实现,能力有限,如有不对欢迎评论区或者私信向我指出:1759412770@qq.com,zn1759412770@163.com 6 参考文献[1] Zhou B , Khosla A , Lapedriza A , et al. Learning Deep Features for Discriminative Localization[C]// CVPR. IEEE Computer Society, 2016. [2] Song Y F , Zhang Z , Shan C , et al. Richly Activated Graph Convolutional Network for Robust Skeleton-based Action Recognition[J]. IEEE Transactions on Circuits and Systems for Video Technology, 2020, PP(99):1-1. |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 15:53:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |