前言
在大部分人看来,卷积神经网络是一种黑盒技术,通过理论推导,以及梯度传播,去不断逼近局部最优解。这也导致人们对于神经网络研究进展的缓慢,因为这种黑盒模型无法给出研究人员进行改进的思路。所幸的是,近几年来的论文,也从常规的神经网络结构转向神经网络可视化,目的是让我们能看见卷积神经网络“学习”到了什么,神经网络是怎么判别物体的类别
今天就要为大家介绍一种卷积神经网络可视化的技巧,它发表于一篇论文,名叫Grad CAM,通过热力图来对神经网络进行可视化。
简介
热力图通常是用来对类别进行划分的图像,它有点像红外成像图,温度高的地方就很红,温度低的部分就呈现蓝色。同理,我们使用热力图可以以权重的形式来展现,神经网络对图片的哪一部分激活值最大。比如输入到猫狗分类,如果卷积神经网络判别是猫,那它的热力图普遍分散在猫身上,而至于它是根据猫的哪一部分来判别,就利用了热力图的原理
原理
我们卷积神经网络进行分类,最后一层通常是softmax层,其最大值对应的就是分类类别
我们从这个最大概率分类类别的节点出发,进行反向传播,对最后一层卷积层求得梯度,然后对每一张特征图求出均值,最后我们取出 最后一层卷积层的激活值,与前面我们对梯度特征图的均值进行相乘,这个过程可以理解为,每个通道的重要程度与我们卷积激活值进行相乘,就相当于是一个加权操作。最后根据这个乘积值生成一个热力图,与原图进行叠加。
代码实现
这里笔者参考的是deep learning with python。环境为最新的keras框架
模型是自己简单训练出来的一个vgg16模型,只不过将对应的卷积层改为depthwise Separable卷积,全连接层也调小了很多,最后做的是一个多分类(五个类别)
先看一下我自己实现的vgg16代码
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
base_dir = './train_data/'
train_data_gen = ImageDataGenerator(rescale=1./255,
rotation_range=30,
horizontal_flip=True)
train_generator = train_data_gen.flow_from_directory(
base_dir,
target_size=(224, 224),
batch_size=20,
class_mode='categorical'
)
model = models.Sequential()
mode