Не могу ничего сказать о ваших собственных данных, но предпоследний уровень Inception V3 для визуализации Grad-CAM действительно mixed10
(idx 310), как сообщается в записной книжке, с которой вы связались:
310 - конкатенация до среднего глобального пула
Обоснование: поскольку выход conv2d_94
(299) связан вниз по потоку с другими сверточными слоями (или конкатенациями), такими как mixed9_1
, concatenate_2
и т. Д., По определению он не может быть предпоследним сверточным слой; mixed10
, с другой стороны, нет - напротив, это всего лишь один слой до окончательного среднего пула. Предполагается, что предпоследний слой должен быть сверточным, а не пулирующим, предлагает из Выставка Шолле , где для VGG он использует block5_conv3
, а не block5_pool
, что немедленно впоследствии (хотя на самом деле даже использование block5_pool
, похоже, дает очень похожие визуальные результаты).
Позвольте мне немного пояснить и объяснить акцент на "предложенном" выше ...
Как и многие другие вещи в современных исследованиях и практиках глубокого обучения, Grad-CAM является эвристическим , а не "сложным" научным методом; как таковые, есть рекомендации и ожидания относительно того, как его использовать и каковы могут быть результаты, но нет жестких правил (и «подходящих» уровней). Рассмотрим следующий отрывок из оригинальной бумаги (конец раздела 2, выделено мое):
Мы ожидаем последних сверточных слоев до
иметь лучший компромисс между семантикой высокого уровня и
подробная пространственная информация, поэтому мы используем эти карты
вычислить Grad-CAM и Guided Grad-CAM.
т.е. как я уже сказал, действительно есть рекомендации и ожидания, но ожидается определенная экспериментальная и свободная позиция ...
Теперь, если вы следите за записной книжкой Chollet по теме (то есть, используя чистый 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 о 'фокусировке на уши) ...