轻量级神经网络——shuffleNet

article/2025/11/10 19:18:13

文章目录

  • 轻量级神经网络——shuffleNet
    • shuffleNet1
      • 逐点分组卷积(Pointwise group convolution)✨✨✨
      • 通道重排(channel shuffle)✨✨✨
      • shuffleNet Unit✨✨✨
      • shuffleNet1的网络结果和效果

轻量级神经网络——shuffleNet

shuffleNet1

  在之前,已经讨论过一种轻量级神经网络——MobileNet,文中对MobileNet的三个版本都做了详细的介绍,读此篇之前,建议先了解MobileNet,特别是要对其中的深度可分离卷积有较清晰的认识,因为shuffleNet中的分组卷积和MobileNet的逐深度卷积(Depthwise Convolution)非常相似,故在此篇的描述过程中,我认为大家已经有了MobileNet的基础🆗🆗🆗

  shuffleNet1的论文只有9页,是不是还是很轻量的🎈🎈🎈我认为shuffleNet1中最主要的思想有两点,一是逐点分组卷积(Pointwise Group Convolution),二是通道重排(channel shuffle)。 下面就来具体的谈谈这两点🧨🧨🧨
 
 

逐点分组卷积(Pointwise group convolution)✨✨✨

  在说明逐点分组卷积之前先来了解一下什么是分组卷积和逐点卷积。所谓分组卷积,就是将原始的特征图分成几组后再分别对每一组进行卷积。用下图来进行解释,左图表示普通卷积,右图表示分组卷积。左图普通卷积输入特征图个数为12,采用了6个卷积核对输入图像进行卷积,得到了6个输出的特征图;右图分组卷积输入特征图的个数也是12,但其将12个特征图分成了3组(红、绿、黄),每组有4个特征图,这时同样需要6个卷积核,但需要注意的是这6个卷积核也被分成3组,即两两一组。然后将每组的输入特征图和对应的两个卷积核进行卷积,这时每组都会产生2个特征图,一共也会有6个输出特征图。注意:虽然普通卷积核分组卷积都需要6个卷积核,但他们卷积核的通道数是不一样的,对本列来说,普通卷积的卷积核通道数为12,而分组卷积的卷积核通道数为4。

image-20220228161354149

  上面谈到了普通卷积和分组卷积的区别,其实看过MobileNet的同学,应该感觉很熟悉,这和MobileNet里面的逐深度卷积(DW卷积)是非常像的,相当于DW卷积把组分得足够多,每个通道的特征图都为一组,因此不理解分组卷积的可以结合DW卷积思考思考🔮🔮🔮

  读到这里,很多读者可能要问了,为什么要采用分组卷积呢?分组卷积相对于普通卷积有什么优势呢?其实分组卷积可以有效的减少网络的容量,使网络更加轻量。下面还是结合上图来算算普通卷积核分组算计各自所消耗的参数量和计算量(不会计算参数量和计算量的请移步:神经网络参数量、计算量(FLOPS)、内存访问量(AMC)计算详解)【注意:这里假设卷积核大小为K*k,输出特征图大小为H*W】

image-20220228170351967

  通过上图,可以很明显的看出,分组卷积的参数量和计算量都比普通卷积要小。定量观察会发现,普通卷积的计算量和参数量都是分组卷积的3倍,刚好是所分的组数,这是一个一般性的结论。

  至此,分组卷积应该是叙述清楚了。这回再来谈谈逐点卷积,这个似乎真没啥好谈的了,再我的MobileNet博客中也提到过,逐点卷积其实就是卷积核为1*1的卷积。

  讨论完分组卷积和逐点卷积,就可以来定义逐点分组卷积了。顾名思义,逐点分组卷积就是将分组卷积核逐点卷积相结合,即表示卷积核大小为1*1的分组卷积。

 
 

通道重排(channel shuffle)✨✨✨

  上面介绍了逐点分组卷积,这里可以看一下逐点分组卷积后的效果,如下图所示:

image-20220228172700011

  可以看到,不同组之间是没有任何联系的,即得到的特征图只和对应组别的输入有关系。论文中也有这样的描述,这种分组因不同组之间没有任何联系,学习到的特征会非常有限,也很容易导致信息丢失,因此论文提出了channel shuffle。

image-20220228181740259

  channel shuffle具体是怎么实现的呢?下图标绿框部分即为channel shuffle的操作,即从得到的特征图中提取出不同组别下的通道,并将他们组合在一起,最终channel shaffle完成后的结果如(c)中黄色虚线框所示。

  上图中从绿框传变成黄色虚线框的过程即为channel shaffle通道重排过程,现将其分解出来,看看channel shaffle通道重排具体过程,如下图:

image-20220228183536486

图片来源于B站UP主:同济子豪兄

​  
 

shuffleNet Unit✨✨✨

  (a)是最原始的残差结构,(b)、©都是shuffleNet的单元结构。先来看看(a)是如何变成(b)的,首先是用逐点分组卷积代替了逐点卷积,同时在其后跟了一个channel shuffle操作,然后中间的3x3DWConv没有变化,最后的逐点卷积依旧换成了逐点分组卷积。©是用来降采样的,和(b)主要区别在shortcut分支中采用了3x3d的步长为2的AVG Pool、主分支中DWConv中的步长变成了2以及最后使用的是Concat而不是add,这样的结构会使输入图像尺寸减半,通道数翻倍。

image-20220228184042618

  还有一些细节需要在这里提一下,一是在第二个逐点分组卷积后并没有使用channel shuffle,这是因为此时得到的结果已经相当不错了,所以不需要进行通道重排了;二是在DWConv后并没有进行Relu激活,这个原因我在MobileNetV2中有说到,不知道的可以去看一看。

image-20220228190312831

image-20220228190556317

 
 

shuffleNet1的网络结果和效果

  下图网络结构的每一步变化也较好分析,不会的可以参考我之前的博客。需要注意的是黄框框住的g表示不同的分组数,如g=3表示将特征图分成3组进行分组卷积。

  下面为shuffleNet和其他一些经典网络的性能比较,可以看出shuffleNet在FLOPs一定时优势还是很明显的🍭🍭🍭

image-20220228192650743

shuffleNet和主流模块堆叠而成的网络新能比较
   

image-20220228192934740

shuffleNet和主流网络性能比较
   

image-20220228193114237

shuffleNet和MobileNet图像分类性能比较

 

下一篇:轻量级神经网络——shuffleNet2🌱🌱🌱

 
 
如若文章对你有所帮助,那就🛴🛴🛴

咻咻咻咻~~duang~~点个赞呗


http://chatgpt.dhexx.cn/article/4IUYfmw6.shtml

相关文章

【zynq】‘Underfined reference Xil_out 32’报错解决方法

在zynq book Exercise 4A实验中,按照文档流程会报错‘Underfined reference Xil_out 32’。没有找到#include "xil_io.h"。无法直接在”led_controller.h”中加入”xil_io.h”。 可以在"xparameters.h"加入#include“xil_io.h”解决。 插入后l…

vivado SDK Underfined reference Xil_out 32’。

在黑金ZYNQ 实验中,按照文档流程会报错‘Underfined reference Xil_out 32’。 如下图所示,网上提示是没有xil_io.h 解决办法 在文件中添加#include "xil_io.h"即可解决这个问题。

xil_printf打印遇到的问题

xil_printf打印遇到的问题 使用xil_printf打印遇到的问题解决方法 使用xil_printf打印遇到的问题 最近在使用vitis做zynq的开发。 在使用xil_printf函数的时候发现打印会出现一些问题: 使用xil_printf函数打印“%f”时,没有打印出来数据, x…

第九节,ZYNQ的双核启动

ZYNQ的双核启动 1 双核运行原理 ZYNQ是一种主从关系的AMP架构,通过松散耦合共享资源,允许两个处理器同时运行自己的操作系统或者裸机应用程序,在各自运行自己的程序或者系统的时候,可以通过共享内存进行双核之间的交互。双核启动…

ZYNQ基本使用(4) 中断 -- 私有定时器中断

目录 中断 中断简介 私有、共享和软中断 通用中断控制器GIC 复位和时钟 模块图 CPU中断信号直通 功能说明 软件生成的中断 SGI CPU私有外设中断PPI 共享外围中断SPI 硬件系统 软件系统 私有定时器中断 函数API 参考 中断 中断简介 UG585 CH7 Interrupts 以下…

Zynq-PS-SDK(4) 之 GIC 配置

目录 1、Configuration 2、GIC SDK Architecture 2.1、Structures 2.1.1、GIC interrupt vector table 2.1.2、GIC info 2.1.3、GIC 2.2、Functions 2.2.1、Basic 2.2.2、APIs 2.3、Configure flow 2.3.1、XScuGic_LookupConfig 2.3.2、XScuGic_CfgInitialize 2.3…

Xilinx软件开发:FreeRTOS快速入门

目录 第一章. 测试环境和软件版本 第二章. 创建hello world 第三章. 创建FreeRTOS2 第四章. 增加两个任务 1. 增加任务 2. 增加计数 第五章. 发送增加延时 第六章. 接收增加消息判断 第七章. 创建两个生产者 第八章. 注意事项 1. …

关于xilinx vitis 中的报错“fatal error: xil_printf.h: No such file or directory helloworld.c“问题解决

问题源:此问题是由于在VIVADO中使用了自动有AXI—IP造成的; 分析:在自定义了AXI-IP之后,会在自定义IP文件夹下生成“makefile”文件,该文件用于在vitis中生成对应文件的,所以需要修改你自定义IP的文件下的…

Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf

Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf 前提条件:步骤: ** Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf ** 前提条件: Vivado 2019.1已…

ZYNQ开发中SDK输出串口选择以及打印函数print、printf、xil_printf的差别

ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别 前言两个串口到底是谁在打印?print 和 printf 和 xil_printf 前言 在最初的helloworld工程中,我们实现了通过串口每个1秒钟打印一次Hello World。 这里我们就来搞清楚以下…

Xilinx SDK Xil_In 内存对齐

SDK 的"xil_io.h"中提供了对地址的直接读写操作 不过我在实践中发现,对于Xil_In32(),当偏移为1不断读取时,会出现不正确的值。 我当时是在某连续若干地址中写了 0x0000 00ff(假如基址是0xc000 0000吧),但是读取的时候 0xc000 0001 读取的值是 0x0000 00ff; …

对Xil_Out32未定义的引用

第一次在HLS中遇见一个官方库函数未定义问题,这就把解决方法记录下来。 在创建好工程,写完工程代码后,发现报错如下 ./src/led_controller_test_tut_4A.o:在函数‘main’中:/home/greedyhao/Projects/LearningAndWor…

vivado sdk中xil_out函数对指定的BRAM地址写数据为什么会导致程序挂起?

是有关zynq芯片的网口程序调试的,我在例程lwip_echo_server程序中加入了往指定的bram地址写数据的语句,想要实现PS到PL数据的交互,但是程序执行到xil_out这块直接就运行不下去了,也不会打印下面的东西 下面是BRAM地址在SDK中的声明…

vivado 仿真报错:ERROR: [VRFC 10-2987] ‘xxxxx‘ is not compiled in library ‘xil_defaultlib‘

在Design Sources窗口下,选中报错的IP,比如除法器,右键: 选择第一个Autumatic Update and Compile Order即可。

仿真出现[VRFC 10-2263] Analyzing Verilog fileinto library xil_defaultlib

再Vivado导入quartus的.v文件出现如下情况,仿真例化时例化的模块都是问号。 让我们去仿真文件夹看看。 INFO: [VRFC 10-2263] Analyzing Verilog file "E:/FPGA/sdram0/sdram/sdram.srcs/sim_1/imports/tb_sdram_init/tb_sdram_init.v" into library xil…

GF框架+XIL 项目整合

项目unity版本:2020.3.18f1 XIL版本:Commits on Oct 26, 2021 GameFramework版本:Commits on Sep 28, 2021 UnityGameFramework版本:Commits on Oct 28, 2021 StarForce版本:Commits on Aug 9, 2021 HFS版本:2.3 项目克…

有关 MicroBlaze中xil_prinf/pirntf/print的一些问题

三个函数有什么区别 1.依赖的库文件不同 printf使用C标准库头文件stdio.h print/xil_printf使用xilinx定义的头文件xil_printf.h 2.能够输出的格式不同 print只能打印字符串,不可以带参数格式化输出,函数在print.c中定义 xil_printf可以带参量打印,但是不…

只针对个人遇见卡在Xil_DataAbortHandle循环while的解决办法

只针对本人所遇见的情况&#xff1a; 部分代码&#xff1a;unique_ptr<SatNoSnr[]> SatNo_Snr_Read_main(new SatNoSnr[Wrtie_Num]);// SatNo_Snr_Read_mainflash->FlashRead_JuYan(Wrtie_Num); 当SatNoSnr结构体是129字节(sizeof是136字节)时&#xff0c;上面一…

ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别 前言两个串口到底是谁在打印&#xff1f;print 和 printf 和 xil_printf 前言 在最初的hell…

MBD开发模式下的XIL仿真测试

MBD开发模式下的XIL仿真测试 “想了解MBD模式下的MIL、SIL、PIL、HIL吗&#xff1f;”——虹科 汽车从一个发动机加上几个轮子的简单形态发展到如今机械与电子高度融合的复杂整体&#xff0c;经历了巨变。汽车电子控制单元的数量和复杂度也呈几何级数增加&#xff0c;给软硬件…