pytorch学习笔记十五:Hook函数与CAM可视化

本文介绍了PyTorch中的Hook函数机制,包括Tensor的register_hook和Module的register_forward_hook、register_forward_pre_hook、register_backward_hook,用于在不改变模型主体的情况下实现额外功能,如特征提取和梯度保存。此外,还详细讲解了CAM(类激活图)的可视化技术,用于分析卷积神经网络关注图像的哪些部分以作出判断,并提到了Grad-CAM作为CAM的改进版。
摘要由CSDN通过智能技术生成

一、Hook函数概念

Hook函数机制:不改变模型主体,实现额外功能,像一个挂件或挂钩等。

为什么需要这个函数呢?这与Pytorch的动态图计算机制有关,在动态图的计算过程中,一些中间变量会释放掉,比如特征图、非叶子节点的梯度,在模型前向传播、反向传播的时候添加hook这个额外函数,提取一些释放掉而后面又需要用到的变量,也可以用hook函数来改变中间变量的梯度。

Pytorch中提供四种hook函数:
1、torch.Tensor.register_hook(hook): 针对tensor
2、torch.nn.Module.register_forward_hook:后面这三个针对Module
3、torch.nn.Module.register_forward_pre_hook
4、torch.nn.Module.register_backward_hook

二、Hook函数与特征提取

1、torch.Tensor.register_hook()

功能:这是一个针对张量的hook函数,作用是注册一个反向传播的hook函数,为什么是在反向传播呢?因为只有在反向传播过程中非叶子的梯度会释放掉,用hook函数来保存这些中间变量的信息。

hook(grad) -> Tensor or None

hook函数仅有一个输入参数为张量的梯度,返回值是tensor或者none
例如:
下图是pytorch中一个简单的计算图与梯度求导
在这里插入图片描述
在上面计算图反响传播过程中,非叶子节点a和b的梯度会释放掉,在前面的学习中可知retain_grad()可保留参数的梯度,也可用hook函数来保留梯度,如下所示:

# 构建计算图,在反向传播中用hook来保存a的梯度
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(w, x)
b = torch.add(w, 1)
y = torch.mul(a, b)

# 构建一个list用来存储a的梯度
a_grad = list()

# 自定义hook函数,存放a的梯度,然后将a的梯度存放到前面构建的list中
def grad_hook(grad):
    a_grad.append(grad)

# 接受一个hook函数的钩子,相当于把hook函数挂到计算图上,这样在反向传播时可以保存a的梯度
handle = a.register_hook(grad_hook)

y.backward()

# 查看梯度
print("gradient:", w.grad, x.grad, a.grad, b.grad, y.grad)
print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值