基于Keras的卷积神经网络(CNN)可视化
标签(空格分隔): 深度学习
卷积神经网络可视化
- 本文整理自Deep Learning with Python,书本上完整的代码在 这里的5.4节,并陪有详细的注释。
- 深度学习一直被人们称为“黑盒子”,即内部算法不可见。但是,卷积神经网络(CNN)却能够被可视化,通过可视化,人们能够了解CNN识别图像的过程。
- 介绍三种可视化方法
- 卷积核输出的可视化(Visualizing intermediate convnet outputs (intermediate activations),即可视化卷积核经过激活之后的结果。能够看到图像经过卷积之后结果,帮助理解卷积核的作用
- 卷积核的可视化(Visualizing convnets filters),帮助我们理解卷积核是如何感受图像的
- 热度图可视化(Visualizing heatmaps of class activation in an image),通过热度图,了解图像分类问题中图像哪些部分起到了关键作用,同时可以定位图像中物体的位置。
卷积核输出的可视化(Visualizing intermediate convnet outputs (intermediate activations)
- 想法很简单:向CNN输入一张图像,获得某些卷积层的输出,可视化该输出
- 代码中,使用到了cats_and_dogs_small_2.h5模型,这是在原书5.2节训练好的模型,当然你完全可以使用keras.applications 中的模型,例如VGG16等。
- 可视化结果如下图。
- 结论:
- 第一层卷积层类似边缘检测的功能,在这个阶段里,卷积核基本保留图像所有信息
- 随着层数的加深,卷积核输出的内容也越来越抽象,保留的信息也越来越少。
- 越深的层数,越多空白的内容,也就说这些内容空白卷积核没有在输入图像中找到它们想要的特征
卷积核的可视化(Visualizing convnets filters)
- 卷积核到底是如何识别物体的呢?想要解决这个问题,有一个方法就是去了解卷积核最感兴趣的图像是怎样的。我们知道,卷积的过程就是特征提取的过程,每一个卷积核代表着一种特征。如果图像中某块区域与某个卷积核的结果越大,那么该区域就越“像”该卷积核。
- 基于以上的推论,如果我们找到一张图像,能够使得这张图像对某个卷积核的输出最大,那么我们就说找到了该卷积核最感兴趣的图像。
- 具体思路:输入一张随机内容的图像
I , 求某个卷积核F 对图像的梯度G=∂F/∂I ,用梯度上升的方法迭代更新图像I=I+η∗G ,η 是类似于学习率的东西。 - 代码中,使用以及训练好的VGG16模型,可视化该模型的卷积核。结果如下
- block1_conv1
- block2_conv1
- block3_conv1
- block4_conv1
- block5_conv1
- 结论:
- 低层的卷积核似乎对颜色,边缘信息感兴趣。
- 越高层的卷积核,感兴趣的内容越抽象(非常魔幻啊),也越复杂。
- 高层的卷积核感兴趣的图像越来越难通过梯度上升获得(block5_conv1有很多还是随机噪声的图像)
热度图可视化(Visualizing heatmaps of class activation in an image)
- 在图像分类问题中,假设网络将一张图片识别成“猫”的概率是0.9,我想了解到底最后一层的卷积层对这0.9的概率的贡献是多少。换句话时候,假设最后一层卷积层有512个卷积核,我想了解这512个卷积核对该图片是”猫”分别投了几票。投票越多的卷积核,就越确信图片是“猫”,因为它们提取到的特征趋向猫的特征。
- 代码中,输入了一张大象的图片,然后获得最后一层卷积层的热度图,最后将热度图叠加到原图像,获得图像中起到关键分类作用的部分。结果如下: