Pytorch之经典神经网络CNN(Extra-1) —— CNN可视化(查看中间层feature_map)

2023-05-16

从ZF-Net开始人们就在研究神经网络和filter的可视化

结合了多篇文章整理了好久,网上写的真的鱼龙混杂,代码具有可操作性的不多.......也或者是我的coding水平还没到?sad.

CNN可视化各层输出的feature map

(5条消息) Pytorch(十四) —— 查看中间层feature_map & 卷积核权重可视化_hxxjxw的博客-CSDN博客

一样

import os
import torch
import torchvision as tv
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim
import argparse
import skimage.data
import skimage.io
import skimage.transform
import numpy as np
import matplotlib.pyplot as plt
import torchvision.models as models
from PIL import Image
import cv2

#提取某一层网络特征图
class FeatureExtractor(nn.Module):
    def __init__(self, submodule, extracted_layers):
        super(FeatureExtractor, self).__init__()
        self.submodule = submodule
        self.extracted_layers = extracted_layers

    def forward(self, x):
        outputs = {}
        for name, module in self.submodule._modules.items():
            if "fc" in name:
                x = x.view(x.size(0), -1)
            x = module(x)
            print(name)
            if (self.extracted_layers is None) or (name in self.extracted_layers and 'fc' not in name):
                outputs[name] = x
        # print(outputs)
        return outputs


def get_picture(pic_name, transform):
    img = skimage.io.imread(pic_name)
    img = skimage.transform.resize(img, (256, 256)) #读入图片时将图片resize成(256,256)的
    img = np.asarray(img, dtype=np.float32)
    return transform(img)


def make_dirs(path):
    if os.path.exists(path) is False:
        os.makedirs(path)

pic_dir = 'dataset/dogsvscats/train/cat.1700.jpg'
transform = transforms.ToTensor()
img = get_picture(pic_dir, transform)
# 插入维度
img = img.unsqueeze(0)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
img = img.to(device)

net = models.resnet101(pretrained=True).to(device)

dst = './feautures'
therd_size = 256

myexactor = FeatureExtractor(submodule=net, extracted_layers=None)
output = myexactor(img)
#output是dict
#dict_keys(['conv1', 'bn1', 'relu', 'maxpool', 'layer1', 'layer2', 'layer3', 'layer4', 'avgpool', 'fc'])

for idx,val in enumerate(output.items()):
    k,v = val
    features = v[0]
    iter_range = features.shape[0]
    for i in range(iter_range):
        # plt.imshow(features.data.cpu().numpy()[i,:,:],cmap='jet')
        if 'fc' in k:  #不可视化fc层
            continue

        feature = features.data.cpu().numpy()
        feature_img = feature[i, :, :]
        feature_img = np.asarray(feature_img * 255, dtype=np.uint8)

        dst_path = os.path.join(dst, str(idx)+'-'+k)

        make_dirs(dst_path)
        feature_img = cv2.applyColorMap(feature_img, cv2.COLORMAP_JET)
        if feature_img.shape[0] < therd_size:
            tmp_file = os.path.join(dst_path, str(i) + '_' + str(therd_size) + '.png')
            tmp_img = feature_img.copy()
            tmp_img = cv2.resize(tmp_img, (therd_size, therd_size), interpolation=cv2.INTER_NEAREST)
            cv2.imwrite(tmp_file, tmp_img)

        dst_file = os.path.join(dst_path, str(i) + '.png')
        cv2.imwrite(dst_file, feature_img)

得到的feature_img是0-255范围的

输入的原图是kaggle的猫狗数据集中的一张图片

依次提取的各层

conv1
bn1
relu
maxpool
layer1
layer2
layer3
layer4
avgpool
fc

输出

因为到后期的图片会越来越小,所以我们有一个缩放操作,每张图片有一个输出的原图,还有一个放大后的图片

0-conv1

1-bn1

2-relu

3-maxpool

4-layer1

5-layer2

6-layer3

7-layer4

8-avgpool

可以看出,第一层的卷积层输出,特征图里面还可以看出猫的形状,到了后面卷积网络的输出特征图,看着有点像热力图,并且完全没有猫的样子,是更加抽象的图片表达

CNN 卷积核权重可视化

我们一个conv层,比如有64个filter,每个filter又是个三维的,要扫过R,G,B通道,这里可视化的时候只选择了每个filter的第一个channel来显示

当打平画直方图,就是它了(5条消息) Pytorch(十四) —— 查看中间层feature_map & 卷积核权重可视化_hxxjxw的博客-CSDN博客

import torch
import torchvision.models as models
import matplotlib.pyplot as plt
from PIL import Image
from torchvision import transforms

input_image = Image.open('dataset/dogsvscats/train/cat.1700.jpg')
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model


model = models.alexnet(pretrained=True)
if torch.cuda.is_available():
    input_batch = input_batch.to('cuda')
    model.to('cuda')
with torch.no_grad():
    output = model(input_batch)

#卷积可视化
#将数据灌入模型后,pytorch框架会进行对应的前向传播,要对卷积核可视化,我们需要把卷积核从框架中提取出来。多谢torch提供的接口,我们可以直接把对应层的权重取出
for layer in dict(model.features.named_children()).keys():
    if layer not in ['0','3','6','8','10']: #只有conv层可以可视化,maxpooling层和relu层不能可视化
        continue
    filter = dict(model.features.named_children())[layer]
    filter = filter.weight.cpu().clone()
    print("total of number of filter : ", len(filter))
    num = len(filter)
    plt.figure(figsize=(20, 17))
    for i in range(1,64):
        plt.subplot(9, 9, i)
        plt.axis('off')
        plt.imshow(filter[i][0, :, :].detach(),cmap='gray')
    plt.show()

conv1

conv2

conv3

conv4

conv5

可以看出第一层卷积核 人类还是可以比较容易理解,有些提取的是边缘,有些提取的是圆形,有些提取的是斑点等。

最后一层卷积层的卷积核就已经看不出来是提取的什么东西了,即卷积核提取的是更加抽象的特征。

https://nbviewer.jupyter.org/github/fchollet/deep-learning-with-python-notebooks/blob/master/5.4-visualizing-what-convnets-learn.ipynb

使用pytorch查看中间层特征矩阵以及卷积核参数_越前浩波的博客-CSDN博客_pytorch卷积核参数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytorch之经典神经网络CNN(Extra-1) —— CNN可视化(查看中间层feature_map) 的相关文章

  • 【技巧】十大深度学习技巧和经验总结

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • VS中报错IntelliSense: argument of type "void *" is incompatible with parameter of type "const char *"

    在用VS编写C 43 43 程序的时候 xff0c 遇到这样的问题IntelliSense argument of type void is incompatible with parameter of type const char xf
  • VS控制台程序被暂停,回车继续运行

    最近用vs调试程序时 用控制台定时1s打印一次信息 xff0c 调试过程发现偶尔出现控制台停止打印 不管是否开启多线程 xff0c 都会出现该问题 xff0c 而且也怀疑可能是sleep xff08 xff09 延时阻塞导致的问题 后来多次
  • VS如何设置显示代码行数

    设置VS显示代码行数 可以方便调试代码 xff0c 工具 选项 文本编辑器 C C 43 常规 行号勾选上 参考了https jingyan baidu com album af9f5a2d2e193543140a4533 html pic
  • 程序员自我介绍

    转自https www cnblogs com univeryinli p 5838781 html 一个常规的面试 xff0c 寒暄之后面试官提出的第一个问题几乎千篇一律 xff1a 请您简单地做一下自我介绍 有些被面试者都会问 xff1
  • win10磁盘占用率过高解决办法

    最近总觉得系统用起来很卡 xff0c 一看任务管理器发现win10磁盘占用率接近100 xff0c 而且在任务管理器中也关不掉 xff0c 然后百度了一下 xff0c 发现可能是家庭组导致 xff0c 结果还真是 xff0c 下面给出解决方
  • 2020届华为C++软件开发实习面试经验

    前几天去华为实习面试 xff08 虽然笔试0AC xff0c 还是收到面试通知 xff09 xff0c 现在记录一下面试心得 xff0c 后面继续好好准备 实习面试分技术面和综合面 xff1a 1 感觉技术面试重视基础 xff0c 问c 4
  • 自己编写的字符串分割函数mysplit()

    利用strtok 函数封装成的字符串分割函数mysplit sourceStr为源字符串 splitSymbol为分隔符号 strArray为分割后的字符串 xff0c 以vector形式返回 include lt iostream gt
  • OVS Bond lacp源码分析

    近期项目中要使用Ovs bond接口 xff0c Ovs Bond 只有三种模式 xff1a balance tcp xff0c balance slb xff0c active backup 这三种模式的工作方式如下 xff1a 1 ac
  • VNC

    VNC Virtual Network Computing 是 虚拟网络 计算机的缩写 VNC 是一款优秀的 远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Linux 操作
  • ubuntu 安装图形界面 tasksel不成功

    1 执行tasksel相关的安装命令一直报错 xff0c 经过改源等操作都不行 sudo tasksel install ubuntu desktop 2 参考下面的博客Ubuntu安装图形界面 xff08 桌面 xff09 yangxin
  • 【ChatGPT】比尔·盖茨最新分享:ChatGPT的发展,不止于此

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • 51单片机(十).避障与循迹小车

    实验简介 使用STC89C53单片机作为主控制器芯片实现了带全向轮的两轮驱动避障以及循线小车 xff0c 感知模块为超声波和红外传感器 本实验分为3个独立的部分 xff1a 1 利用超声波实现小车的避障功能 xff1b 2 利用红外传感器实
  • 一点小小的感悟

    从2017年发表了第一篇CSDN文章 xff0c 到现在已经过去了快五年的时间 五年前的我是一名学生 xff0c 五年后的今天我依旧是一名学生 xff0c 区别是从一名大二学生成为了现在的研二学生 这一路走来 xff0c 经历了很多很多事情
  • Arduino单片机(五).基于OpenWrt模块的无线视频遥控小车设计

    1 功能介绍 本项目所设计的机器人需要实现的功能为 xff1a 操作员在操作终端 xff08 手机或PC端 xff09 通过Wi Fi连接到小车上Wi Fi模块所在的网络中 xff0c 向其发出相关操作指令 xff0c 在Wi Fi模块接收
  • STM32单片机(二).STM32系列单片机的介绍

    STM32系列芯片是为要求高性能 低成本 低功耗的嵌入式应用设计的ARM Cortex M0 M0 43 M3 M4和M7内核 xff0c 按照内核架构分成不同的产品 其主流的产品有STM32F0 STM32F1和STM32F3 xff1b
  • STM32单片机(六). 传感器的使用

    传感器是单片机外围电路中最常见的模块 xff0c 在搭配了各种形式的传感器电路后 xff0c 就可以采集到的更多的环境信息 在本章节中 xff0c 主要介绍呼吸灯 温度传感器 RTC实时时钟以及红外遥控模块的控制使用 1 PWM实现呼吸灯的
  • STM32单片机(七). USART串口、IIC和CAN通信

    在简单的学习过了STM32中的简单外设以及中断系统后 xff0c 在本章节中开始介绍STM32芯片中各个通信接口的配置 在计算机中 xff0c 按数据传输方式可分为串行通信以及并行通信 xff1b 按数据同步方式可分为异步通信和同步通信 x
  • STM32单片机(八). ADC、DAC和DMA数据传输

    对于STM32的ADC模数转换器的介绍以及配置在文章 STM32单片机 xff08 六 xff09 传感器的使用 中已经详细介绍 xff0c 在本章节中主要介绍DAC数模转换器以及DMA的使用 1 DAC转换 1 1 数模转换器的介绍 DA
  • 虚拟机中安装Ubuntu 20.04,Liunx系统的常用命令以及工具安装

    因工作学习 需求 xff0c 在虚拟机软件VirtualBox安装了Ubuntu 20 04系统 xff0c 本章节中主要介绍一些环境的安装以及Liunx中常用的一些命令 1 软件和系统的安装 1 1 VirtualBox VirtualB

随机推荐