Я пытаюсь использовать grad-CAM (я следую за этим https://www.pyimagesearch.com/2020/03/09/grad-cam-visualize-class-activation-maps-with-keras-tensorflow-and-deep-learning/ из PyImageSearch) на CNN, на которой я использую обучение с переносом.
В частности, я Я использую простой CNN для решения задачи регрессии. Я использовал MobileNetV2 со средним уровнем пула и плотным слоем с одним блоком наверху, как показано ниже:
base_model = MobileNetV2(include_top=False, input_shape=(224, 224, 3), weights='imagenet')
base_model.trainable = False
inputs = keras.Input(shape=(224, 224, 3))
x = base_model(inputs)
x = keras.layers.GlobalAveragePooling2D()(x)
outputs = keras.layers.Dense(1, activation="linear")(x)
model = keras.Model(inputs, outputs)
, и сводка:
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
mobilenetv2_1.00_224 (Model) (None, 7, 7, 1280) 2257984
_________________________________________________________________
global_average_pooling2d (Gl (None, 1280) 0
_________________________________________________________________
dense (Dense) (None, 1) 1281
=================================================================
Total params: 2,259,265
Trainable params: 1,281
Non-trainable params: 2,257,984
_________________________________________________________________
Я инициализирую объект CAM с:
pred = 0.35
cam = GradCAM(model, pred, layerName='input_2')
, где pred - это прогнозируемый результат, на котором я хочу проверить CAM, и я также указываю имя слоя, чтобы ссылаться на входной уровень. Затем я вычисляю тепловую карту на образце изображения «img»:
heatmap = cam.compute_heatmap(img)
Теперь давайте сосредоточимся на части реализации функции compute_heatmap из PyImageSearch:
# record operations for automatic differentiation
with tf.GradientTape() as tape:
# cast the image tensor to a float-32 data type, pass the
# image through the gradient model, and grab the loss
# associated with the specific class index
inputs = tf.cast(image, tf.float32)
(convOutputs, predictions) = gradModel(inputs)
# loss = predictions[:, self.classIdx] # original from PyImageSearch
loss = predictions[:] # modified by me as I have only 1 output unit
# use automatic differentiation to compute the gradients
grads = tape.gradient(loss, convOutputs)
Проблема вот что градиент отсутствует.
Я подумал, что, возможно, проблема может быть ie в сетевой структуре (все идет нормально при воспроизведении примера задачи классификации с веб-сайта), но я могу Не могу понять, в чем проблема с этой сетью, используемой для регрессии!
Не могли бы вы мне помочь?