我一直在尝试可视化Inception V3的热图。据我了解,倒数第二层应该是最后一个卷积层,即conv2d_94
(idx 299)。但是,这会产生非常粗糙的 map (大区域)。我尝试使用this notebook中建议的另一层mixed10
(idx 310)来解决here中所述的问题,尽管区域较小,但看起来仍然不太好。其他一些人似乎确实使用了conv2d_94
,例如here。
我知道这可能表明我的模型只是没有注意正确的事情,但是从概念上讲,我对应该使用哪一层感到困惑。什么是合适的倒数第二层?
我正在将Keras 2.2.0与visualize_cam
中的keras-vis
一起使用。
heatmap = visualize_cam(model, layer_idx, filter_indices=classnum, seed_input=preprocess_img, backprop_modifier=None)
其中
layer_idx
是dense_2
的IDx。我尝试过不定义
penultimate_layer
,根据documentation它将参数设置为最接近的倒数第二个Conv
或Pooling
层。这给出了与penultimate_layer=299
相同的结果。 最佳答案
无法说出您自己的数据,但是用于Grad-CAM可视化的Inception V3倒数第二层确实是mixed10
(idx 310),正如您在笔记本中链接到的那样:
原理:由于conv2d_94
(299)的输出在下游与其他卷积层(或它们的级联)相连,例如mixed9_1
,concatenate_2
等,因此根据定义,它不能是倒数第二个卷积层;另一方面,mixed10
不是-相反,它只是最终平均池化之前的一层。倒数第二层应该是卷积的,而不是集合的,是Chollet's exchibition的建议的,在VGG中,他使用block5_conv3
,而不是紧随其后的block5_pool
(尽管事实是,即使使用block5_pool
似乎也提供了非常相似的视觉效果结果)。
让我详细说明一下,并在上面解释对“建议”的强调。
与当前深度学习研究和实践中的许多其他事情一样,Grad-CAM是一种启发式方法,而不是“硬性”科学方法。因此,对于如何使用它以及可能产生的结果有一些建议和期望,但没有硬性规则(和“适当的”层)。请考虑original paper的以下摘录(第2节的结尾,重点是我的):
即,正如我已经说过的那样,确实存在建议和期望,但是期望会有一定的试验和随心所欲的态度...
现在,假设您在主题上关注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所产生的图像没有什么不同(尽管可以肯定的是,热图确实散布了很多,而且似乎不符合乔尔莱特关于``专注于耳朵''的叙述)。
关于machine-learning - 在Inception V3上,用于Grad-CAM可视化的倒数第二层是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52162467/