基于卷积的图像分类识别(七):SENet

news2024/11/24 14:35:39

系列文章目录

本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileNet,ShuffleNet,EifficientNet,Vision Transformer,Swin Transformer,Visual Attention Network,ConvNeXt, MLP-Mixer,As-MLP,ConvMixer,MetaFormer


SENet 文章目录

  • 系列文章目录
  • 前言
  • 一、简介
  • 二、SE模块
  • 三、效果
  • 四、代码
  • 五、总结
  • 六、ImageNet图片分类大赛回顾


前言

SENet,胡杰(Momenta)在2017.9提出,通过显式地建模卷积特征通道之间的相互依赖性来提高网络的表示能力,即,通道维度上的注意力机制。SE块以微小的计算成本为现有的最先进的深层架构产生了显著的性能改进,SENet block和ResNeXt结合在ILSVRC 2017赢得第一名。


论文名称:Squeeze-and-excitation networks
论文下载链接:
https://openaccess.thecvf.com/content_cvpr_2018/papers/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.pdf
pytorch代码实现:https://github.com/Arwin-Yu/Deep-Learning-Classification-Models-Based-CNN-or-Attention

一、简介

  • 提出背景:卷积核通常被看做是在局部感受野上,在空间上和通道维度上同时对信息进行相乘求和的计算。现有网络很多都是主要在空间维度方面来进行特征的融合(如Inception的多尺度)。

  • 通道维度的注意力机制:在常规的卷积操作中,输入信息的每个通道进行计算后的结果会进行求和输出,这时每个通道的重要程度是相同的。而通道维度的注意力机制,则通过学习的方式来自动获取到每个特征通道的重要程度(即feature map层的权重),以增强有用的通道特征,抑制不重要的通道特征。

  • 说起卷积对通道信息的处理,有人或许会想到逐点卷积,即kernel大小为1X1的常规卷积。与1X1卷积相比,SENet是为每个channel重新分配一个权重(即重要程度)。而1X1卷积只是在做channel的融合计算,顺带进行升维和降维,也就是说每个channel在计算时的重要程度是相同的。

二、SE模块

SENet是一种基于注意力机制的卷积神经网络架构。其主要思想是通过自适应地重新校准卷积特征的通道响应。SENet中的"Squeeze"和"Excitation"操作分别对应着该过程的两个主要步骤。

Squeeze:压缩操作是全局信息嵌入的过程,主要用于对空间维度进行全局平均池化,得到每个通道的全局空间信息,形成一个通道描述符。换句话说,通过这个操作,我们可以获得每个特征通道的全局上下文信息。

Excitation:激励操作是通过一个全连接(Fully Connected, FC)层来学习非线性交互,以便捕获特征通道之间的依赖关系。具体来说,首先通过一个全连接层(FC)对通道描述符进行降维(通常通过一个收缩因子进行降维,例如16),然后通过ReLU激活函数进行非线性变换,接着再通过一个全连接层(FC)恢复到原始维度,并通过sigmoid激活函数将其映射到0到1之间,得到每个通道的权重。这个权重就可以用来重新校准原始特征通道。

通过这种方式,SENet可以有效地模拟特征通道之间的依赖关系,并且能够动态地调整每个特征通道的权重,从而提高模型的表现。对图5-48流程进行详细说明。

1)输入经过一系列传统卷积得到特征图,对先做一个Global Average Pooling,输出的数据,这个特征向量一定程度上可以代表之前的输入信息,论文中称之为压缩(Squeeze)操作。
2)再经过两个全连接来学习通道间的重要性,用Sigmoid限制到[0, 1]的范围,这时得到的输出可以看作每个通道重要程度的权重,论文中称之为扩展(Excitation)操作。
3)最后,把这个的权重乘到的个通道上,这时就根据权重对的通道进行了重要程度的重新分配。

SENet block

三、效果

与SE 模块可以嵌入到现在几乎所有的网络结构中,而且都可以得到不错的效果提升,用过的都说好。

在大部分模型中嵌入SENet要比非SENet的准确率更高出1%左右,而计算复杂度上只是略微有提升,具体如下图所示。 而且SE块会使训练和收敛更容易。CPU推断时间的基准测试:224×224的输入图像,ResNet-50 164ms,SE-ResNet-50 167ms。

SENet与经典模型的性能比较
 SENet与轻量网络的计算复杂度比较

四、代码

这里给出模型搭建的python代码(基于pytorch实现)。完整的代码是基于图像分类问题的(包括训练和推理脚本,自定义层等)详见我的GitHub: 完整代码链接


class SqueezeExcitation(nn.Module):
    def __init__(self, pervious_layer_channels, scale_channels=None, scale_ratio=4):
        super().__init__()
        if scale_channels is None:
            scale_channels = pervious_layer_channels
        # assert input_channels > 16, 'input channels too small, Squeeze-Excitation is not necessary'
        squeeze_channels = make_divisible8(scale_channels//scale_ratio, 8)
        self.fc1 = nn.Conv2d(pervious_layer_channels, squeeze_channels, kernel_size=1, padding=0)
        self.fc2 = nn.Conv2d(squeeze_channels, pervious_layer_channels, kernel_size=1, padding=0)
    def forward(self, x):
        weight = F.adaptive_avg_pool2d(x, output_size=(1,1))
        weight = self.fc1(weight)
        weight = F.relu(weight, True)
        weight = self.fc2(weight)
        weight = F.hardsigmoid(weight, True)
        return weight * x

五、总结

SENet模型是一种通过自适应地重新加权输入特征图的通道来增强模型表达能力的卷积神经网络结构。由胡杰等人在2018年提出。
SENet的核心思想是通过一个“Squeeze-and-Excitation”模块来学习输入特征图的通道之间的关系,从而自适应地调整特征图中每个通道的权重。具体来说,“Squeeze-and-Excitation”模块包含两个步骤。
“Squeeze”:通过全局池化操作,将输入特征图的每个通道压缩成一个标量,用于表示该通道的重要性。
“Excitation”:使用一个小型的全连接神经网络,学习一个激活函数,将上一步中得到的每个通道的重要性进行自适应调整,并重新加权输入特征图的通道。
通过这样的操作,SENet可以自适应地增强模型的表达能力,减少冗余信息的传递,并且在不增加网络复杂度的情况下提高模型的准确率。此外,SENet可以很容易地嵌入到其他深度卷积神经网络结构中,使得其更容易应用于实际的计算机视觉任务中。
SENet模型在许多视觉任务中都取得了出色的表现,比如在ImageNet图像分类任务中,SENet-154取得了迄今为止最好的单模型结果。同时,SENet还被广泛应用于各种其他视觉任务中,如目标检测、语义分割等。

六、ImageNet图片分类大赛回顾

到此为止,关于 ImageNet 图片分类大赛举办以来(2012-2017),所有的冠军模型以及介绍完了。这些模型在计算机视觉领域都是里程碑意义的工作,学习这些模型来入门基于深度学习解决方案的计算机视觉再合适不过了。以下稍作回顾:

ImageNet

  1. 是一个超过15 million的图像数据集,大约有22,000类。
  2. 是由李飞飞团队从2007年开始,耗费大量人力,通过各种方式(网络抓取,人工标注,亚马逊众包平台)收集制作而成,它作为论文在CVPR-2009发布。当时人们还很怀疑通过更多数据就能改进算法的看法。
  3. 深度学习发展起来有几个关键的因素,一个就是庞大的数据(比如说ImageNet),一个是GPU的出现。(还有更优的深度模型,更好的优化算法,可以说数据和GPU推动了这些的产生,这些产生继续推动深度学习的发展)。

ILSVRC

  1. 是一个比赛,全称是ImageNet Large-Scale Visual Recognition Challenge,平常说的ImageNet比赛指的是这个比赛。
  2. 使用的数据集是ImageNet数据集的一个子集,一般说的ImageNet(数据集)实际上指的是ImageNet的这个子集,总共有1000类,每类大约有1000张图像。具体地,有大约1.2 million的训练集,5万验证集,15万测试集。
  3. ILSVRC从2010年开始举办,到2017年是最后一届。ILSVRC-2012的数据集被用在2012-2014年的挑战赛中(VGG论文中提到)。ILSVRC-2010是唯一提供了test set的一年。
  4. ImageNet可能是指整个数据集(15 million),也可能指比赛用的那个子集(1000类,大约每类1000张),也可能指ILSVRC这个比赛。需要根据语境自行判断。
  5. 12-17年期间在ImageNet比赛上提出了一些经典网络,比如AlexNet,ZFNet,VGG,GoogLeNet,ResNet, DenseNet, SENet。我之前的博文都有相应模型及其变体的介绍。

在这里插入图片描述

值得注意的是ZFNet和ResNeXt,其中这两个模型都不是当年的冠军,但是知名程度却都比冠军模型多很多,主要原因如下:

ZFNet是由 Matthew D.Zeiler 和 Rob Fergus 在 AlexNet 基础上提出的大型卷积网络,在 2013年 ILSVRC 图像分类竞赛中以 11.19% 的错误率获得冠军。ZFNet 实际上并不是 ILSVLC 2013 的赢家。相反,当时刚刚成立的初创公司 Clarifai 是 ILSVLC 2013 图像分类的赢家。又刚刚好 Zeiler 是 Clarifai 的创始人兼首席执行官,而 Clarifai 对 ZFNet 的改动较小,故认为 ZFNet 是当年的冠军。

至于ResNeXt,是因为2016年的冠军模型Trimps-Soushen模型并不是开源模型,人们并不知道其模型设计的细节,所以自然没有亚军ResNeXt知名。

ImageNet的意义
ImageNet数据集的一个特点是它为分类中的每个图像都标注了一个主要的物体,这也决定了ImageNet主要用于单个物体的分类和定位。自2010年以来,每年的ImageNet挑战赛都会包括三个基本任务:图像分类、单物体定位和物体检测。

然而,ImageNet的单一标签分类方式并不符合真实世界中图像的分布特征,因此具有较大的局限性。李飞飞早在2014年便考虑取消某个任务的比赛,但由于业界的偏爱而未作出调整。直到2015年,直到2015年,ResNet模型提出了训练深度神经网络的有效方法,并通过超越人类的精度,在图像分类任务中取得了突破性进展,这几乎宣告了ImageNet挑战赛的结束。此外,算法层面的模型已经达到了过拟合的极限,继续竞争的意义已不大。例如,2016年有许多团队为了夺冠不惜花费巨资进行模型训练,其计算成本已经超出了普通人的想象,甚至有人开始研究非常规方法。实际上,这种为了夺冠而疯狂刷榜的行为已经偏离了ImageNet比赛的初衷。与其投入精力和成本来攀比,ImageNet比赛的初衷应该是在算法上的创新。

每一个比赛都承载了我们对技术发展的期望。然而,随着技术的进步,我们也逐渐发现这些数据集的局限性。虽然ImageNet挑战赛已经结束,但其中的一些任务,例如物体检测方面的研究,仍将继续下去。事实上,ImageNet挑战赛的落幕只是一个曲终人散的过程,而不是终结。在短短的十几年内,人工智能与计算机视觉研究已经发生了翻天覆地的变化。这一切都离不开ImageNet大赛的贡献。
2017年7月,太平洋上的小岛,旅游胜地檀香山(Honululu)迎来了来自世界各地的5000余名计算机视觉研究者,计算机视觉的顶级学术会议CVPR在此拉开序幕。同时,最后一届ImageNet挑战赛的研讨会也在CVPR 2017上举行。在6月26日,ImageNet挑战赛的研讨会召开,李飞飞进行了题为IMAGENET—Where Have We Been?Where Are We Going?(ImageNet:我们来自何方,我们去向何处)的演讲,回顾了ImageNet从2010年首次举办以来的8年历程。

李飞飞认为,ImageNet对AI研究最大的贡献是改变了人们的思维模式。越来越多的研究者意识到,数据可能是迈向人类水平的人工智能过程中的关键因素,而不是模型。“数据重新定义了我们对模型的思考方式。”她表示,尽管ImageNet挑战赛结束了,但ImageNet数据集的维护和相关研究仍将会继续。在单标签识别问题基本得到解决后,近年来,她开始关注视觉理解、视觉关系的预测等视觉之外的内容,并开始着手建立相关的数据集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程 lesson3 UDP基础编程

目录 UDP介绍 UDP编程 函数接口 recvfrom sendto 小练习:实现服务器和客户端相连(使用UDP实现) client server UDP介绍 UDP(User Datagram Protocol,用户数据报协议)是一种在计算机网络中常用的传输…

C++常量成员函数(类成员函数后加const、类成员函数参数列表后加const)常量对象(类名前加const)和非常量对象

文章目录 常量对象和非常量对象(常量对象不能调用非常量成员函数)常量成员函数(常量成员函数不能修改类的数据成员;常量成员函数只能调用常量成员函数,不能调用非常量成员函数) 常量对象和非常量对象&#…

网络编程 lesson1 网络概念

目录 网络发展史(了解) 局域网和广域网 局域网 广域网 IP地址 IP地址划分(IPV4) IP地址取址范围: 特殊地址 子网掩码 子网号(注意和前面进行区分) 练习 练习1: 练习2&…

MySQL 数据库之 MMM 高可用架构构建

一、MMM 概述 1. 什么是 MMM   MMM(Master-Master replication manager for MySQL,MySQL 主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要从来监控和管理 MySQL Master-Master&a…

工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结

工厂模式 工厂模式有许多变体,其中最常见的有三种 简单工厂模式工厂方法模式抽象工厂模式 简单工厂代码分析 UML图中我们可以清晰的看到代码结构 ,首先我们创建一个Car的汽车接口,定制汽车的基本规范,汽车可以的方法是可以跑,所以我们定义了一个抽象的run方法. 定义汽车接口…

【sed编辑器】

目录 一、sed编辑器二、sed的命令格式操作命令1.1、命令演示 二、替换三、插入 一、sed编辑器 1、sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 2、sed编辑器可以根据命令来处理数据流中的数据,这些命令要么…

OSC Liblo Window10配置

OpenSoundControl一种网络通讯协议,想了解详情的自行打开网站。 liblo 是最知名的OSC库, 功能完整,用 C 和 LGPL 许可编写。 下载请前往GitHub库。 解压后安装过程如下,需要用到CMake: 1.选择源代码文件和构建工程的文…

一文读懂“生成式 AI”

一、前言 本文基于谷歌的:《Introduction to Generative AI》 并且借助 ChatGPT 整理而成,帮助大家理解生成式 AI 这个概念。 主要包括 4 个部分: 生成式 AI 的定义生成式 AI 的工作原理生成式 AI 模型的分类生成式 AI 的应用 二、生成式…

【数据结构】双向带头循环链表的实现

目录 全部代码 图例(双向带头循环链表) 各个功能的实现 创建该链表的节点 创建初始链表 链表的头插 链表的尾插 链表的随机插入 链表的头删 链表的尾删 链表的随机删除 链表的销毁 链表是否为空的判断 链表节点的创建 总结 全部代码 typ…

命令行更新Windows

命令行更新Windows powershell命令行更新安装 Windows Update module for Windows Powershell连接到 Windows Update 服务器并下载更新安装下载好的 Windows Update 更新 cmd执行Windows update更新检查更新下载 Windows Update 更新安装更新安装更新后重新启动设备 win10以下版…

Python中Pandas库的相关操作

目录 Pandas库 常用操作 创建DataFrame 查看数据 数据选择和过滤 数据排序和排名 缺失数据处理 数据聚合和分组 数据的合并和连接 Pandas库 Pandas是Python中常用的数据处理和分析库,它提供了高效、灵活且易于使用的数据结构和数据分析工具。 1.Series&a…

实例35---字符串反转,如将字符串 “www.runoob.com“ 反转为 “moc.boonur.www“。

文章目录 前言一、题目描述 二、题目分析 三、解题 1.解题方法一--- for循环来将字符的下标数值进行对每一个字符进行交换 ---程序运行代码 2.解题方法二------ 指针 ------ 程序运行代码(1)程序运行代码优化 总结 前言 本系列为C语言菜鸟100道基础经典例题详解刷题系列。点滴…

微服务:服务发现

1. 服务发现 eureka、nacos、Consul、etcd 和 zk 都是主流的服务发现工具,而 Dubbo 和 Polaris Mesh 则是基于服务发现的 RPC 框架。 它们的主要区别在于: eureka 是 Netflix 开源的一个服务发现组件,支持高可用和数据同步,具有…

如何使用Linkage Mapper揭示栖息地变化的故事

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 引言1.1 定义和作用1.2 Linkage Mapper的历史和发展2.1 揭示栖息地变化的重要性2.2 Linkage Mapper的优势和不足

Windows下载安装RocketMq

Windows下载安装RocketMq 下载安装包启动NAMESERVER 和 BROKER启动NAMESERVER启动BROKER 安装可视化插件 下载安装包 RockitMQ官网下载地址:https://rocketmq.apache.org/release-notes/ 解压到指定的文件夹下 先配置JAVA_HOME 配置ROCKETMQ_HOME环境变量 …

使用Maple的Python API :OpenMaple(Windows下的解决方案)

在Maple 2023(按照软件文档,Maple 2018及以上版本均适用;我目前测试的版本为2023)的安装目录下,有软件附带的解释器,如D:\Program Files\Maple 2023\Python.X86_64_WINDOWS\Python.exe。这一Python解释器的…

Python中NumPy库的相关操作

目录 NumPy库 常用操作 创建数组 数组属性 索引和切片 数组运算 数组重塑 NumPy库 NumPy(Numerical Python)是Python中常用的数值计算库,它提供了高性能的多维数组对象和对数组进行操作的函数。 1.多维数组对象(ndarray&…

Java 课程设计 —— 扫雷

一、团队课程设计博客链接: https://www.cnblogs.com/luomeili/p/10280310.html 二、个人负责模块或任务说明: 模块:文件操作 Minefield 类实现 三、自己的代码提交记录截图 四、自己负责模块或任务详细说明 1.Minefield 类实现 Minefie…

Java中的CountDownLatch和CyclicBarrier有什么作用?

在Java并发编程中,CountDownLatch和CyclicBarrier是两个非常有用的工具,它们可以帮助我们更加方便地进行线程通信和协作。在本文中,我将从面试的角度,详细讲解Java中的CountDownLatch和CyclicBarrier的概念、作用和实现方式&#…

基于卷积的图像分类识别(六):DenseNet FractalNet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileN…