不能说你自己的数据,但 Inception V3 的倒数第二层用于 Grad-CAM 可视化确实是 mixed10 (idx 310),正如你链接到的笔记本中所报告的那样:
310 是全局平均池化之前的连接
基本原理:由于conv2d_94 (299) 的输出与下游的其他卷积层(或串联)相连,如mixed9_1、concatenate_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 关于“专注于耳朵')...