1. 磐创AI-开放猫官方网站首页
  2. Medium

使用PyTorch可视化要素地图

“什么是功能地图?”

要素地图只不过是输出,我们将一组过滤器应用到前一层后得到,然后将这些要素地图传递给下一层。每一层都应用一些过滤器并生成功能地图。滤镜能够提取边缘、纹理、图案、对象部分等信息。

“为什么我们需要可视化功能地图?”

深度学习对很多事情都有好处,比如当我们的传统方法失败时,深度学习可能会有所帮助,深度学习可以很容易地适应新的场景,你能想象尝试手工制定“自动驾驶汽车”应该如何工作的规则吗?不正确,但深度学习可以从大量数据中发现洞察力,并找出“自动驾驶汽车”应该如何工作的规则。

尽管有了深度学习的巨大力量,但通过深度学习模型学习的模式通常是人类无法解释的。我们不知道我的模型是如何预测这个目标的,如果我的模型预测了错误的目标怎么办。所以我想找出我的模型关注的是哪些功能,或者我的模型应用了哪些过滤器。

现在来看图片中的“特征映射”,特征映射帮助我们更好地理解深层神经网络。

“我们如何才能将要素地图可视化?”

先决条件:–读者应该对卷积神经网络有基本的了解。-我们使用的是PyTorch框架。PyTorch是一个基于Torch库的开源机器学习库,用于计算机视觉和自然语言处理等应用,主要由Facebook的AI研究实验室开发。它是免费的开源软件。

导入所有需要的库

import torch
import torch.nn as nn
import torchvision
from torchvision import models, transforms, utils
from torch.autograd import Variable
import numpy as np
import matplotlib.pyplot as plt
import scipy.misc
from PIL import Image
import json
%matplotlib inline

定义图像转换

  • 在将图像传递给模型之前,我们要确保输入图像的大小相同
  • CNN处理的是唯一的张量,所以我们必须将输入图像转换成某个张量。
  • 一个不错的做法是在将数据集传递给模型之前对其进行标准化。

transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=0., std=1.)
])

加载图像

image = Image.open(str('dog.jpg'))
plt.imshow(image)


负载模型

这里我们使用的是在ImageNet数据集上预训练的Resnet18模型,下载和加载预训练的resnet18模型只需pytorch中的一行代码。您还可以编写自己的自定义RESNET体系结构模型。在这里,我们使用的是预先训练好的。

model = models.resnet18(pretrained=True)
print(model)

正如您在上面的RESNET架构中看到的,我们有一系列的Conv2d、BatchNorm2d和RELU层。但我只想检查Conv2d之后的功能地图,因为这是实际应用过滤器的层。因此,让我们提取Conv2d层并将其存储到列表中,同时提取相应的权重并将其存储在列表中。

# we will save the conv layer weights in this list
model_weights =[]
#we will save the 49 conv layers in this list
conv_layers = []

检查GPU

device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)
model = model.to(device)

对图像应用变换,添加批处理大小,然后加载到GPU上

image = transform(image)
print(f"Image shape before: {image.shape}")
image = image.unsqueeze(0)
print(f"Image shape after: {image.shape}")
image = image.to(device)

生成要素地图

将图像处理到每个图层,并将输出和图层名称追加到Output[]和Names[]列表

outputs = []
names = []
for layer in conv_layers[0:]:
image = layer(image)
outputs.append(image)
names.append(str(layer))
print(len(outputs))

现在将3D张量转换为2D,对每个通道的相同元素求和

processed = []
for feature_map in outputs:
feature_map = feature_map.squeeze(0)
gray_scale = torch.sum(feature_map,0)
gray_scale = gray_scale / feature_map.shape[0]
processed.append(gray_scale.data.cpu().numpy())

绘制要素地图并保存

fig = plt.figure(figsize=(30, 50))
for i in range(len(processed)):
a = fig.add_subplot(5, 4, i+1)
imgplot = plt.imshow(processed[i])
a.axis("off")
a.set_title(names[i].split('(')[0], fontsize=30)
plt.savefig(str('feature_maps.jpg'), bbox_inches='tight')

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/06/29/%e4%bd%bf%e7%94%a8pytorch%e5%8f%af%e8%a7%86%e5%8c%96%e8%a6%81%e7%b4%a0%e5%9c%b0%e5%9b%be/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息