Python 试图用梯度凸轮热图可视化ML,但K梯度返回零值

Python 试图用梯度凸轮热图可视化ML,但K梯度返回零值,python,tensorflow,keras,heatmap,Python,Tensorflow,Keras,Heatmap,为了可视化ML过程的结果,我决定使用CAM热图。 我使用了模型上提供的代码,但是pooled_grads_值,conv_layer_output_值=iterate([x])的返回值对于pooled_grads_值来说都是零,但是conv_layer_output_值中有值 我就是这样使用它的: import matplotlib.image as mpimg from keras import backend as K import matplotlib.pyplot as plt impor

为了可视化ML过程的结果,我决定使用CAM热图。 我使用了模型上提供的代码,但是
pooled_grads_值,conv_layer_output_值=iterate([x])
的返回值对于
pooled_grads_值
来说都是零,但是
conv_layer_output_值
中有值

我就是这样使用它的:

import matplotlib.image as mpimg
from keras import backend as K
import matplotlib.pyplot as plt
import pandas as pd
import keras
import numpy as np
#%%
model_path = "pathto/model.h5"
img_path = "pathto/pic.tif"
output_path = "pathto/output.jpeg"
size = (1000,200)
#%%

model = keras.models.load_model(model_path)

img=mpimg.imread(img_path)
plt.imshow(img)
#%%

from keras.preprocessing import image
img = image.load_img(img_path, target_size=size)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

#%%
preds = model.predict(x)

argmax = np.argmax(preds[0])

output = model.output[:, argmax]
#%%
last_conv_layer = model.get_layer( "conv_6_l")
grads = K.gradients(output, last_conv_layer.output)[0]
pooled_grads = K.mean(grads, axis=(0, 1, 2))
iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])
#%%
pooled_grads_value,  conv_layer_output_value = iterate([x])
#%%
for i in range(64):
    conv_layer_output_value[:, :, i] *= pooled_grads_value[i]
#%%
heatmap = np.mean(conv_layer_output_value, axis=-1)
heatmap = np.maximum(heatmap, 0)
#heatmap /= np.max(heatmap)
#%%
import cv2
img = cv2.imread(img_path)
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
hif = .8
superimposed_img = heatmap * hif + img
cv2.imwrite("pathto/justheatmap.jpeg", heatmap * hif)
#%%
cv2.imwrite(output_path, superimposed_img)
我的模型如下所示:

model = Sequential()
model.add(Conv2D(8, (3, 3), input_shape=(1000, 200, 3), name = "conv_1"))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(16, (3, 3), name="conv_2"))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3), name="conv_3"))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3),name="conv_4"))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3),name="conv_5"))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3),name="conv_6_l"))
model.add(Activation('relu'))

model.add(GlobalAveragePooling2D())

model.add(Dropout(0.33))
model.add(Dense(5))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
          optimizer='Adam',
          metrics=['accuracy'])
有人知道我的问题的根源是什么吗

我还尝试了使用tensorflow.keras.GradientTape()函数显示的另一种方法,但这给了我一个错误
模块'tensorflow'没有属性'GradientTape
,因此我坚持使用第一种方法

我在python中使用KerasV2.3.1和tensorflow V2.1.0

我还上传了一个包含我的模型的.h5文件和一张用于测试的图片

提前感谢所有试图提供帮助的人


Hans

我们可以使用Keras
后端
或Tensorflow
tf.GradientTape()函数
捕获梯度。稍后,我们可以使用这些渐变来可视化为热图。我想为您介绍两个SO答案,它们解释了如何捕捉梯度并将其可视化为热图。这两个答案足以满足您的要求

请参阅此文档,以使用Keras
后端捕获梯度,并将梯度可视化为热图


如果您热衷于使用Tensorflow
tf.GradientTape()
函数捕获梯度,请参考此函数,对于将梯度可视化为热图,您可以使用前面答案中提到的相同代码。

是否尝试使用热图可视化计算的梯度?是,就像在第一个超链接中一样。