能否提供一个关于Class Activation Mapping (CAM)可视化的Python代码示例?
时间: 2024-12-26 15:30:34 浏览: 11
Class Activation Mapping (CAM)是一种用于理解卷积神经网络(CNN)分类决策的工具,它关注的是哪些区域对最终类别预测贡献最大。以下是一个简单的Python代码示例,使用Keras库(结合了TensorFlow或Theano作为后端)来实现VGG16模型的CAM可视化:
```python
from keras.applications.vgg16 import VGG16, preprocess_input
from keras.preprocessing import image
import numpy as np
from keras.models import Model
from keras.layers import GlobalAveragePooling2D
# 加载预训练的VGG16模型并移除顶部全连接层
vgg = VGG16(weights='imagenet', include_top=False)
for layer in vgg.layers[:15]: # 我们通常选择倒数第二层,即pool5作为 CAM的基础
layer.trainable = False
# 添加全局平均池化层和 Softmax 输出层
x = GlobalAveragePooling2D()(vgg.output)
predictions = Dense(vgg.class_count, activation='softmax')(x)
# 创建新的模型只包含特征提取部分和我们的新输出层
model = Model(inputs=vgg.input, outputs=predictions)
# 准备一张图片
img_path = 'path_to_your_image.jpg'
img = image.load_img(img_path, target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)
# 获取CAM映射
cam = model.predict(img_array)[0]
cam = cam.reshape(7, 7, -1) # 这里假设我们选择了VGG16,有7x7的特征图
cam = cam.max(axis=-1) # 取通道最大值
# 绘制原图和CAM热点
import matplotlib.pyplot as plt
plt.imshow(image.array_to_img(img_array[0]))
plt.title(f'Most important regions for prediction: {np.argmax(model.predict(img_array))}')
plt.imshow(cam, cmap='jet', alpha=0.5)
plt.show()
阅读全文