如何为TF2.0+keras CNN定义用于图像分类的梯度cam函数?

2024-09-28 17:01:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在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

此代码来自在线课程。 我感谢你的帮助


Tags: nameimagelayerdfimginputoutputlabels