CNNs:ZFNet之基于AlexNet特征可视化实验分析

这篇具有很好参考价值的文章主要介绍了CNNs:ZFNet之基于AlexNet特征可视化实验分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导言

上一篇我们介绍了如何利用Deconvnet网络进行特征可视化操作,本篇我们将基于Deconvnet对文献中的相关实验进行分析,并验证一些结论。除此之外,我们还将针对实验现象对对AlexNet网络进行微调(ZFNet),并对网络进行简单介绍。然后基于ZFNet进行实验分析。

基于AlexNet网络的实验分析

实验一:不同卷积层特征提取分析

实验条件:

  • 模型数据集:ImageNet 2010 training set(1.0 million images, spread over 1000 different classes)
  • 模型AlexNet
  • 下图中,在2-5层是在验证数据集中的特征图中抽取前9个最大激活所对应的图片和喂到Deconvnet中得到的像素空间的特征。

CNNs:ZFNet之基于AlexNet特征可视化实验分析
第一层卷积:是极高和极低的频率信息的混合,几乎不覆盖中频(边缘信息+颜色信息)
CNNs:ZFNet之基于AlexNet特征可视化实验分析

CNNs:ZFNet之基于AlexNet特征可视化实验分析

第二层卷积:比第一层卷积提取出来的信息更加抽象,但仍主要是由边缘信息和颜色信息组成。

随着层数的增加,提取出来的特征越来越偏向“语义特征”。
CNNs:ZFNet之基于AlexNet特征可视化实验分析
CNNs:ZFNet之基于AlexNet特征可视化实验分析

第五层中右上角的一组图像中,看似几乎没有共同特征,但网络却学习到了背景草地的特征。

实验二:不同卷积层提取特征收敛分析

  • 基于AlexNet

在训练过程中特征演。下图中,展示了给定特征图的最强激活投影到像素空间中的特征。注意:色彩对比度认为的增强了,为了突出显示特征
CNNs:ZFNet之基于AlexNet特征可视化实验分析
可以从上图中发现,随着层数的增加,卷积层提取的特征更加偏向语义特征,且提取出来的语义特征需要更大的epoch才能提取出来;模型的底层网络在epoch很小便可以收敛。

下图为基于AlexNet网络在第一层卷积层核第二层卷积层提取特征后进行特征可视化的结果。可以从图(a)中看到实验中出现了无明显特征的特征图,在图(b)中可以看到明显的混乱网格的现象。其中“混乱网格”的出现是由于在使用卷积核对上一输入进行卷积时,步长过大造成的。所以针对此实验现象,文章提出了基于AlexNet的改进网络ZFNet
CNNs:ZFNet之基于AlexNet特征可视化实验分析

ZFNet网络介绍

CNNs:ZFNet之基于AlexNet特征可视化实验分析
针对AlexNet的实验现象,文章针对ImageNet数据集对AlexNet进行了微调,可以有效解决混乱网格和dead特征。

首先,让我们先看一下ZFNet的网络结构:

import torch
import torch.nn as nn
from collections import OrderedDict
from torchsummary import summary

class ZFNet(nn.Module):
    def __init__(self, class_num = 5):
        super(ZFNet, self).__init__()
        self.features = nn.Sequential(
            # input[3, 224, 224]  output[96, 110, 110]
            nn.Conv2d(3, 96, kernel_size=7, stride=2, padding=1),
            nn.ReLU(inplace=True),
            # output[96, 55, 55]
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1, return_indices=True),

            # output[256, 26, 26]
            nn.Conv2d(96, 256, kernel_size=5, stride=2),
            nn.ReLU(inplace=True),
            # output[256, 13, 13]
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1, return_indices=True),

            # output[384, 13, 13]
            nn.Conv2d(256, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # output[384, 13, 13]
            nn.Conv2d(384, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # output[256, 13, 13]
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # output[256, 6, 6]
            nn.MaxPool2d(kernel_size=3, stride=2, return_indices=True),
        )

        self.classifier = nn.Sequential(
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, class_num),
        )

        # index of conv
        self.conv_layer_indices = [0, 3, 6, 8, 10]

        # feature maps
        self.feature_maps = OrderedDict()
        # switch
        self.pool_locs = OrderedDict()

    def forward(self, x):
        for idx, layer in enumerate(self.features):
            if isinstance(layer, nn.MaxPool2d):
                x, location = layer(x)
                self.pool_locs[idx] = location
                self.feature_maps[idx] = x
            else:
                x = layer(x)
                self.feature_maps[idx] = x
        
        x = torch.flatten(x, start_dim=1)
        x = self.classifier(x)
        return x


if __name__ == "__main__":
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = ZFNet().to(device)
    summary(model, (3, 224, 224))

本节对网络细节不再展开叙述,其网络结构与AlexNet基本一致,仅仅修改了一些卷积参数,具体网络分析,请参考AlexNet网络介绍。这里我们使用torchsummary对网络参数和结构进行打印。

==========================================================================================
Layer (type:depth-idx)                   Output Shape              Param #
==========================================================================================
├─Sequential: 1                          []                        --
|    └─Conv2d: 2-1                       [-1, 96, 110, 110]        14,208
|    └─ReLU: 2-2                         [-1, 96, 110, 110]        --
|    └─MaxPool2d: 2-3                    [-1, 96, 55, 55]          --
|    └─Conv2d: 2-4                       [-1, 256, 26, 26]         614,656
|    └─ReLU: 2-5                         [-1, 256, 26, 26]         --
|    └─MaxPool2d: 2-6                    [-1, 256, 13, 13]         --
|    └─Conv2d: 2-7                       [-1, 384, 13, 13]         885,120
|    └─ReLU: 2-8                         [-1, 384, 13, 13]         --
|    └─Conv2d: 2-9                       [-1, 384, 13, 13]         1,327,488
|    └─ReLU: 2-10                        [-1, 384, 13, 13]         --
|    └─Conv2d: 2-11                      [-1, 256, 13, 13]         884,992
|    └─ReLU: 2-12                        [-1, 256, 13, 13]         --
|    └─MaxPool2d: 2-13                   [-1, 256, 6, 6]           --
├─Sequential: 1-1                        [-1, 5]                   --
|    └─Linear: 2-14                      [-1, 4096]                37,752,832
|    └─ReLU: 2-15                        [-1, 4096]                --
|    └─Dropout: 2-16                     [-1, 4096]                --
|    └─Linear: 2-17                      [-1, 4096]                16,781,312
|    └─ReLU: 2-18                        [-1, 4096]                --
|    └─Linear: 2-19                      [-1, 5]                   20,485
==========================================================================================      
Total params: 58,281,093
Trainable params: 58,281,093
Non-trainable params: 0
Total mult-adds (G): 1.22
==========================================================================================      
Input size (MB): 0.57
Forward/backward pass size (MB): 11.57
Params size (MB): 222.32
Estimated Total Size (MB): 234.46
==========================================================================================

基于ZFNet网络的实验分析

实验三:针对AlexNet特征提取改善可视化

将网络修改完后,仍然对同一数据集进行最大激活的特征可视化。可以看到ZFNet可以有效的改善dead特征和混乱网格特征。
CNNs:ZFNet之基于AlexNet特征可视化实验分析
CNNs:ZFNet之基于AlexNet特征可视化实验分析

实验四:特征不变性实验分析

文章中通过对割草机、西施犬、非洲鳄鱼、鹦鹉和娱乐中心进行平移、缩放和旋转分别对第一层卷积层和第七层对原始图像的特征向量计算欧式距离以及显示变换后网络对正确类别对应的概率。

CNNs:ZFNet之基于AlexNet特征可视化实验分析
结论:

  • a2、b2、c2表明第一层卷积层稍微对图像做物理上的修改,修改后的feature map和原始的feature map之间的欧式距离会急剧增大。
  • 竖直平移和缩放导致变化后的feature map与原始的feature map 之间的欧式距离变化呈线性且变化很小而非急剧变化,旋转变换的欧式距离变换也十分小,说明以上的变化对网络深层影响很小(网络越深,越倾向提取语义信息)

实验五:局部遮挡敏感性分析

通过对不同的狗的同一部位进行遮挡,以及随机遮挡分析网络对识别准确率的影响。由表所示,对不同的的狗遮挡同一部位,其激活在第五层和第七层的相对变化较小,而随机遮挡的激活变化会增大。
CNNs:ZFNet之基于AlexNet特征可视化实验分析
这揭示了网络使用并非使用的关键局部信息进行分类,而是使用了周围的信息进行分类。

实验六:局部相关性分析

本实验通过对同一物体的不同部位进行遮挡实验,以分析局部信息对物体识别的影响。

下图中:

  • 第一列是原图遮挡示意图
  • 第二列是灰色方块在不同位置遮挡生成的feature map叠加求和结果(强度图)
  • 第三列是不经遮挡的原图喂到网络,找到第五层激活最大的feature map,将其用反卷积的方法重构到原始像素空间
  • 第四列是遮挡不同不问,识别出来正确类别的概率
  • 第五列是遮挡不同部位,识别出来的列别
    CNNs:ZFNet之基于AlexNet特征可视化实验分析
    通过第三列我们可以看到,当我们遮挡住了物体主要特征部分,如狗的脸,车的轮胎以及狗本身时,识别出来的正确的概率会大大降低。

当然,这里有一些问题:

  • 为什么在原图中遮挡了左上角,在feature map中左上角能体现出来?
    在卷积神经网络中,feature map保留了部分spatial信息

  • 为什么在第五层网络提取出来脸,但是网络最后提取的ground truth是阿富汗猎犬?
    网络不仅仅使用激活最大的feature map,它是综合了所有的feature map文章来源地址https://www.toymoban.com/news/detail-470590.html

到了这里,关于CNNs:ZFNet之基于AlexNet特征可视化实验分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多模型图像特征可视化

            特征图可视化是指将网络中某一层的特征图可视化出来,以便观察网络在不同层次上学到的特征。卷积可视化可以帮助深度学习研究者更好地理解卷积的概念和原理,从而更好地设计和优化卷积神经网络。通过可视化,研究者可以更清晰地看到卷积运算中的每一个

    2024年01月17日
    浏览(37)
  • 可视化CNN和特征图

    卷积神经网络(cnn)是一种神经网络,通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图,它是通过对图像应用卷积滤波器生成的输入图像的表示。 1、卷积操作 卷积的概念是CNN操作的核心。卷积是一种数学运算,它把两个函数结合起来产生第三

    2023年04月10日
    浏览(51)
  • 【Pytorch】 特征图的可视化

    Pytroch中间层的特征图可视化,网上已经有很多教程,比如用hook钩子函数,但是代码都写得不是很清楚,所以还是自己去摸索一下。 目前这种方法有很大的缺陷,最近看一篇国外的blog时,发现了Pytorch官方文档有一个Torch FX,基于这个实现了特征提取,更新一下Pytorch官方实现

    2023年04月18日
    浏览(91)
  • pytorch对中间特征层可视化方案

    本文主要介绍如何使用pytorch获得已经训练好的网络的中间特征层,并将其转化为热力图的简单方法 效果图 1、在原本的test代码上进行修改 2、随便写一个钩子函数(具体了解可以搜索“pytorch中的钩子(Hook)有何作用?”) 3、然后注册一下钩子函数(在你需要保存的卷积层进行

    2024年02月13日
    浏览(64)
  • # Pytorch 深度卷积模型的特征可视化

    可视化模型的特征层需要打印各层的名称: 安装torchsummary包 打印各层名称

    2024年02月16日
    浏览(43)
  • 网络特征之PCA可视化-Python实现

    PCA也是对网络特征可视化的一种方法,目的是对特征进行降维,然后通过图片的形式来对网络的特征提供一种解释。 所以,本博客提供一个将网络特征进行PCA的可视化的代码,其原理为将C通道的特征降维到3通道,即图片的RGB通道,然后直接进行可视化。 关于PCA和t-SNE的差异

    2023年04月08日
    浏览(54)
  • 3DSC特征描述符、对应关系可视化以及ICP配准

    pcl::NormalEstimationOMPpcl::PointXYZ, pcl::Normal n; : pcl::NormalEstimationOMP  是一个用于估计点云法线的类,它利用了 OpenMP 进行多线程加速。 pcl::PointXYZ, pcl::Normal  指定输入点云类型为  pcl::PointXYZ ,输出法线类型为  pcl::Normal 。 pcl::PointCloudpcl::Normal::Ptr normals(new pcl::PointCloudpcl::Normal);

    2024年02月19日
    浏览(37)
  • pytorch中使用TensorBoard进行可视化Loss及特征图

    安装TensorBoard 导入TensorBoard 实例化TensorBoard 训练过程中的loss,accuracy等都是标量,都可以用TensorBoard中的add_scalar来显示,add_scalar方法中第一个参数表示表的名字,第二个参数表示的是你要存的值,第三个参数可以理解为x轴坐标。 终端输入tensorboard --logdir=logs,开启TensorBoard

    2023年04月12日
    浏览(59)
  • python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

    特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串,将字符串转换为机器可以读懂的数字特征,才能让计算机理解该字符串(特征)表达的意义。 主要分为:字典特征提取(特征离散化)、文本特征提取(文章中特征词汇出现的频次)。 字典特

    2024年02月14日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包