【问题标题】:Plotting heatmap of weights in a neural network on a background image在背景图像上绘制神经网络中权重的热图
【发布时间】:2019-01-27 06:18:40
【问题描述】:
我有这个问题要展示给我的原始图像,以便以原始图像在背景中并且分配的权重采用 seaborn 热图形式的方式进行可视化。
示例热图图片:
我找到了一些关于使用混淆矩阵进行可视化的答案,但权重一直是另一回事。
另外我想问一下,是否有可能以这种方式可视化图像,就好像图像是 28x28 一样,3x3 的重量怎么能覆盖它?
【问题讨论】:
标签:
python-3.x
matplotlib
deep-learning
conv-neural-network
seaborn
【解决方案1】:
我假设您的热图来自网络中卷积层的特征图,并且您希望使用 CAM(类激活图)或 grad-CAM(梯度加权类激活图)等技术)。
假设您已将卷积特征图转换为 14x14 numpy 数组的热图,并且您希望将其覆盖在 256x256 像素的图像上。热图包含介于 0 和 1 之间的 float32 数字。想法是首先将 14x14 特征图上采样到 256x256,例如使用 opencv:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('./my-image.png')
# Resize the heatmap
heatmap = cv2.resize(heatmap, (img.shape[0], img.shape[1]))
# Convert dtype to uint8
heatmap = np.uint8(255 * heatmap)
# Overlay the heatmap on the image
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_RAINBOW)
result = cv2.addWeighted(img, 0.6, heatmap, 0.4, 0)
您可以使用 matplotlib 绘制结果:
fig, ax = plt.subplots()
ax.imshow(result)
这是一个纯 matplotlib 解决方案,而不是 seaborn 解决方案。 Seaborn 主要提供 matplotlib 包装器,因此您应该可以从这里获取它。如需完整的 grad-cam 示例(以及此答案的源代码),您可以refer to this blogpost。