如何可视化卷积网络关注自编码器?

数据挖掘 Python 神经网络 喀拉斯 可视化
2022-03-12 06:48:31

我正在尝试为我的 CNN 创建一些很酷(并且至少有些有意义)的可视化,用于自动编码图像,因为我使用编码的中间层进行相似性比较。

即,我想要输入图像的视图,但如果有意义的话,可以使用某种“热图”或覆盖的东西来显示 CNN “关注”的内容。也许是某种梯度幅度,我在另一个 CNN 项目中看到了这个,例如类似于这个网站上的例子。

我怎么能为我的自动编码器做这个?网络是用 Keras 用 Python 编码的,我复制了下面的代码:

img = Input(shape=(IMG_W, IMG_H, IMG_C), name='input_img_') 
    network = Convolution2D(CONV_0, 3, 3, activation='elu', border_mode='same', name='conv_0_e')(img)   
    network = MaxPooling2D((2, 2), border_mode='same')(network) 
    network = Convolution2D(CONV_1, 3, 3, activation='elu', border_mode='same', name='conv_1_e')(network)   
    network = MaxPooling2D((2, 2), border_mode='same')(network) 
    network = Convolution2D(CONV_2, 3, 3, activation='elu', border_mode='same', name='conv_2_e')(network)
    network = MaxPooling2D((2, 2), border_mode='same')(network) 
    network = Convolution2D(CONV_3, 3, 3, activation='elu', border_mode='same', name='conv_3_e')(network) 
    encoded = MaxPooling2D((2, 2), border_mode='same', name='encoded')(network) 
    
    network = Convolution2D(CONV_1, 3, 3, activation='elu', border_mode='same', name='conv_0_d')(encoded)
    network = UpSampling2D((2, 2))(network)
    network = Convolution2D(CONV_1, 3, 3, activation='elu', border_mode='same', name='conv_1_d')(network)
    network = UpSampling2D((2, 2))(network) 
    network = Convolution2D(CONV_2, 3, 3, activation='elu', border_mode='same', name='conv_2_d')(network)
    network = UpSampling2D((2, 2))(network)
    network = Convolution2D(IMG_C, 3, 3, activation='elu', border_mode='same', name='conv_decoded')(network)
    decoded = UpSampling2D((2, 2))(network) 

model_inputs = img
    model_outputs = decoded 
    model = Model(input=model_inputs, output=model_outputs)
    
    model.compile(loss='binary_crossentropy', optimizer='adadelta')

这个问题有点开放,我认为本身没有“正确答案”,但我对如何可视化网络正在做什么的创造性想法持开放态度。讨厌这样说,但我正在寻找一些我会向外行展示的东西,他们会像“哇,看看那个 AI go”哈哈。但说真的,这就是我在这里寻找的东西。也许是特征图的拼贴图像?让我知道你的想法,我非常感谢任何示例代码!

1个回答

您可以可视化各个层的激活图,以展示深度 CNN 如何将您的输入分解为越来越抽象的构建块。这里有关于Cross Validated SE的很好的讨论这解释了关于 CNN 如何工作的主要思想和直觉,并且通常会激发外行人去倾听和学习更多信息:-)


还有另一个伟大的想法命名显着图 - [Simonyan et al.]除了阅读那篇论文,我还建议观看CS231n 的第 12 讲此处为幻灯片)。我相信“如何做到这一点”的总体思路确实可以应用于大多数深度神经网络。

以下是链接论文的示例:

狗照片显着图

步骤是这样的:

  1. 采用训练有素的网络架构
  2. 选择您感兴趣的层(无论是最后一层还是中间层
  3. 将所选图层之前的图层中的所有权重设置为零
  4. 从您选择的层执行反向传播回您的输入

现在您将拥有一组与您的输入尺寸相匹配的权重,但这些值将是您所选层的权重值,只需向后推断到您的输入。

然后,您可以将这些权重与输入图像一起使用,也许只需将这些值添加到一个或所有颜色通道,您将获得一个突出显示某些区域的图像。突出显示的区域表示您所选层的相应神经元被激活的位置 - 即它们专注于对最终预测做出贡献的地方。


另一种方法是系统地遮挡(掩盖)图像的某些部分,并跟踪预测的波动情况。直觉是,当你掩盖了图像的某个部分,并且预测变得很糟糕时,你知道你的网络真的在寻找你刚刚掩盖的那个部分。第一次真正发表(据我所知)是在Zeiler 和 Fergus 的 2013 年论文中

在下图中(来自该链接的论文),您可以看到灰色方块是如何移动的,并且图像以创建最终的热图,它突出显示图像的关键部分以获得正确的图像分类。

在此处输入图像描述