即插即用的涨点模块之变体卷积(Ghost卷积)详解及代码,可应用于检测、分割、分类等各种算法领域

本文主要是介绍即插即用的涨点模块之变体卷积(Ghost卷积)详解及代码,可应用于检测、分割、分类等各种算法领域,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、GhostConv结构

二、GhostConv计算流程

三、GhostConv参数

四、代码详解


前言

GhostNet: More Features from Cheap Operations

来源:CVPR2020

官方代码:https://github.com/huawei-noah/ghostnet

        Ghost 模块是一种针对卷积神经网络(CNN)的创新设计,特别适用于嵌入式设备,这些设备通常具有有限的内存和计算资源。Ghost 模块的核心思想是利用已有的特征图(feature maps)通过低成本的线性变换生成更多的“幽灵”特征图(ghost feature maps),从而提高网络的计算效率。


一、GhostConv结构

        GhostConv分为三步:常规卷积、Ghost生成和特征图拼接,GhostConv结构如图1所示,图中a图为常规卷积操作,而b为GhostConv模型操作。常规卷积操作,对输入特征图进行卷积,得到输出,与普通卷积神经网络相比,Ghost模块降低了所需的参数数量和计算复杂度。GhostNet先使用普通卷积(1*1*M),批量归一化和一个激活函数Relu,将输入图片进行通道数压缩,生成一些固有的特征映射,然后将特征图应用一系列简单的线性操作(单位映射与线性变换并行以保持固有的特征映射)φk获得更多特征图,增加特征。其中廉价操作φk由Depthwise Convolution(Depthwise Convolution是一个卷积核负责一个通道,一个通道只被一个卷积核卷积)和批量归一化和一个激活函数Relu组合 ,然后将不同特征图,通过concat将获得的特征图和第一步中通过普通卷积,批量归一化和激活函数Relu组合,最终获得的特征图即为output。实验结果表明,提出的Ghost模块能够降低通用卷积层的计算成本,同时保持相似的识别性能,并且GhostNets可以在移动设备上快速推理的各种任务上超越最先进的高效深度模型。利用Ghost模块优势,设计Ghost bottleneck,结构如图2所示。Ghost bottleneck 主要由两个堆叠的ghost module组成,第一个ghost module作为扩展层增加通道数量,第二个ghost module减少了通道的数量以匹配第一步的输入,使两者可以进行元素加法。图中分成了两种,一种为步幅=1的,另一种为步幅=2的,第二种则在两个ghost module中间插入了一个步幅为2的深度卷积。

图1:GhostNet结构图

图2 Ghost bottleneck结构

使用 GhostConv模块的主要优势包括:

降低计算负载:通过使用线性变换从现有特征图生成更多特征图,相较于依赖额外的卷积层,大大减少了所需的计算量。

高效利用资源:这种方法最大限度地利用了可用的计算和内存资源,特别适合资源有限的嵌入式系统。

易于适应:由于其模块化设计,Ghost 模块可以无缝集成到现有的 CNN 架构中,使其成为提高效率的通用解决方案。

二、GhostConv计算流程

给定一个输入(其中c为通道数,h为高度,w为宽度),经过的卷积核,得到特征图

普通卷积的参数量为: ,计算量为:

GhostConv的参数量为:  ,计算量为:

其中d⋅d为线性运算的卷积核大小,s为线性变换次数,s<<c。是第一次变换时的输出通道数目,s-1是因为恒等映射不需要进行计算,但它也算做第二变换中的一部分,因此Ghost 模块之所以能省计算量。为普通卷积与GhostConv卷积计算量比,为参数之比。

 

三、GhostConv参数

利用thop库的profile函数计算FLOPs和Param。Input:(64,32,32),卷积核(128,3,3)

Module

FLOPs

Param

GhostConv

38862848

37696

标准卷积

75497472

73856

四、代码详解

import torch.nn as nn
import torchclass GhostModule(nn.Module):def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):super(GhostModule, self).__init__()self.oup = ouphidden_channels = oup // rationew_channels = hidden_channels*(ratio-1)self.primary_conv = nn.Sequential(nn.Conv2d(inp, hidden_channels, kernel_size, stride, kernel_size//2, bias=False),nn.BatchNorm2d(hidden_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)self.cheap_operation = nn.Sequential(nn.Conv2d(hidden_channels, new_channels, dw_size, 1, dw_size//2, groups=hidden_channels, bias=False),nn.BatchNorm2d(new_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)def forward(self, x):x1 = self.primary_conv(x)x2 = self.cheap_operation(x1)out = torch.cat([x1,x2], dim=1)return outif __name__ == '__main__':from  torchsummary import summaryfrom thop import profilemodel = GhostModule(64, 128, 3, 2, 3, 1, True)summary(model, (64, 32, 32), device='cpu')flops, params = profile(model, inputs=(torch.randn(1, 64, 32, 32),))print(f"FLOPs: {flops}, Params: {params}")

这篇关于即插即用的涨点模块之变体卷积(Ghost卷积)详解及代码,可应用于检测、分割、分类等各种算法领域的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924067

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

YOLOv8改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转 Atrous Spatial Pyramid Pooling (ASPP) 是一种在深度学习框架中用于语义分割的网络结构,它旨

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共