我一直在尝试可视化Inception V3的热图。据我了解,倒数第二层应该是最后的卷积层,即conv2d_94
(idx 299)。但是,这会产生非常粗糙的地图(大区域)。我尝试使用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
相同。
答案 0 :(得分:6)
无法说出您自己的数据,但是用于Grad-CAM可视化的Inception V3倒数第二层确实是mixed10
(idx 310),如您链接到的笔记本中所述:
310是在全局平均池化之前的串联
合理性:由于conv2d_94
(299)的输出在下游与其他卷积层(或它们的串联)相连,例如mixed9_1
,concatenate_2
等,因此根据定义,它不能是倒数第二个卷积层;另一方面,mixed10
不是-相反,它只是最终平均池化之前的一层。根据{{3}},建议,倒数第二层应该是卷积层,而不是汇集层,在VGG中,他使用block5_conv3
,而不是block5_pool
紧随其后(尽管事实是,即使使用block5_pool
似乎也能提供非常相似的视觉效果)。
让我详细说明一下,并在上面解释对“建议”的强调...
与当前深度学习研究和实践中的许多其他事情一样,Grad-CAM是一种启发式,而不是“硬性”科学方法。因此,对于如何使用它以及结果可能会有建议和期望,但没有硬性规则(和“适当的”层)。请考虑以下Chollet's exchibition的摘录(第2节的重点):
我们期望将最后的卷积层 在高级语义和 详细的空间信息,因此我们使用这些特征图来 计算Grad-CAM和Guided Grad-CAM。
即正如我已经说过的,确实存在一些建议和期望,但是期望会有一定的试验和随心所欲的态度...
现在,假设您在主题上遵循original paper(即使用纯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
图像上产生的叠加热图应如下所示:
与Chollet笔记本中的VGG的图像没有什么不同(尽管可以肯定,热图确实散布了很多,而且似乎不符合Chollet关于'专注于耳朵')...