【问题标题】:What is the appropriate penultimate layer for Grad-CAM visualization on Inception V3?Inception V3 上 Grad-CAM 可视化的合适倒数第二层是什么?
【发布时间】:2019-02-09 06:16:30
【问题描述】:

我一直在尝试可视化 Inception V3 的热图。我的理解是倒数第二层应该是最后一个卷积层,即conv2d_94(idx 299)。但是,这会给出非常粗糙的地图(大区域)。我尝试按照this notebook 中的建议使用另一层mixed10 (idx 310) 来解决here 中描述的问题,虽然区域较小,但看起来仍然不太好。其他一些人似乎确实使用conv2d_94,例如here

我知道这可能表明我的模型根本没有关注正确的事情,但从概念上讲,我对应该使用哪个层感到困惑。什么是合适的倒数第二层?

我正在使用 Keras 2.2.0 和来自 keras-visvisualize_cam

heatmap = visualize_cam(model, layer_idx, filter_indices=classnum, seed_input=preprocess_img, backprop_modifier=None)

其中layer_idxdense_2 的idx。

我尝试过不定义penultimate_layer,它根据documentation 将参数设置为最接近的倒数第二个ConvPooling 层。这给出了与penultimate_layer=299 相同的结果。

【问题讨论】:

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


    【解决方案1】:

    不能说你自己的数据,但 Inception V3 的倒数第二层用于 Grad-CAM 可视化确实是 mixed10 (idx 310),正如你链接到的笔记本中所报告的那样:

    310 是全局平均池化之前的连接

    基本原理:由于conv2d_94 (299) 的输出与下游的其他卷积层(或串联)相连,如mixed9_1concatenate_2 等,根据定义,它不能是倒数第二个卷积 层;另一方面,mixed10 不是 - 相反,它只是最终平均池化层之前的一层。 Chollet's exchibition建议倒数第二层应该是卷积层而不是池化层,对于 VGG,他使用 block5_conv3,而不是紧随其后的 block5_pool(尽管事实如此)是,即使使用block5_pool 似乎也能给出非常相似的视觉结果。

    让我详细说明一下,并解释上面对“建议”的强调......

    与当前深度学习研究和实践中的许多其他事情一样,Grad-CAM 是一种启发式,而不是一种“硬”的科学方法;因此,有关于如何使用它以及结果可能是什么的建议和期望,但没有硬性规则(和“适当的”层)。考虑以下来自original paper 的摘录(第 2 节结束,重点是我的):

    我们期望最后的卷积层 在高级语义和 详细的空间信息,所以我们使用这些特征图来 计算 Grad-CAM 和 Guided Grad-CAM。

    即正如我已经说过的那样,确实有建议和期望,但预计会有一定的实验和随心所欲的态度......


    现在,假设您关注该主题的 Chollet's notebook(即使用纯 Keras,而不是 Keras-vis 包),这些是您需要在代码中进行的更改它适用于 Inception V3:

    # cell 24
    from keras import backend as K
    from keras.applications.inception_v3 import InceptionV3
    K.clear_session()
    K.set_learning_phase(0) # needs to be set BEFORE building the model
    model = InceptionV3(weights='imagenet')
    
    # in cell 27
    from keras.applications.inception_v3 import preprocess_input, decode_predictions
    img = image.load_img(img_path, target_size=(299, 299)) # different size than VGG
    
    # in cell 31:
    last_conv_layer = model.get_layer('mixed10')
    for i in range(2048):  # was 512 for VGG
        conv_layer_output_value[:, :, i] *= pooled_grads_value[i]
    

    原始creative_commons_elephant.jpg 图像上生成的叠加热图应如下所示:

    可以说,这与 VGG 在 Chollet 的笔记本中制作的相应图像并没有不同(尽管不可否认,热图确实更广泛,而且它似乎不符合 Chollet 关于“专注于耳朵')...

    【讨论】:

    • 感谢您的解释,虽然我没有提到我正在使用 keras-vis。您显示的结果与我得到的结果相似。你能解释一下为什么倒数第二层应该是 310 而不是 299?
    • @CSquare 因为conv2d_94 (299) 的输出与下游的其他卷积层(或串联)相连,如mixed9_1concatenate_2 等,根据定义它不能是倒数第二个卷积层;另一方面,mixed10 不是——相反,它只是在最终平均池化之前的一层......
    • @VenkateshMondi 谢谢,已更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2018-12-25
    • 1970-01-01
    • 2017-03-22
    • 2020-09-07
    • 2017-11-23
    相关资源
    最近更新 更多