K.gradients (loss, input_img) devuelve “Ninguno”. (Keras visualización CNN con backend tensorflow)

Tengo modelos CNN entrenados utilizando Keras con backend Tensorflow. Y deseo visualizar mis filtros CNN con este tutorial: https://blog.keras.io/how-convolutional-neural-networks-see-the-world.html

from keras import backend as K from keras.models import load_model import numpy as np model = load_model('my_cnn_model.h5') input_img = np.load('my_picture.npy') # get the symbolic outputs of each "key" layer (we gave them unique names). layer_dict = dict([(layer.name, layer) for layer in model.layers]) layer_name = 'block5_conv3' filter_index = 0 # can be any integer from 0 to 511, as there are 512 filters in that layer # build a loss function that maximizes the activation # of the nth filter of the layer considered layer_output = layer_dict[layer_name].output loss = K.mean(layer_output[:, :, :, filter_index]) # compute the gradient of the input picture wrt this loss grads = K.gradients(loss, input_img)[0] # normalization trick: we normalize the gradient grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5) # this function returns the loss and grads given the input picture iterate = K.function([input_img], [loss, grads]) 

Sin embargo, cuando el código se ejecuta en esta línea:
grads = K.gradients(loss, input_img)[0]
Encontré que no devuelve nada más que el objeto None , por lo que el progtwig no puede avanzar después de eso.

Busco alguna solución. Algunas personas dicen que input_img debe ser del tipo Tensorflow de tensorflow: https://github.com/keras-team/keras/issues/5455

Pero cuando intenté convertir el img a Tensor, el problema sigue existiendo.
Intenté la solución en el enlace de arriba, pero todavía falla.

También hay alguien que dice que este problema existe porque su modelo de CNN no es diferenciable. https://github.com/keras-team/keras/issues/8478

Pero mi modelo usa solo la función de activación de ReLU y Sigmoid (en la capa de salida). ¿Es este problema realmente causado por un problema no diferenciable?

¿Alguien puede ayudarme? ¡Muchas gracias!

Si tiene una instancia de Modelo, para tomar el gradiente de la pérdida con respecto a la entrada, debe hacer:

 grads = K.gradients(loss, model.input)[0] 

model.input contiene el tensor simbólico que representa la entrada al modelo. El uso de una matriz numpy simple no tiene sentido porque TensorFlow no tiene idea de cómo se conecta con el gráfico computacional y no devuelve None como gradiente.

Entonces también debes reescribir la función iterate como:

 iterate = K.function([model.input], [loss, grads]) 

A continuación, es mi ejemplo. Espero poder ayudar a alguien.

gradient = keras.backend.gradients(model.output, model.input)[2]

iterate = keras.backend.function(model.input, [gradient])

grad = iterate([patches, depthes, poses])

[parches, profundidad, poses] es mi model.input