K.梯度(损失,input_img)[0] 返回"None" .(Keras CNN 可视化与 tensorflow 后端)



我有使用Keras和Tensorflow后端训练的CNN模型。 我想通过本教程可视化我的 CNN 过滤器: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])

但是,当代码执行到以下行时:
grads = K.gradients(loss, input_img)[0]
我发现它只返回None对象,因此程序在此之后无法进行。

我寻找一些解决方案。有人说input_img应该是张量流的张量类型: https://github.com/keras-team/keras/issues/5455

但是当我尝试将 img 转换为张量时,问题仍然存在。
我尝试了上面链接中的解决方案,但仍然失败。

也有人说,这个问题之所以存在,是因为你的CNN模型是不可微分的。 https://github.com/keras-team/keras/issues/8478

但是我的模型只使用 ReLU 和 Sigmoid(在输出层)的激活函数。 这个问题真的是由不可微分问题引起的吗?

谁能帮我?谢谢!

如果你有一个模型实例,那么要取相对于输入的损失梯度,你应该做:

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

model.input包含表示模型输入的符号张量。使用普通的numpy数组是没有意义的,因为TensorFlow不知道它是如何连接到计算图的,并返回None作为梯度。

然后,您还应该将iterate函数重写为:

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

下面是我的例子。希望能帮助别人。

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

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

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

[补丁,深度,姿势]是我的模型。

我也遇到了同样的错误@Jexus。对我来说,问题是:

损失变量是 None 对象。我用过

loss.assign_add(....)

而不是

loss = loss + .....

如前所述更改后,损失返回一个张量,因此

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

没有返回 无。

相关内容

最新更新