IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Grad-cam:原理及pytorch实现 -> 正文阅读

[人工智能]Grad-cam:原理及pytorch实现

1、原理

首先简单提下CAM,CAM原理如下图所示,其实就是将某层的激活图按权重进行加权和。我们关注两点:1)激活图,即某层的特征图。2)权重对应每层的重要程度。实际上在我所知的各种变形CAM方法中,都是基于激活图和权重值的加权和原理,只不过不同方法获取权重值的方法不一样,grad-cam就是利用梯度来计算权重值。那么在CAM中权重值就是全连接层中对应类的weights。
在这里插入图片描述

而grad-cam的原理和cam差不多,只不过获取权重的方法不同。grad-cam从名字可以看出,它是通过梯度来获取权重的。
在这里插入图片描述
首先,在前向推理时,获取某层的特征层F和网络的预测值y(不进行softmax),在这一步我们就得到了激活图(特征图)

然后如果网络的最大输出类为cat,则以cat类别的预测值 y c a t y_{cat} ycat?作为loss,在该loss上进行反向传播,得到特征层F在类别cat上的梯度值G

然后将G计算每个通道上的均值,作为对应特征图通道的权重值,然后对特征图进行加权和,再通过ReLU(舍弃负值,论文中认为负值可能是帮助判断其他类的像素)即可。(当然为了更好的可视化效果,还要进行一些可视化上的操作,不过都不属于grad-cam的任务了)

2、代码实现

# 现在假设你已经准备好训练好的模型和预处理输入了

grad_block = []	# 存放grad图
feaure_block = []	# 存放特征图

# 获取梯度的函数
def backward_hook(module, grad_in, grad_out):
    grad_block.append(grad_out[0].detach())

# 获取特征层的函数
def farward_hook(module, input, output):
    feaure_block.append(output)

# 已知原图、梯度、特征图,开始计算可视化图
def cam_show_img(img, feature_map, grads):
    cam = np.zeros(feature_map.shape[1:], dtype=np.float32)  # 二维,用于叠加
    grads = grads.reshape([grads.shape[0], -1])
    # 梯度图中,每个通道计算均值得到一个值,作为对应特征图通道的权重
    weights = np.mean(grads, axis=1)	
    for i, w in enumerate(weights):
        cam += w * feature_map[i, :, :]	# 特征图加权和
    cam = np.maximum(cam, 0)
    cam = cam / cam.max()
    cam = cv2.resize(cam, (W, H))

    # cam.dim=2 heatmap.dim=3
    heatmap = cv2.applyColorMap(np.uint8(255 * cam), cv2.COLORMAP_JET)	# 伪彩色
    cam_img = 0.3 * heatmap + 0.7 * img

    cv2.imwrite("cam.jpg", cam_img)


# layer_name=model.features[18][1]
model.features[18][1].register_forward_hook(farward_hook)
model.features[18][1].register_backward_hook(backward_hook)

# forward 
# 在前向推理时,会生成特征图和预测值
output = model(inp)
max_idx = np.argmax(output.cpu().data.numpy())
print("predict:{}".format(max_idx))

# backward
model.zero_grad()
# 取最大类别的值作为loss,这样计算的结果是模型对该类最感兴趣的cam图
class_loss = output[0, max_idx]	
class_loss.backward()	# 反向梯度,得到梯度图

# grads
grads_val = grad_block[0].cpu().data.numpy().squeeze()
fmap = feaure_block[0].cpu().data.numpy().squeeze()
# 我的模型中
# grads_cal.shape=[1280,2,2]
# fmap.shape=[1280,2,2]

raw_img = cv2.imread("../3.jpg")
# save cam
cam_show_img(raw_img, fmap, grads_val)

关于register_forward_hook的使用:热力图的关键:利用register_hook获取梯度

关于

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:26:47  更:2022-04-24 09:28:08 
 
开发: 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/26 9:45:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码