我正在尝试在TF2.3上运行CNN分类器。但我对渐变cam(显著性)有一个问题。我得到了以下错误:
如果启用了即时执行,则不支持tf.gradients
。改用tf.GradientTape
我看到有一些建议的解决方案,但我试图使用梯度凸轮作为一个函数
这是我的职责:
def grad_cam(input_model, image, cls, layer_name, H=320, W=320):
"""GradCAM method for visualizing input saliency."""
y_c = input_model.output[0, cls]
conv_output = input_model.get_layer(layer_name).output
grads = gtape.gradient(y_c, conv_output)[0]
gradient_function = K.function([input_model.input], [conv_output, grads])
output, grads_val = gradient_function([image])
output, grads_val = output[0, :], grads_val[0, :, :, :]
weights = np.mean(grads_val, axis=(0, 1))
cam = np.dot(output, weights)
# Process CAM
cam = cv2.resize(cam, (W, H), cv2.INTER_LINEAR)
cam = np.maximum(cam, 0)
cam = cam / cam.max()
return cam
def compute_gradcam(model, img, image_dir, df, labels, selected_labels,
layer_name='bn'):
preprocessed_input = load_image(img, image_dir, df)
predictions = model.predict(preprocessed_input)
print("Loading original image")
plt.figure(figsize=(15, 10))
plt.subplot(151)
plt.title("Original")
plt.axis('off')
plt.imshow(load_image(img, image_dir, df, preprocess=False), cmap='gray')
j = 1
for i in range(len(labels)):
if labels[i] in selected_labels:
print(f"Generating gradcam for class {labels[i]}")
gradcam = grad_cam(model, preprocessed_input, i, layer_name)
plt.subplot(151 + j)
plt.title(f"{labels[i]}: p={predictions[0][i]:.3f}")
plt.axis('off')
plt.imshow(load_image(img, image_dir, df, preprocess=False),
cmap='gray')
plt.imshow(gradcam, cmap='jet', alpha=min(0.5, predictions[0][i]))
j += 1
此代码来自在线课程。 我感谢你的帮助
目前没有回答
相关问题 更多 >
编程相关推荐