Python 试图用梯度凸轮热图可视化ML,但K梯度返回零值
为了可视化ML过程的结果,我决定使用CAM热图。 我使用了模型上提供的代码,但是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
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
后端
或Tensorflowtf.GradientTape()函数
捕获梯度。稍后,我们可以使用这些渐变来可视化为热图。我想为您介绍两个SO答案,它们解释了如何捕捉梯度并将其可视化为热图。这两个答案足以满足您的要求
请参阅此文档,以使用Keras后端捕获梯度,并将梯度可视化为热图
如果您热衷于使用Tensorflowtf.GradientTape()
函数捕获梯度,请参考此函数,对于将梯度可视化为热图,您可以使用前面答案中提到的相同代码。是否尝试使用热图可视化计算的梯度?是,就像在第一个超链接中一样。