本节将使用 keras-vis,一个用于可视化 VGG 预建网络学到的不同滤波器的 Keras 软件包。基本思路是选择一个特定的 ImageNet 类别并理解 VGG16 网络如何来学习表示它。
第一步是选择 ImageNet 上的一个特定类别来训练 VGG16 网络。比如,将下图中的美国北斗鸟类别设定为 20:
ImageNet 类别在网站 https://gist.github.com/yrevar/6135f1bd8dcf2e0cc683 中可以找到,作为一个 Python 字典包,ImageNet 的 1000 个类别 ID 被处理为人类可读的标签。
正如预期的那样,这个特定的层学习低层的特征,如曲线。然而,卷积网络的真正威力在于,模型中的网络越深入,越能推断出更复杂的特征。
keras-vis 可视化密集层的关键思想是生成一个输入图像以最大化对应于鸟类的最终密集层输出。所以实际上这个模块做的是反转这个过程。给定一个特定的训练密集层与它的权重,生成一个新的最适合该层本身的合成图像。
每个卷积滤波器都使用类似的思路。在这种情况下,第一个卷积层是可以通过简单地将其权重可视化来解释的,因为它在原始像素上进行操作。
随后的卷积滤波器都对先前的卷积核的输出进行操作,因此直接对它们进行可视化并不一定非常容易理解。但是,如果独立考虑每一层,可以专注于生成最大化滤波器输出的合成输入图像。
GitHub 中的 keras-vis 存储库提供了一系列关于如何检查内部网络的可视化示例,包括注意力显著图,其目标是在图像中包含各种类别(例如,草)时检测图像的哪个部分对特定类别(例如,老虎)的训练贡献最大。典型文章有“Deep Inside Convolutional Networks:Visualising Image Classification Models and Saliency Maps”,其中一个 Git 库中的图片显示如下,这个案例说明了在网络中一个老虎的显著图样本: