对卷积神经网络关注点的可视化——显著图和类激活图

1、针对网络关注点的可视化可以告诉我们卷积神经网络是使用哪一部分的视觉信息做出选择的,这种可视化本质上是将图像区域和神经网络结果联系起来。
2、这里主要有两种方法可以帮助我们了解卷积神经网络的关注点:显著图(Saliency Map)和类激活图(Class Activation Map)。
3、显著图
显著图解决的问题是图像中的像素对图像分类结果的影响。
生成显著图的方法:通过计算输出类别对输入图像求导数来得到。导数的意思是当输入的像素有一些小的改变时,模型输出的类别会发生怎样的变化。如果输入图像中有一部分的区域,对应输出类别在这部分区域的导数是一个很大的正值,那么当这个区域发生轻微改变时,对输出类别的影响就会非常大,这个区域就可以视为输入图像中对模型分类结果有显著影响的区域。
4、类激活图
对输入图像生成类激活的热力图。对于一张图像,这个热力图能够表示每个位置对该类别的重要程度。
对于一个训练好的卷积神经网络而言,输入信息通过多层卷积和池化运算或操作,一个网络的最后一个卷积层包含了最丰富的视觉和语义信息,类激活图就是利用了这最后一个卷积层中的信息。

#对卷积神经网络关注点的可视化 :显著图和类激活图
import keras
from keras.datasets import mnist
from keras.models import load_model
from matplotlib import pyplot as plt
import numpy as np

(x_train,y_train),(x_test,y_test)=mnist.load_data()
image=x_train[1]
plt.imshow(image)
#plt.savefig("image.jpg")

model=load_model('mnist_cnn.h5')
image=np.reshape(image,(1,28,28,1))

from vis.visualization import visualize_saliency
from vis.utils import  utils
from keras import activations


#显著图
'''
model模型
layer_idx输出层在网络中的索引
filter_indices输出的类别 比如数字0的图像 类别就是0
seed_input输入的图像
'''
#通过网络层的名字找到layer_idx
layer_idx=utils.find_layer_idx(model,'dense_2')
#将最后一层的softmax替换为linear
model.layers[layer_idx].activation=activations.linear
model=utils.apply_modifications(model)
#visualize_saliency负责生成显著图
grads=visualize_saliency(model,layer_idx,filter_indices=0,seed_input=image)
plt.imshow(grads,cmap='jet')
plt.savefig("xianzhutu.jpg")

#类激活图
# from vis.visualization import visualize_cam
# layer_idx=utils.find_layer_idx(model,'dense_2')
# #将最后一层的softmax替换为linear
# model.layers[layer_idx].activation=activations.linear
# model=utils.apply_modifications(model)
# grads=visualize_cam(model,layer_idx,filter_indices=0,seed_input=image)
# plt.imshow(grads,cmap='jet')
# plt.savefig("leijihuotu.jpg")

你可能感兴趣的:(神经网络,卷积,神经网络,可视化)