【问题标题】:Visualizing deep layer filters in Keras CNN在 Keras CNN 中可视化深层过滤器
【发布时间】:2019-04-09 21:51:56
【问题描述】:

我的问题很简单。我想可视化在深层卷积网络中使用了哪些过滤器来提取预测最终模型的特征。通过可视化,我的意思是将其保存为 .png 格式,就像在 https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/03/cnn_filters.png 的最后一层中显示的过滤器一样,我们实际上可以在最后一层过滤器中看到一辆汽车

我可以通过我自己的问题Visualising Keras CNN final trained filters at each layer 提供的帮助来可视化第一个卷积层的过滤器,但这仅显示第一层的可视化。第一层过滤器看起来像一些随机彩色的 3x3 像素图像。但是我想在第一个链接中看到像汽车过滤器一样的最终层过滤器。

第一层过滤器看起来像一些随机彩色的 3x3 像素图像。但我想在第一个链接中看到最后一层过滤器,比如汽车过滤器。 就连汽车滤清器https://www.analyticsvidhya.com/blog/2018/03/essentials-of-deep-learning-visualizing-convolutional-neural-networks/的文章也只有第一层的代码

【问题讨论】:

    标签: keras deep-learning conv-neural-network


    【解决方案1】:

    Python 库keras-vis 是可视化 CNN 的绝佳工具。它可以生成卷积过滤器可视化、密集层可视化和注意力图。最新版本相当老旧(而且有点bug),所以我建议从master 安装:

    pip install git+https://github.com/raghakot/keras-vis.git
    

    【讨论】:

    • 嘿,图书馆似乎解决了我的问题,但文档链接似乎被注意力图、convnet 过滤器可视化和密集层可视化破坏了
    • @Yusuf 你可以查看examples directory,在那里你可以找到mnist 和vggnet 的激活最大化示例。另外,看看docs for activation maximization。
    • 我知道这听起来很奇怪,但是github.com/raghakot/keras-vis/blob/master/examples/mnist/… 中 26 号单元格中的各种数字的图像告诉了网络。它只是输入图像的模糊图像。与我的问题中的第一个链接不同,它清楚地显示了最终层过滤器中的汽车。如果我有一些误解,请让我澄清一下。
    • @Yusuf,正如docs 中提到的,“激活最大化背后的想法是 [to] 生成最大化过滤器输出激活的输入图像。”这是一种有效的可视化方法。这与简单地绘制权重不同。
    • 假设我有一个 3x3 的过滤器和 28x28 的图像。过滤器看起来无法解释,只是 9 个像素的随机颜色。如果我将该过滤器与输入图像进行卷积,并且图像上使用过滤器高度激活的区域意味着该过滤器代表图像的该部分/模式/部分。这就是热图的基本作用。
    【解决方案2】:

    您可以通过以下方式处理不同层的权重:

    w = model.layers[i].get_weights()[0][:,:,:,:]
    

    其中i 是您的层数。

    如果是链接中的图片,我不确定它实际上是权重还是显示的激活图。您可以通过以下方式获得:

    from keras import backend as K
    
    get_output = K.function([model.layers[0].input],[cnn.layers[i].output])
    output_normal = get_output([X])[0][m]
    

    其中m是X中某个图像的编号作为输入。

    【讨论】:

    • a = model.layers[0].get_weights()[0] 给出大小为 a 的 (3,3,3,32) 所以我认为你的第一个代码应该是 w = model.layers[i].get_weights()[0][:,:,:,0] 。通过这种方式,我可以保存 32 个过滤器图像,因为第一层有 32 个过滤器。但代码不适用于第二层。
    • a = model.layers[2].get_weights()[0] 给出大小为 (3,3,32,16) 的 a 。我的第二个转换层中有 16 个过滤器。
    • 是的,你是对的。指标是:1. 内核宽度,2. 内核高度,3. 通道数,4. 过滤器数量。您可以通过以下方式寻址第二层中第一个过滤器的所有通道:w = model.layers[1].get_weights()[0][:,:,:,0]
    • 是的,如果您在第一层应用 32 个过滤器,您将在第二层中获得 32 个激活图/通道。您可以将它们中的每一个绘制为单独的灰度图片,但当然不能绘制为 RGB 图片。
    • 是的,将它们绘制为灰度将解决问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2018-08-03
    • 2023-03-26
    相关资源
    最近更新 更多