mobilenet V3算法理解与代码解析

MobileNetV3是通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法设计改进而来,这里不讨论网络自动搜索,我们详细解读mobilenetV3的网络结构和代码实现。

深度可分离卷积将标准化卷积分解为逐深度卷积(depthwise convolution)和逐点1x1卷积(pointwise convolution)。对于MobileNets,逐个深度卷积将单个滤波器应用到每一个输入通道。然后,逐点卷积用1x1卷积来组合不同深度卷积的输出。深度可分离卷积将其分成两层,一层用于滤波,一层用于组合。这种分解过程能极大减少计算量和模型大小。
在这里插入图片描述

1.depth-wise convolution (DWconv)
逐深度卷积DWconv是按深度(channel数)逐层卷积获得一个个新的feature map,但是这些新的feature map并没有空间信息,因为逐深度卷积使用二维卷积对输入每个通道的特征进行卷积,通道与通道是阻断的。为了将空间信息重新注入feature map,DWconv利用1×1卷积将这些新的feature map重新组合,由反向BP重新获取空间信息。为了让大家更好的理解,我们从知乎R.JD的文章中截取图片进行讲解。
在这里插入图片描述
首先,标准卷积过程从图中可见,输入12×12×3经过5×5×3的卷积得到8×8×1的feature,然后存在256个5×5×3的卷积,所以自然得到8×8×256的feature map。
在这里插入图片描述
我们再来看看DWconv,首先DWconv先将原来的输入12×12×3拆分成12×12×1的单层,这个过程需要用的conv中group参数,后面我们在代码中介绍。然后将5×5×3的kernel也拆分成5×5×1,这样逐层进行卷积可以获得3个8×8×1的feature,可见这3个feature并不具备空间信息。这样的操作只能维持通道数,并不能丰富空间信息。
在这里插入图片描述
现在我们已经获取了3个8×8×1的feature,利用3个1×1×1的卷积,可以将feature融合一个8×8×1的新feature,这个新的feature具有原来的3层空间信息,当我们用256个1×1的卷积获也取256个8×8的feature时,也就得到我们图中的8×8×256的feature map,与标准卷积一样,DWconv也获取了相同规模的feature map,但过程是完全不同的。DWconv的操作减少了大量的计算与参数,同时它与标准卷积获取的信息量从理解上应该是差不多的。

下面,我们来看看这两种卷积的参数量与计算量在这里插入图片描述
标准卷积,它的kernel size 是Dk×Dk×M,有N个这样的kernel。所以它的参数量是:在这里插入图片描述
经过卷积后,获得了Dw×Dh×N的feature map,我们知道Dw×Dh中的每个像素都要经过Dk×Dk×M次相乘相加,所以标准卷积的计算量就是:
在这里插入图片描述
在这里插入图片描述
再来看看DWconv的参数与计算量。DWconv分为两部,第一步是拆分后获取单层feature,很显然,参数量是Dk×Dk×M,计算量是Dk×Dk×M×Dw×Dh。第二步是1×1升维,参数量,因为有N个1×1×M的卷积,所以就是M×N,计算量,M×N×Dw×Dh。
在这里插入图片描述

2.激活函数
在这里插入图片描述
这个激活函数是从swish改进而来,主要是为了简化swish的计算成本,并最大程度完成swish的功能。有实验来看是有一定的效果的。

3.SE结构
在这里插入图片描述
在这里插入图片描述
SE block的思想:从空间信息的权重出发,利用feature map经过一系列conv操作获取BP优化后的各层权重。过程:从H×W×C的feature map经过averagepool变成1×1×C的向量,这个操作过于简单粗暴,但从性能和速度来看却达到了平衡,再经过两次1×1的卷积后,获得1×1×C的权重。最后将原来的feature map逐层与该向量相乘,获得最终的结果。

4.block
在这里插入图片描述
从上图我们可以看到,mobilenet V3 block由以下组成:
1:膨胀,由1×1卷积将原来的feature map膨胀。
2:深度可分离卷积,由3×3卷积核逐层卷积每层特征,在经过1×1卷积融合程新的feature map。
3:se,获取新的feature map后,利用se的注意力机制获取空间权重来优化性能
4:residual,利用残差结构

代码理解

class Block(nn.Module):'''expand + depthwise + pointwise'''def __init__(self, kernel_size, in_size, expand_size, out_size, nolinear, semodule, stride):super(Block, self).__init__()self.stride = strideself.se = semoduleself.conv1 = nn.Conv2d(in_size, expand_size, kernel_size=1, stride=1, padding=0, bias=False)self.bn1 = nn.BatchNorm2d(expand_size)self.nolinear1 = nolinearself.conv2 = nn.Conv2d(expand_size, expand_size, kernel_size=kernel_size, stride=stride, padding=kernel_size//2, groups=expand_size, bias=False)self.bn2 = nn.BatchNorm2d(expand_size)self.nolinear2 = nolinearself.conv3 = nn.Conv2d(expand_size, out_size, kernel_size=1, stride=1, padding=0, bias=False)self.bn3 = nn.BatchNorm2d(out_size)self.shortcut = nn.Sequential()if stride == 1 and in_size != out_size:self.shortcut = nn.Sequential(nn.Conv2d(in_size, out_size, kernel_size=1, stride=1, padding=0, bias=False),nn.BatchNorm2d(out_size),)def forward(self, x):out = self.nolinear1(self.bn1(self.conv1(x)))out = self.nolinear2(self.bn2(self.conv2(out)))out = self.bn3(self.conv3(out))if self.se != None:out = self.se(out)out = out + self.shortcut(x) if self.stride==1 else outreturn out

我们主要根据上面讲的Block结构来分析代码如何实现的。self.conv1很显然是膨胀操作,将原来的feature map膨胀到指定通道数,self.nolinear1 = nolinear,nolinear是激活函数,是由形参传入可以是hswish与hsigmoid。self.conv2进行逐层卷积,大家看到group这个参数,group=膨胀通道数,意味着将H×W×C分成了C个H×W×1来分别进行卷积,这样才能实现深度可分离的操作。self.conv3实现空间重组,与此同时加入se机制。然后再stride=1的条件下做残差。

关于速度的思考
在速度方面,经过大量实验,发现在算力足够的GPU平台上,MobileNet不会带来任何速度上的提升(有时甚至是下降的),然而在计算能力有限的平台上,MobileNet能让速度提升三倍以上。
那么,为什么GPU上表现乏力的GPU,到CPU上反而一骑绝尘了呢?我们要了解几个概念,计算量与访存量以及计算强度。

计算量: 指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度。单位是 #FLOP or FLOPs。也就是我们上面计算的浮点计算数。

访存量: 指的是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。在理想情况下(即不考虑片上缓存),模型的访存量就是模型各层权重参数的内存占用(Kernel Mem)与每层所输出的特征图的内存占用(Output Mem)之和。单位是Byte。由于数据类型通常为float32 ,因此需要乘以四。

计算强度: 由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每Byte内存交换到底用于进行多少次浮点运算。单位是FLOPs/Byte。可以看到,模计算强度越大,其内存使用效率越高。

Mobilenet计算量与访存量都很小,相较于VGG等模型,他的计算强度较低,当采用GPU算力高的机器计算时,Mobilenet会处于Memory-bound区域,即GPU的访存跟不上,导致算力无法充分发挥。而CPU算力有限(每秒提供的FLOPS有限),配合CPU的访存量,Mobilenet可以达到CPU算力理论峰值。因此,Mobilenet在CPU端可以运行得更快。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米手机连接校园网无法跳转到登录界面

问题:小米手机 MIUI12 系统,在连接校园网后显示需要登录,但是无法跳转到登录界面。连接其他wifi是没有问题的,但凡是需要登录的wifi就不行,会出现 net:ERR_CONNECTION_RESET... 试过很多方法,感觉这可能是…

Sunny-Ngrok内网穿透,本地主机的服务可以通过外网访问

1. 注册登录 https://www.ngrok.cc/login 2. 然后在 隧道管理->开通隧道 购买认证次数,花费2元,然后再实名认证即可 3. 购买并认证成功之后刷新页面,再次进入开通隧道,并购买最后一个免费的服务器(有钱可以购买好一点的) 根据提示填写隧道信息 4. 在隧道管理复制隧道id,并…

揭秘“移动云杯”行业赛道——医疗行业应用子赛道

【赛道介绍】 借开发者之力,探究多样化场景需求,开拓算网新生态,面向全球开发者,探索多样化算力网络应用场景,鼓励参赛者基于移动云产品能力,开发形成丰富的算力网络创新应用。 【赛题介绍】 1、参赛对象&a…

揭秘 “移动云杯”行业赛道——云电脑创新应用子赛道

【赛道介绍】 随着云计算技术的不断发展和普及,云电脑已经成为了人们日常生活中不可或缺的一部分。云电脑的出现,不仅改变了人们的工作方式和生活方式,同时也促进了各个领域的发展。比如在教育领域,云电脑可以提供在线学习、教学互…

揭秘“移动云杯”行业赛道——工业行业应用子赛道

【赛道介绍】 借开发者之力,探究多样化场景需求,开拓算网新生态,面向全球开发者,探索多样化算力网络应用场景,鼓励参赛者基于移动云产品能力,开发形成丰富的算力网络创新应用。 【赛程安排】 说明&#xff…

YouTuBe各类优秀频道推荐一电影解说

电影解说推荐 目录 九筒空间站: 大聪看电影: 宇哥讲电影: 阿斗归来了: 麦绿素 dustdream: 解说加入了很多自己的想法和解析,非常不错。 爱好恐怖片的美男子: 电影爆博士: …

2023 世界人工智能大会顺利召开,持续关注 AI+ 应用发展趋势

1 2023 世界人工智能大会顺利召开,持续关注 AI应用发展趋势 2023 年丐界人巟智能大会二 7 月 6 日至 8 日在上海丼办,主题为 “智联丐界,生成未来”。本届大会聚焦大模型、智能算力和具身智能成立大模型测试验证不卋同创新中心,联…

AIGC创投现状:激情与焦虑同行 | 圆桌论坛@中国AIGC产业峰会

明敏 萧箫 整理自 AIGC峰会量子位 | 公众号 QbitAI AIGC热得发烫,不跟上就会被淘汰。 这是当下创投圈最直观的感受。 但“跟上”并不是一件容易的事:怎么跟?朝什么方向跟? 一不留神,就可能与风口错过。 对初创公司而言…

人工智能时代,前端如何抓住机会

自从 2022 年底 OpenAI 推出了 ChatGPT3.5 后,GPT 的活跃用户数快速突破一亿,打破了互联网应用发展的历史记录。ChatGPT是一种基于人工智能技术的聊天机器人,它可以理解人类的自然语言,模拟人类的语言和思维方式,与人类…

精选 100 种最佳 AI 工具大盘点

为了应对对精简流程和数据分析日益增长的需求,整合人工智能工具在多个领域变得至关重要。 本文精选了2023年可用的100种最佳人工智能工具,旨在提高您的生产力、创造力和效率。 以下是 2023 年排名前 100 的人工智能工具: Aidoc:A…

我与计算机编程的不解之缘(2015.9~2022.1)

不解之缘:不能分开的缘分,指难以解除的密切关系。 虽然在计算机方面多有涉猎,但是我纯属是业余的,我学的能源与动力工程和材料物理与化学专业和计算机关联也不大。也可能是小小的缘分吧,在计算机应用领域摸爬滚打了六年…

深度学习中的算法学习与记忆,利用故事联想帮助大家记忆,每个人都会

大家好,我是微学AI,大家看过我的文章,想必是对深度学习有了一定的了解了,但是对于初学者来说,深度学习中有很多名词和数学知识、原理还是不太清楚,记忆的不牢固,用起来不熟练,今天就…

GPT系列的总结以及GPT4

GPT系列是OpenAI的一系列预训练文章,GPT的全称是Generative Pre-Trained Transformer,顾名思义,GPT的目的就是通过Transformer为基础模型,使用预训练技术得到通用的文本模型。目前已经公布论文的有文本预训练GPT-1,GPT…

【赠书:自己动手做聊天机器人】解析ChatGPT背后的工作原理

赠书方式见文末 作者:Marco Ramponi (选自Assembly AI) 来源:《机器之心》 编译(编辑:王强、蛋酱) 自 ChatGPT 发布以来,已经吸引了无数人一探究竟。但 ChatGPT 实际上是如何工作的…

2023火爆的11门编程语言

2023火爆的11门编程语言 对于我个人来说没有语言偏好,根据不同的应用领域和需求,不同的编程语言都有其独特的优势和适用性。无论使用何种语言只要能更好的实现需求,解决痛点问题,就是好语言。 那么各种语言应用的场景解决了哪些…

Windows运维的学习笔记(Win11)

1. 基本概念 Windows默认文件系统:NTFS 2. 快捷键 KeyDescriptionwinI打开系统设置ctrlshiftS打开截图功能ctrlshiftF在微软拼音输入法中切换简/繁体 Note 在Parsec远程会话中,win无法被发送至客户端,所以使用win的快捷键无法生效。 3. 窗…

R语言提取PDF表格数据#简单!!!

R语言提取PDF表格数据#简单!!! #需要用到pdftables包以及api号,api需要从https://pdftables.com网站注册申请api,一般申请后可以免费转50页pdf install.packages("pdftables") library("pdftables&qu…

uipath发送邮件 —— Send Outlook Mail Message

Send Outlook Mail Message 发送邮件 一、参数说明 1、Body : 需要发送的邮件内容 2、Subject : 需要发送邮件标题 3、MailMessage : 需要转发的邮件信息,此字段只允许类型是MailMessage的对象,若填写该项则上面的Email属性(Body、Subject)不会生效 …

清华大学学生程序设计竞赛暨高校邀请赛(THUPC)2023 - 初赛(待补题)

心得 看题跟榜比较无力,最终5h4题罚坐 M. 世界杯 输出China即可 K. 众数(前缀和) 最优策略是先取最大的数x,设其出现次数为cnt[x], 然后把小于x的数y每个取min(cnt[y],cnt[x]), 下一轮再取剩下的最大…

3月29日!中国AIGC产业峰会最新议程嘉宾名单公布!

组委会 发自 凹非寺量子位 | 公众号 QbitAI 这是信息量爆炸的一周,AIGC相关的新讯息持续涌现,不断冲击我们对人工智能的认知。 ChatGPT、Midjourney、Phenaki等一系列颠覆性的AIGC产品,正在改变我们的日常生活。 人人都在谈论这些新兴的AI产品…