使用Pytorch和Matplotlib可视化卷积神经网络的特征(上)

简介: 使用Pytorch和Matplotlib可视化卷积神经网络的特征

在处理图像和图像数据时,CNN是最常用的架构。卷积神经网络已经被证明在深度学习和计算机视觉领域提供了许多最先进的解决方案。没有CNN,图像识别、目标检测、自动驾驶汽车就不可能实现。

640.png

640.png

但当归结到CNN如何看待和识别他们所做的图像时,事情就变得更加棘手了。

  • CNN如何判断一张图片是猫还是狗?
  • 在图像分类问题上,是什么让CNN比其他模型更强大?
  • 他们在图像中看到了什么?

这是我第一次了解CNN时的一些问题。问题会随着你的深入而增加。

那时候我听说过过滤器和特性映射,但不知道它们是什么,它们的作用是什么。后来我知道他们是什么,但不知道他们长什么样子,但现在我知道了。在处理深度卷积网络时,过滤器和特征映射很重要。滤镜是使特征被复制的东西,也是模型看到的东西。

什么是CNN的滤镜和特性映射?

过滤器是使用反向传播算法学习的一组权值。如果你做了很多实际的深度学习编码,你可能知道它们也被称作核。过滤器的尺寸可以是3×3,也可以是5×5,甚至7×7。

过滤器在一个CNN层学习检测抽象概念,如人脸的边界,建筑物的边缘等。通过叠加越来越多的CNN层,我们可以从一个CNN中得到更加抽象和深入的信息。

640.png

特性映射是我们通过图像的像素值进行滤波后得到的结果。这就是模型在图像中看到的这个过程叫做卷积运算。将feature map可视化的原因是为了加深对CNN的了解。

640.png

选择模型

我们将使用ResNet-50神经网络模型来可视化过滤器和特征图。使用ResNet-50模型来可视化过滤器和特征图并不理想。原因是resnet模型总的来说有点复杂。遍历内部卷积层会变得非常困难。但是在本篇文章中您将了解如何访问复杂体系结构的内部卷积层后,您将更加适应使用类似的或更复杂的体系结构。

我使用的图片来自pexels。这是我为了训练我的人脸识别分类器而收集的一幅图像。

640.png

模型结构

乍一看,模型的结构可能令人生畏,但要得到我们想要的东西确实很容易。通过了解如何提取这个模型的层,您将能够提取更复杂模型的层。下面是模型结构。

ResNet(
  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu): ReLU(inplace=True)
  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  (layer1): Sequential(
    (0): Bottleneck(
      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (downsample): Sequential(
        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (1): Bottleneck(
      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
...
(2): Bottleneck(
      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
    )
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
  (fc): Linear(in_features=2048, out_features=1000, bias=True)

提取CNN层

conv_layers = []
model_weights = []
model_children = list(models.resnet50().children())
counter = 0
for i in range(len(model_children)):
     if type(model_children[i]) == nn.Conv2d:
         counter += 1
         model_weights.append(model_children[i].weight)
         conv_layers.append(model_children[i])
     elif type(model_children[i]) == nn.Sequential:
         for j in range(len(model_children[i])):
             for child in model_children[i][j].children():
                 if type(child) == nn.Conv2d:
                     counter += 1
                     model_weights.append(child.weight)
                     conv_layers.append(child)
  1. 首先,在第4行,我们初始化一个计数器变量,以跟踪卷积层的数量。
  2. 从第6行开始,我们将遍历ResNet-50模型的所有层。
  3. 具体来说,我们在三层嵌套中检查卷积层
  4. 第7行,检查模型的直接子层中是否有卷积层。
  5. 然后从第10行开始,我们检查序列块中的瓶颈层是否包含任何卷积层。
  6. 如果上述两个条件中有一个满足,那么我们将该子节点和权值分别附加到conv_layers和model_weights,

上面的代码很简单并且不言自明,但是它仅限于已经存在的模型,比如其他resnet模型resnet-18、34、101、152。对于自定义模型,情况将有所不同,假设在另一个连续层中有一个连续层,如果有一个CNN层,程序将不检查它。这就是我编写的extract .py模块可能有用的地方。

Extractor类

Extractor类可以找到每一个CNN层(除了下采样层),包括它们在任何resnet模型以及几乎在任何自定义resnet和vgg模型中的权重。它不局限于CNN层,它可以找到线性层,如果提到了下采样层的名字,它也可以找到。它还可以提供一些有用的信息,如CNN的数量、模型中的线性层和顺序层。

目录
相关文章
|
6月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
7月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
625 11
|
10月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本内容展示了一种基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测方法。通过 MATLAB2022a 实现,完整程序运行无水印,核心代码附详细中文注释及操作视频。算法利用 PSO 优化 TCN 的超参数(如卷积核大小、层数等),提升非线性时间序列预测性能。TCN 结构包含因果卷积层与残差连接,结合 LSTM 构建混合模型,经多次迭代选择最优超参数,最终实现更准确可靠的预测效果,适用于金融、气象等领域。
|
7月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
194 1
|
7月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
301 0
|
7月前
|
机器学习/深度学习 传感器 数据采集
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
458 0
|
9月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
497 7
|
11月前
|
机器学习/深度学习 PyTorch 算法框架/工具
基于Pytorch 在昇腾上实现GCN图神经网络
本文详细讲解了如何在昇腾平台上使用PyTorch实现图神经网络(GCN)对Cora数据集进行分类训练。内容涵盖GCN背景、模型特点、网络架构剖析及实战分析。GCN通过聚合邻居节点信息实现“卷积”操作,适用于非欧氏结构数据。文章以两层GCN模型为例,结合Cora数据集(2708篇科学出版物,1433个特征,7种类别),展示了从数据加载到模型训练的完整流程。实验在NPU上运行,设置200个epoch,最终测试准确率达0.8040,内存占用约167M。
基于Pytorch 在昇腾上实现GCN图神经网络
|
11月前
|
机器学习/深度学习 搜索推荐 PyTorch
基于昇腾用PyTorch实现CTR模型DIN(Deep interest Netwok)网络
本文详细讲解了如何在昇腾平台上使用PyTorch训练推荐系统中的经典模型DIN(Deep Interest Network)。主要内容包括:DIN网络的创新点与架构剖析、Activation Unit和Attention模块的实现、Amazon-book数据集的介绍与预处理、模型训练过程定义及性能评估。通过实战演示,利用Amazon-book数据集训练DIN模型,最终评估其点击率预测性能。文中还提供了代码示例,帮助读者更好地理解每个步骤的实现细节。
|
11月前
|
机器学习/深度学习 自然语言处理 PyTorch
基于Pytorch Gemotric在昇腾上实现GAT图神经网络
本实验基于昇腾平台,使用PyTorch实现图神经网络GAT(Graph Attention Networks)在Pubmed数据集上的分类任务。内容涵盖GAT网络的创新点分析、图注意力机制原理、多头注意力机制详解以及模型代码实战。实验通过两层GAT网络对Pubmed数据集进行训练,验证模型性能,并展示NPU上的内存使用情况。最终,模型在测试集上达到约36.60%的准确率。

推荐镜像

更多