【留言送书】轻量级骨架首选:MobileNetV3完全解析

2021年,文末留言送书精选留言中送出书籍一本!

前言

相对重量级网络而言,轻量级网络的特点是参数少、计算量小、推理时间短。更适用于存储空间和功耗受限的场景,例如移动端嵌入式设备等边缘计算设备。因此轻量级网络受到了广泛的关注,其中MobileNet可谓是其中的佼佼者。MobileNetV3经过了V1和V2前两代的积累,性能和速度都表现优异,受到学术界和工业界的追捧,无疑是轻量级网络的“抗把子“。MobileNetV3 参数是由NAS(network architecture search)搜索获取的,又继承的V1和V2的一些实用成果,并引人SE通道注意力机制,可谓集大成者。本文以应用为主,结合代码剖析MobileNetV3的网络结构,不会对NAS以及其设计思想做过多解析。

「论文来源」
https://arxiv.org/abs/1905.02244
「代码来源」
https://github.com/xiaolai-sqlai/mobilenetv3

主要特点

  1. 论文推出两个版本:Large 和 Small,分别适用于不同的场景;
  2. 使用NetAdapt算法获得卷积核和通道的最佳数量;
  3. 继承V1的深度可分离卷积;
  4. 继承V2的具有线性瓶颈的残差结构;
  5. 引入SE通道注意力结构;
  6. 使用了一种新的激活函数h-swish(x)代替Relu6,h的意思表示hard;
  7. 使用了Relu6(x + 3)/6来近似SE模块中的sigmoid;
  8. 修改了MobileNetV2后端输出head;

整体结构

上图为MobileNetV3的网络结构图,large和small的整体结构一致,区别就是基本单元bneck的个数以及内部参数上,主要是通道数目。

small和large版本参数

上表为具体的参数设置,其中bneck是网络的基本结构。SE代表是否使用通道注意力机制。NL代表激活函数的类型,包括HS(h-swish),RE(ReLU)。NBN 代表没有BN操作。s 是stride的意思,网络使用卷积stride操作进行降采样,没有使用pooling操作。

通道可分离卷积

通道分离卷积是MobileNet系列的主要特点,也是其发挥轻量级作用的主要因素。如下图,通道可分离卷积分为两个过程:1.channel方向通道可分离卷积;2.正常的1X1卷积输出指定的channel个数。

「代码实现」

# 首先利用1X1卷积进行通道压缩,可以进一步压缩模型大小
self.conv1 = nn.Conv2d(in_size, expand_size, kernel_size=1, stride=1, padding=0, bias=False)
self.bn1 = nn.BatchNorm2d(expand_size)
self.nolinear1 = nolinear # 激活函数,使用H-swish或H-relu
# 注意,通道可分离卷积使用分组卷积操作进行,这里分成和卷积核相同的channel组数实现。
self.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 = nolinear
# 利用1X1卷积输出指定通道个数的卷积,这一步一定要有,不然无法控制输出通道个数。也有聚合分离特征的作用
self.conv3 = nn.Conv2d(expand_size, out_size, kernel_size=1, stride=1, padding=0, bias=False)
self.bn3 = nn.BatchNorm2d(out_size)

SE模块

SE通道注意力机制,老生常谈的话题。这里不进行解析,直接给出代码。值得注意的是,这里利用1X1卷积实现的FC操作,本质上和FC是一样的。这里利用hsigmoid模拟sigmoid操作。

「代码实现」

class SeModule(nn.Module):
    def __init__(self, in_size, reduction=4):
        super(SeModule, self).__init__()
        self.se = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(in_size, in_size // reduction, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(in_size // reduction),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_size // reduction, in_size, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(in_size),
            hsigmoid())

def forward(self, x):
        return x * self.se(x)

h-swish 和 h-sigmoid

利用近似操作模拟swish和relu,公式如下:

「代码实现」

class hswish(nn.Module):
    def forward(self, x):
        out = x * F.relu6(x + 3, inplace=True) / 6
        return out

class hsigmoid(nn.Module):
    def forward(self, x):
        out = F.relu6(x + 3, inplace=True) / 6
        return out

bneck

核心模块,也是网络的基本模块。主要实现了通道可分离卷积+SE通道注意力机制+残差连接。结构图如下:

「代码实现」

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)) # 1X1卷积聚合特征
    if self.se != None: 
        out = self.se(out) # 通道注意力机制
    out = out + self.shortcut(x) if self.stride == 1 else out # 残差连接
    return out

网络输出

移除之前的瓶颈层连接,进一步降低网络参数。可以有效降低11%的推理耗时,而性能几乎没有损失。修改结构如下:

「代码实现」

out = F.avg_pool2d(out, 7)
out = out.view(out.size(0), -1)
out = self.hs3(self.bn3(self.linear3(out)))
out = self.linear4(out)
return out

后记

MobileNetV3结构简洁,性能强悍。你一定在yolov3、OCR等等任务上看到它的身影。本文从代码层面解析,希望能带给你一点收获!

最后,如果喜欢本篇文章,欢迎转发、点赞

(0)

相关推荐

  • 小白学PyTorch | 4 构建模型三要素与权重初始化

    文章目录: 1 模型三要素 2 参数初始化 3 完整运行代码 4 尺寸计算与参数计算 这篇文章内容不多,比较基础,里面的代码块可以复制到本地进行实践,以加深理解. 喜欢的话,可以给公众号加一个星标,点 ...

  • Hi,我们是-MobileNet-家族!

    作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...

  • NTU Machine Learning 2020 hw3 CNN的做法

    利用VGGnet来完成Image Classification,在Kaggle勉强过了Strong Baseline... 首先感谢一下NTU的李宏毅老师分享这么好的课程,还把作业也给分享了出来 作业 ...

  • 最后一届ImageNet冠军模型:SENet

    作者:小小将 编辑:黄俊嘉 前  言 在深度学习领域,CNN分类网络的发展对其它计算机视觉任务如目标检测和语义分割都起到至关重要的作用,因为检测和分割模型通常是构建在CNN分类网络(称为backbon ...

  • 【OCR技术系列之六】文本检测CTPN的代码实现

    这几天一直在用Pytorch来复现文本检测领域的CTPN论文,本文章将从数据处理.训练标签生成.神经网络搭建.损失函数设计.训练主过程编写等这几个方面来一步一步复现CTPN.CTPN算法理论可以参考这 ...

  • 将位置信息嵌入通道注意力!NUS提出新机制,显著提升卷积特征表达|CVPR2021

    作者丨Happy 编辑丨极市平台 极市导读 通道注意力机制对于提升模型性能极为有效,但是忽略了位置信息,这对于生成空间选择注意力图非常重要,本文将位置信息嵌入到通道注意力中,针对如何有效提升移动网络的 ...

  • 神经网络之CNN与RNN的关系

    机器学习算法与Python实战 长期跟踪关注统计学.数据挖掘.机器学习算法.深度学习.人工智能技术与行业发展动态,分享Python.机器学习等技术文章.回复机器学习有惊喜资料. 215篇原创内容 公众 ...

  • 罗山第一部村级乡情书——《我的河口寨》出版(留言送书)

    老家豫南  ID:ljyn_888 远离家乡的游子,喜欢在这里聊聊故乡.过往.世间百态,记录平凡人走过的时代.欢迎投稿.交流.军哥微信:37096414 6月29日,<我的河口寨>正式在罗 ...

  • 留言送书|青春不容虚度,大学到底该学些什么?

    近日,重庆一中学教师在开学典礼上的发言火了,她在演讲中问同学们,是否思考过这样一个问题:世界那么大,你凭什么去看看? 是啊,世界那么大,我们凭什么去看?作为在校大学生,大学四年我们应该学会些什么?才能 ...

  • 【送书】关注激萌一年了,不送点新年礼物合适吗?来留言啊~

    New Year's Day 激进阵线联萌 今天是激萌同大家度过的的第二个1月1日!不搞点事情怎么说得过去呢?这一次,激小萌联合三家出版社决定给大家发福利啦! 共14部.26本书.除以激萌的粉丝数,每 ...

  • 中秋快乐,转发锦鲤并留言,崔瑞送书!

    自从我信了"超越教",就心想事成. "盐城少女"杨超越... 因为抓阄加入101战队!!! 注意,是抓阄! 然后,人生开始开挂. 除了靠真诚的恐惧.无知,获得极 ...

  • 送书啦 | 流量池思维要火,抓住这3点帮你完成KPI

    一.教育市场的火爆与招生难 数据显示,2017年教育市场呈现出体量巨大,资本回暖,技术赋能的趋势--教育市场总规模趋近10万亿,3年平均复合增长12.2%:投资案例数及金额同比翻番,技术赋能投资占比提 ...

  • 【送书中奖名单】Python可视化居然可以这么玩!

    来自:开源最前线(ID:OpenSourceTop)  链接:https://ryven.org/ 如同艺术家们用绘画让人们更贴切的感知世界,数据可视化也能让人们更直观的传递数据所要表达的信息.你知道 ...

  • 免费送书,20本,关于架构的

    业务架构是跨系统的业务架构蓝图,应用架构.数据架构.技术架构是解决方案的不同方面. 画外音:文末送书. 多年来,全球业界已在业务架构.应用架构.数据架构.技术架构方面积累了大量经验. 近几年,数字化转 ...

  • 汤洛雯庆生,马国明留言送祝福,结果被网民嫌弃

    昨天(5月6日)是TVB花旦汤洛雯34岁的生日,汤洛雯在社交平台发布了独自庆生的照片,照片上面是一个小型生日蛋糕,上面插着一只独角兽小马,旁边还有一大束鲜花.汤洛雯正闭着眼睛许愿,那么问题来了,照片是 ...

  • 6大系列,90+篇,Power Query知识全面汇总!兼3月送书活动!

    - 1 - 基础操作及应用 Power Query基础功能操作_01 Power Query基础功能操作_02 Power Query基础功能操作_03 数据转置,有一点点需要注意的地方 能Excel ...