GradientTape не возвращает None - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь использовать 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 в сетевой структуре (все идет нормально при воспроизведении примера задачи классификации с веб-сайта), но я могу Не могу понять, в чем проблема с этой сетью, используемой для регрессии!

Не могли бы вы мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...