Pytorch从入门到放弃(8)——可视化FeatureMap(特征图)

在Pytorch的实际使用中,有时我们不仅要提取模型的中间层特征,甚至有时我们需要可视化模型的中间层特征,特别是在写论文的过程中,即可以补充一下文章的篇幅,也可以虎一虎外行人,让他觉得好牛逼好高大上啊。下面开始进入主题:

其实很简单,想要哪一层的特征图直接提取那一层的输出即可,并将那一层的特征图可视化即可。首先,我们需要看一下网络都有哪些层,这个我在Pytorch从入门到放弃(3)里面就已经说明了如何查看AlexNet的网络结构,大家可以看一下这篇文章。下面直接上提取AlexNet特征图的代码(这里我提取了AlexNet第一个卷积层输出的特征图):

import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc


# 导入数据
def get_image_info(image_dir):
    # 以RGB格式打开图像
    # Pytorch DataLoader就是使用PIL所读取的图像格式
    # 建议就用这种方法读取图像,当读入灰度图像时convert('')
    image_info = Image.open(image_dir).convert('RGB')
    # 数据预处理方法
    image_transform = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    image_info = image_transform(image_info)
    image_info = image_info.unsqueeze(0)
    return image_info

# 获取第k层的特征图
def get_k_layer_feature_map(feature_extractor, k, x):
    with torch.no_grad():
        for index,layer in enumerate(feature_extractor):
            x = layer(x)
            if k == index:
                return x

#  可视化特征图
def show_feature_map(feature_map):
    feature_map = feature_map.squeeze(0)
    feature_map = feature_map.cpu().numpy()
    feature_map_num = feature_map.shape[0]
    row_num = np.ceil(np.sqrt(feature_map_num))
    plt.figure()
    for index in range(1, feature_map_num+1):
        plt.subplot(row_num, row_num, index)
        plt.imshow(feature_map[index-1], cmap='gray')
        plt.axis('off')
        scipy.misc.imsave(str(index)+".png", feature_map[index-1])
    plt.show()




if __name__ ==  '__main__':
    # 初始化图像的路径
    image_dir = r"husky.png"
    # 定义提取第几层的feature map
    k = 1
    # 导入Pytorch封装的AlexNet网络模型
    model = models.alexnet(pretrained=True)
    # 是否使用gpu运算
    use_gpu = torch.cuda.is_available()
    use_gpu =False
    # 读取图像信息
    image_info = get_image_info(image_dir)
    # 判断是否使用gpu
    if use_gpu:
        model = model.cuda()
        image_info = image_info.cuda()
    # alexnet只有features部分有特征图
    # classifier部分的feature map是向量
    feature_extractor = model.features
    feature_map = get_k_layer_feature_map(feature_extractor, k, image_info)
    show_feature_map(feature_map)

原图:

Pytorch从入门到放弃(8)——可视化FeatureMap(特征图)_第1张图片

第一个卷积层输出的特征图可视化结果:

Pytorch从入门到放弃(8)——可视化FeatureMap(特征图)_第2张图片

以上是个人在闲暇时的一个随笔,理解可能有误,恳请各位大神批评指正。

完整代码地址:https://github.com/Sun-DongYang/Pytorch.git

你可能感兴趣的:(Pytorch,feature,map可视化,特征图可视化)