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

article/2025/10/2 6:18:01

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

  • 导言
  • 基于AlexNet网络的实验分析
    • 实验一:不同卷积层特征提取分析
    • 实验二:不同卷积层提取特征收敛分析
  • ZFNet网络介绍
  • 基于`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中得到的像素空间的特征。

在这里插入图片描述
第一层卷积:是极高和极低的频率信息的混合,几乎不覆盖中频(边缘信息+颜色信息)
在这里插入图片描述

在这里插入图片描述

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

随着层数的增加,提取出来的特征越来越偏向“语义特征”。
在这里插入图片描述
在这里插入图片描述

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

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

  • 基于AlexNet

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

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

ZFNet网络介绍

在这里插入图片描述
针对AlexNet的实验现象,文章针对ImageNet数据集对AlexNet进行了微调,可以有效解决混乱网格和dead特征。

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

import torch
import torch.nn as nn
from collections import OrderedDict
from torchsummary import summaryclass 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 convself.conv_layer_indices = [0, 3, 6, 8, 10]# feature mapsself.feature_maps = OrderedDict()# switchself.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] = locationself.feature_maps[idx] = xelse:x = layer(x)self.feature_maps[idx] = xx = torch.flatten(x, start_dim=1)x = self.classifier(x)return xif __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特征和混乱网格特征。
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
结论:

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

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

通过对不同的狗的同一部位进行遮挡,以及随机遮挡分析网络对识别准确率的影响。由表所示,对不同的的狗遮挡同一部位,其激活在第五层和第七层的相对变化较小,而随机遮挡的激活变化会增大。
在这里插入图片描述
这揭示了网络使用并非使用的关键局部信息进行分类,而是使用了周围的信息进行分类。

实验六:局部相关性分析

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

下图中:

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

当然,这里有一些问题:

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

  • 为什么在第五层网络提取出来脸,但是网络最后提取的ground truth是阿富汗猎犬?
    网络不仅仅使用激活最大的feature map,它是综合了所有的feature map


http://chatgpt.dhexx.cn/article/ykbQYrui.shtml

相关文章

CNN详细学习

前馈神经网络 MLP:multi-layer percetron Feed Forward and Back error propagation解决异或划分问题 缺点: 容易过拟合容易陷入局部最优化梯度消失计算资源不充分,训练集小 DNN 深一点效果好,宽一点容易理解,发现…

CNNs 入门论文汇总

Introduction 本文主要总结了卷积神经网络在机器视觉领域的重要发展及其应用。我们将介绍几篇重要的公开发表的论文,讨论它们为何重要。前一半的论文(AlexNet到ResNet)将主要涉及整体系统架构的发展和演变,后一半论文将主要集中在…

论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED 相关论文阅读分析: 1、EEG-SEED数据集作者的—基线论文阅读和…

Gated-SCNN: Gated Shape CNNs for Semantic Segmentation

目录 作者 一、Model of Gated-SCNN 二、 Gated Shape CNN 1.Regular Stream 2.Shape Stream 3. Gate Conv Layer 4.ASPP 5 总代码 三 损失函数 1.BoundaryBCELoss 2.DualTaskLoss 作者 一、Model of Gated-SCNN 文章使用了双流CNN来处理语义分割中的边界问题,分为R…

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(下)

之前在CSDN上看到这篇文章,觉得通俗易懂,写的非常好。不过近来再次查看,发现文章的照片莫名其妙的没有了,没有图就根本看不懂了。找到了之前关注的微信公众号:AI传送门 。 在里面找到了这篇文章,决定再把这…

CNNs详尽图解

已经成为每一个初入人工智能——特别是图像识别领域的朋友,都渴望探究的秘密。 本文通过“算法可视化”的方法,将卷积神经网络的原理,呈献给大家。教程分为上、下两个部分,通篇长度不超过7000字,没有复杂的数学公式&a…

学习笔记:利用CNNs进行图像分类

1.神经网络图像(CNNs)分类简介 本文将重点关注卷积神经网络,也被称为CNNs或Convnets。CNNs是一种特殊类型的神经网络,特别适合于图像数据。自2012年以来,ImageNet竞赛(ImageNet)一直由CNN架构赢得。 在本文中&#x…

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(上)

之前在CSDN上看到这篇文章,觉得通俗易懂,写的非常好。不过近来再次查看,发现文章的照片莫名其妙的没有了,没有图就根本看不懂了。找到了之前关注的微信公众号:AI传送门 。 在里面找到了这篇文章,决定再把这…

交叉验证

概述Holdout 交叉验证K-Fold 交叉验证Leave-P-Out 交叉验证总结 概述 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。 顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。 用训练集来训练模型&…

交叉验证评估模型性能

在构建一个机器学习模型之后,我们需要对模型的性能进行评估。如果一个模型过于简单,就会导致欠拟合(高偏差)问题,如果模型过于复杂,就会导致过拟合(高方差)问题。为了使模型能够在欠拟合和过拟合之间找到一个折中方案,我们需要对模型进行评估,后面将会介绍holdout交叉…

Python实现:Hold-Out、k折交叉验证、分层k折交叉验证、留一交叉验证

模型在统计中是极其重要的,可以通过模型来描述数据集的内在关系,了解数据的内在关系有助于对未来进行预测。一个模型可以通过设置不同的参数来描述不同的数据集,有的参数需要根据数据集估计,有的参数需要人为设定(超参…

深度理解hold-out Method(留出法)和K-fold Cross-Validation(k折交叉验证法)

模型评估(Model Evaluation) 1.测试集(testing set) 测试集(testing set): 通常,我们可通过实验测验来对学习器的泛化误差进行评估并进而做出选择,为此,需要一个“测试集”来测试学习器对新样本的判别能力。然后以测试集上的“测…

cross-validation:从 holdout validation 到 k-fold validation

构建机器学习模型的一个重要环节是评价模型在新的数据集上的性能。模型过于简单时,容易发生欠拟合(high bias);模型过于复杂时,又容易发生过拟合(high variance)。为了达到一个合理的 bias-vari…

《The reusable holdout: Preserving validity in adaptive data analysis》中文翻译

写在前面:这是我看到的第一篇发在《science》上的文章,将近年来比较火的差分隐私用在解决过机器学习中的过拟合上,效果很棒。这是15年的文章,现在已经17年了,网上居然没有中文翻译,我就粗略的翻译一下给后来…

机器学习模型评测:holdout cross-validation k-fold cross-validation

cross-validation:从 holdout validation 到 k-fold validation 2016年01月15日 11:06:00 Inside_Zhang 阅读数:4445 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanchunhui/article/details/5…

三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)

Cross Validation: A Beginner’s Guide An introduction to LOO, K-Fold, and Holdout model validation By: Caleb Neale, Demetri Workman, Abhinay Dommalapati 源自:https://towardsdatascience.com/cross-validation-a-beginners-guide-5b8ca04962cd 文章目录…

模型检验方法:holdout、k-fold、bootstrap

参考:https://www.cnblogs.com/chay/articles/10745417.html https://www.cnblogs.com/xiaosongshine/p/10557891.html 1.Holdout检验 Holdout 检验是最简单也是最直接的验证方法, 它将原始的样本集合随机划分成训练集和验证集两部分。 比方说&#x…

多种方式Map集合遍历

1.如何遍历Map中的key-value对,代码实现(至少2种) Map集合的遍历(方式1)键找值: package com.B.Container_13.Map;import java.util.HashMap; import java.util.Map; import java.util.Set;//Map集合的遍历(方式1)键找值 public class Map04_01 {publi…

Map集合中的四种遍历方式

1.Map接口的概述 &#xff08;1&#xff09;它是双列集合&#xff1b; &#xff08;2&#xff09;格式&#xff1a;Interface Map<k,v> K:键的类型 V&#xff1a;值得类型 &#xff08;3&#xff09;它的每个元素都包含一个键对象Key和值对象Value&#xff0c;并且他们…