【学习笔记】Pytorch深度学习—hook函数与CAM可视化
本节内容主要分为3方面,(1)Hook函数的概念:什么是Hook函数?(2)Hook函数与特征图提取:采用Hook函数提取网络中的特征图,而不再需要手动计算特征图;(3)CAM:实用可视化方法,分析卷积神经网络的方法。
Hook函数概念
Hook Function
Hook函数机制:不改变主体,实现额外功能,像一个挂件,挂钩,hook
解释
Hook,中文意为挂钩、挂件;在Pytorch中提供了4种Hook函数,其函数机制是:不改变主体、实现额外功能,即像1个挂件一样把额外功能挂在函数主体当中。那么,为什么会有Hook函数这一“不改变主体、实现额外”的机制呢?这主要是由于Pytorch计算图、动态图的计算机制有关;例如,在 Pytorch动态图运算结束后,一些中间变量会被释放掉,如特征图、非叶子节点的梯度,但是有时候又需要提取这些中间变量,这时就可以采用Hook函数在主体代码(数据前向传播、梯度反向传播)上添加额外函数,获取中间特征图、梯度甚至是改变中间的特征图或梯度。
Hook函数与特征图提取
Pytorch提供的四种Hook函数
四种函数可以分为两大类,第一类是针对tensor的Hook函数:
torch.Tensor.register_hook(hook)
第二类是针对 Module网络模型的3种函数
torch.nn.Module.register_forward_hook()
torch.nn.Module.register_forward_pre_hook()
torch.nn.Module.register_backward_hook()
1、Tensor.register_hook
功能:注册一个反向传播的hook函数
Hook函数仅为一个输入参数,为张量的梯度
hook(grad)-->return Tensor or None
因为张量tensor在反向传播时,非叶子节点的梯度会释放,针对这一反向传播过程中有可能存在数据的释放、消失,就有了这一反向传播的hook函数。
为了清楚观察中间张量信息的获取以及熟悉张量的hook函数,通过下述计算图所对应的代码进行实验观察。
实验
(1)Tensor的hook函数功能1:实现对中间张量信息的捕获
结果证明,在backward反向传播函数主体中添加具有额外功能的hook函数可以捕获到非叶子节点a、b的梯度信息。
(2)Tensor的hook函数功能2:实现对中间张量的梯度修改
结果
2、Module.register_forward_hook
通常利用forward函数获取卷积输出的特征图。
功能:注册module的前向传播hook函数
参数:
module:当前网络层
input:当前网络层输入数据
output:当前网络层输出数据
hook(module,input,output)-->return None
实验
已经知道,在前向传播forward的时候,特征图feature map会释放掉,下面就用forward_hook函数来获取特征图。
假设输入数据为
4
×
4
4\times4
4×4的图像,像素值全为1;然后,定义在1个卷积层中有2个卷积核kernel,其中kernel1像素值均为1,kernel2像素值均为2;进行卷积操作后,得到2个
2
×
2
2\times2
2×2的feature map特征图,feature map1像素值均为9,feature map2像素值均为18;最后,进行池化操作得到9、18。
卷积、池化操作点击了解,计算也可见实验图解。
下面,代码构建卷积层、池化层网络,通过forward的hook函数获取中间虚线标注的feature map特征图。
实验
(1)给卷积层注册Hook函数
结果
3、Module.register_forward_pre_hook
功能:注册module前向传播前的hook函数
参数:
module:当前网络层
input:当前网络层输入数据
hook(module,input)-->return None
4、Module.register_backward_hook
功能:注册module反向传播前的hook函数
参数:
module:当前网络层
grad_input:当前网络层输入“梯度”数据
grad_output:当前网络层输出“梯度”数据
hook(module,input)-->return Tensor or None
CAM(class activation map,类激活图)
CAM
示意图所示的算法表示将图片输入到卷积神经网络,网络输出结果:将图片中的狗狗分类为Austrlian terrier犬种。
CAM算法:对网络最后1张特征图进行加权求和,得到注意力机制(即卷积神经网络更关注图像的××地方)
CAM具体操作:得到最后1个网络层特征图,每1个特征图乘以1个对应的权值,加起来得到CAM。在CAM中可以看出,越红的区域权重越大,越蓝的区域越不关注。卷积神经网络更关注狗狗所在位置,通过这一部分而分类到terrier权重。
方法运行机制:对特征图进行加权求和,算法关键在于:怎样获得权值W?首先,需要对特征图进行GAP(global average pooling全局平均池化);1张图对应1个神经元,这一层直接连接1个全连接层就可以得到网络输出;这就说明要对网络进行修改:最后一张特征图必须接GAP,将其转换成向量形式,再直接接fc层进行输出。构建好结构,图像输出的类所对应神经元的权重就是特征图的权重w。有了权重w1…有了feature map,就可以加权求和得到CAM
这一CAM方法可以分析卷积神经网络输出这一类是由于看到或更关注图像的哪一部分。
CAM缺点:网络输出必须要有GAP操作才能得到权重w,该方法由于需要改动网络层再重新训练,并不适用;因此,针对此有了改进,引进了Grad-CAM。
Grad-CAM
改进:利用梯度作为特征图的权重。
只要网络模型可以输出1个分类向量,利用向量反向传播求梯度,梯度得到权重,权重与原始特征图加权求和再经过激活函数得到类激活图。有了类激活图,就可以分析卷积神经网络分类的模式、分类依据。