卷积神经网络CNN/Pytorch,如何理解特征图Feature map?

不管是在Vision Transformer还是卷积神经网络,其实,一直想明白网络层层,到底是如何对图像进行了处理?怎么,一波操作就出了特征图?怎么就实现了目标检测?人脸识别?深度估计?等等,思前想后,就是常提起的特征图feature map在做小动作?真的不理解?那就来好好理解一下吧?到底是why?为什么?


Visualizing Filters and Feature Maps in Convolutional Neural Networks using PyTorch

学习:在深度学习中处理图像数据,卷积神经网络很引人注目,也在深度学习和计算机视觉方面提供了许多先进的解决方案和基准。那么,卷积神经网络怎么决定图像、如何处理图像?它怎么知道图象是猫?它中间都经历了什么?看到了什么?

只能说,目前,只能部分可解释,或许这就是人工智能的智能,是人脑所难以达到的计算?

  • 那么可解释的部分是什么呢?
  • 特征图之前不得不先说明过滤器?
  • 过滤器和特征图能够有效的帮我们分析了解模型所能看到的内容。

CNN的过滤器是什么?

卷积神经网络中的过滤器,稍微懂一些的人,应该会知道卷积核/Kernels,含义都是过滤器。卷积核常用的是固定大小:3*3、5*5、7*7。当谈论过滤器时,我们更关注的是权重。这些过滤器将确定模型将关注图像的那些像素部分。那么,如何确定模型关注图像的那一部分???

以ResNet-50 卷积神经网络的7*7滤波器为例,确定该特定卷积层将关注输入图像的哪些像素值。

CNN的特征图是什么?

当图像像素值经过过滤器后得到的东西就是特征图,也就是说,在卷积层上看到的:图像经过卷积核后的内容,这一操作也就是所谓的卷积操作。

不妨用上述的7*7的过滤器/卷积核,对图像卷积操作一下,也就是过滤器过一下,得到:

不难发现,经过过滤器的图像——就是特征图啦,可以说是只有黑白?有的部分很暗,有的部分很亮,为什么呢??因为7*7的滤波器有的部分是暗的,有的部分是亮的。当然,滤波器不是简单的叠加上去,第三排也可以看出,简单叠加并不会得到卷积后的图像。因为,卷积是有自己的一套卷积方式的!

具体可学习:深度学习基础笔记——卷积神经网络概念及其计算方式__卷积神经网络计算公式

如何可视化卷积神经网络中的过滤器和特征图?

如果我想详细的看到卷积得到的特征图,那就是可视化观察啦!——Pytorch深度学习库

 过滤器图像中,可以看到一些斑块是暗的,而其他斑块是亮的。

  • 像素值的范围从 0 到 255。
  • 0 对应于全黑,255 对应于白色。这意味着暗色块的权重低于亮色块
  • 当输入图像发生仿射变换时,白块将更负责激活图像的该部分。
  • 当对权重与像素值进行元素乘积时,模型将更多地关注权重值更多的图像区域

特征图:可以看到不同的过滤器在创建图像的特征图时关注不同的方面。

  • 一些特征图专注于图像的背景。
  • 一些特征图专注于图像的轮廓。
  • 一些过滤器会专注于背景较暗但猫的图像较亮的特征图。
  • 这是由于过滤器的相应权重。
  • 从上图中可以清楚地看出,在深层,神经网络可以看到输入图像的非常详细的特征图。

20层特征图:

40层特征图:

 

44层特征图:

 

48层特征图:

随着图像在各个层中前进,图像中的细节会慢慢消失。它们看起来像噪音,但在这些特征图中肯定有一种人眼无法检测到的模式,但神经网络可以。(所以难以解释清楚网络有时在干啥)

当图像到达最后一个卷积层(第 48 层)时,人类不可能分辨出里面有一只猫。这些最后一层输出对于在卷积神经网络中基本上形成分类层的完全连接的神经元非常重要。


理解卷积神经网络CNN中的特征图 feature map__卷积特征图

学习: 理论一点的参考?

Feature map的含义:

在每个卷积层,数据都是以三维形式存在,可以看作许多个二维图像叠在一起,每一层称为feature map。

  • Feature = 二维图像*N = W*H*C=长*宽*通道
    • 灰度图像:1通道,一个feature map
    • 彩色图像:3通道RGB,三个feature map

层与层之间会有若干个卷积核(kernel),设依次A层B层C层:

  • A层的feature map 1依次进行卷积操作,都会产生feature map 2,即为B层feature map;
  • feature map:该层卷积核的个数=产生的feature map个数(同上述);
  • 假如一种滤波器,也就是一种卷积核就是提出图像的一种特征,例如某个方向的边缘。那么需要提取不同的特征时,只需要加多几种滤波器。
  • 随着网络的加深,feature map的长宽尺寸缩小,本卷积层的每个map提取的特征越具有代表性(精华部分)。

卷积网络在学习过程中保持了图像的空间结构,也就是说最后一层的激活值(feature map)总和原始图像具有空间上的对应关系,具体对应的位置以及大小,可以用感受野来度量。

1 前向计算

  • 直接可视化网络每层的 feature map,然后观察feature map 的数值变化。
  • 一个训练成功的CNN网络,其feature map 的值伴随网络深度的增加,会越来越稀疏。
  • 这可以理解网络取精去燥。

2 反向计算

  • 根据网络最后一层最强的激活值,利用感受野求出原始输入图像的区域。
  • 观察输入图像的哪些区域激活了网络,利用这个思路可以做一些物体定位。

卷积网络的核心思想是将:

  • 局部感受野
  • 权值共享(或者权值复制)
  • 时间或空间亚采样

这三种结构思想结合起来获得了某种程度的位移、尺度、形变不变性。

嘿,我是小赵,多多关照!

如果好,留个赞哇,助力每一个梦想!

  • 67
    点赞
  • 194
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
PyTorch 中,我们可以通过提取卷积神经网络 (CNN) 中每一层的特征,来可视化模型的学习过程,了解模型在输入像上的响应情况。下面是一个简单的实现步骤: 1. 加载训练好的 CNN 模型,并将其设置为 eval 模式。 ```python import torch import torch.nn as nn import torchvision.models as models # 加载预训练模型 model = models.vgg16(pretrained=True) # 设置为 eval 模式 model.eval() ``` 2. 选择需要可视化的 CNN 层,并定义一个函数,用于提取该层特征。 ```python # 选择需要可视化的层 layer = model.features[10] # 定义函数,用于提取特定层的输出 def get_feature_map(model, layer, input): # 创建一个新的网络,只包含指定层之前的部分 new_model = nn.Sequential(*list(model.children())[:layer+1]) # 提取指定层的输出 output = new_model(input) return output ``` 3. 加载一张片,并将其输入模型,提取指定层的特征。 ```python from PIL import Image import torchvision.transforms as transforms # 加载片 image = Image.open('image.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 = preprocess(image).unsqueeze(0) # 提取指定层的特征 feature_map = get_feature_map(model, 10, input) ``` 4. 将特征可视化,可以通过 matplotlib 库实现。 ```python import matplotlib.pyplot as plt # 将特征转换为 numpy 数组 feature_map = feature_map.data.numpy() # 可视化特征 plt.imshow(feature_map[0, 0], cmap='gray') plt.show() ``` 以上就是一个简单的 CNN 特征可视化的实现步骤。通过可视化特征,我们可以更好地理解 CNN 模型的学习过程,以及模型对输入像的响应情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值