GradCAM со слоями передачи знаний и расширения в imput

#python #tensorflow #transfer-learning

#питон #тензорный поток #передача-обучение

Вопрос:

Я пытаюсь внедрить GradCAM в модель обучения с передачей. По этой причине мне нужен дополнительный вывод из последнего сверточного слоя базовой модели. Моя модель состоит из слоев предварительной обработки/увеличения, предварительно обученной мобильной сети и пользовательской головки. Когда MobileNet реализован на одном функциональном уровне, я всегда получаю ошибку отключенного графика. И из-за слоев расширения в начале мне не удалось реализовать MobileNet в виде отдельных слоев, как предлагали другие решения. Большое спасибо за любую помощь!

 # transfer-learning model  base_model = MobileNetV2(input_shape=(224, 224, 3), include_top=False, weights='imagenet')    inputs = Input(shape=(224, 224, 3)) augmented = RandomFlip("horizontal")(inputs) augmented = RandomRotation(0.1)(augmented) augmented = RandomZoom(height_factor=(0.0, 0.3), width_factor=(0.0, 0.3),   fill_mode='constant')(augmented) mobilenet = base_model(augmented) pooling = GlobalAveragePooling2D()(mobilenet) dropout = Dropout(0.5)(pooling) outputs = Dense(len(classes), activation="softmax")(dropout) model = Model(inputs=inputs, outputs=outputs) model.summary()  

А вот моя модель для GradCAM:

 gradModel = Model(inputs=[model.inputs],  outputs=[model.get_layer('mobilenetv2_1.00_224').get_layer('Conv_1').output,  model.output])  

Комментарии:

1. Вы пытались передать [model.get_layer(‘mobilenetv2_1.00_224’).input] в качестве ввода в gradcam вместо [model.input]? Я использовал аналогичный подход для ResNet, и он работал просто отлично.

2. Да, я пытался. Это прекрасно работает, если я использую только ‘Conv_1’ из MobileNet в качестве вывода. Но как только я добавляю model.output в качестве второго вывода, я снова получаю ошибку отключения графика.