深度学习之图像分类(十)MobileNetV1 网络结构

目录

  • 深度学习之图像分类(十)MobileNetV1 网络结构
    • 1. 前言
    • 2. DW 卷积
    • 3. Depthwise Separable Conv 深度可分卷积操作
    • 4. MobileNetV1 网络结构
    • 5. 代码

本节学习 MobileNetV1 网络结构。学习视频源于 Bilibili,感谢霹雳吧啦Wz,建议大家去看视频学习哦。

1. 前言

在传统卷积神经网络中,内存需求大,运算量打,导致无法在移动设备以及嵌入式设备上运行,例如在手机上等等。VGG16 大概有 490M 模型参数,ResNet152 大概有 644M 模型参数。为了服务于社会,网络不能仅仅停留在实验室。为了推动神经网络应用于现实世界,MobileNet 氤氲而生。

MobileNet 是由google团队在 2017 年提出的,专注于移动端或者嵌入式设备中的轻量级 CNN 网络。相比于传统的卷积神经网络而言,在准确率小幅降低的前提下,大大减少了模型的参数与运算量。MobileNetV1 相比 VGG16 准确率低了 0.9%,但是模型参数量仅仅有 1/32。其原始论文为 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications。

MobileNetV1 网络中的亮点包括:

  • Depthwise Convolution 大大减少运算量以及参数量
  • 增加超参数 α,β\alpha, \betaα,β,α\alphaα 控制卷积层卷积核数量,β\betaβ 控制输入图像大小,都是人为自己设定的

2. DW 卷积

在传统卷积中,卷积核的channel与输入特征矩阵的channel是一致的,卷积核的个数对应于输出特征矩阵的channel。而在 DW 卷积中,每个卷积核的 channel 都是为 1 的,也就是对输入特征图的每一个 channel 单独进行卷积。既然每一个卷积核负责输入通道的一个 channel,那么卷积核的个数就是输入通道 channel 的个数,输出特征图通道 channel 数也和输入特征矩阵的通道 channel 数一致。如果要升通道数,那就 n 个卷积核对应一个输入矩阵的 channel,输出矩阵的通道数为输入矩阵通道数的 n 倍。这其实就是 group 数等于输入通道数的组卷积。但是实际上,mobileNet 是靠 PW 卷积去升通道数的。

3. Depthwise Separable Conv 深度可分卷积操作

Depthwise Separable Conv 由两部分组成,DW 卷积以及 PW 卷积。其实 PW 卷积就是 1×11 \times 11×1 卷积。先通过 DW 卷积,再通过 PW 卷积。

Depthwise Separable Conv 能节省多少参数呢?我们来做一个计算。普通卷积的计算量为 Dk×Dk×M×N×DF×DFD_k \times D_k \times M \times N \times D_F \times D_FDk​×Dk​×M×N×DF​×DF​, 而先使用 DW 卷积,再使用 PW 卷积的计算量为 Dk×Dk×M×DF×DF+M×N×DF×DFD_k \times D_k \times M \times D_F \times D_F + M \times N \times D_F \times D_FDk​×Dk​×M×DF​×DF​+M×N×DF​×DF​。所以说理论上其为普通卷积的 1N+1Dk2\frac{1}{N} + \frac{1}{D_k^2}N1​+Dk2​1​,通常 Dk=3D_k = 3Dk​=3,即使用 3×33 \times 33×3 卷积,而 NNN 通常为几十上百,所以理论上普通卷积计算量为 DW + PW 的 8 到 9 倍。

(悄悄说,我们最近的研究中,正交构造法得到的窗导数就是这个深度可分卷积模型!)

4. MobileNetV1 网络结构

MobileNetV1 网络结构如下图所示,其中 Conv 表示普通卷积,Conv dw 表示 DW 卷积操作。在实验结果中,α\alphaα 控制使用卷积核的倍率,β\betaβ 控制输入图像尺寸。当卷积核数量取 0.75 时,正确率降低了两个点,但是模型参数量核计算量少了近一半。同样的,减少输入尺寸从 224 到 192 时,计算量也有大幅降低,而正确率降低较少。我们可以基于自己的应用和资源设定 α\alphaα 和 β\betaβ 选择合适的模型。此时卷积的计算量变为 Dk×Dk×α×M×β×DF×β×DF+α×M×α×N×β×DF×β×DFD_k \times D_k \times \alpha \times M \times \beta \times D_F \times \beta \times D_F + \alpha \times M \times \alpha \times N \times \beta \times D_F \times \beta \times D_FDk​×Dk​×α×M×β×DF​×β×DF​+α×M×α×N×β×DF​×β×DF​。按理说只有输出 NNN 才乘 α\alphaα 呀,DW 卷积保通道数,但是实际上输入 MMM 因为上一层的原因乘上了 α\alphaα。

可以看到,MobileNetV1 有 95% 的计算量和 74.59% 的参数集中在 1 x 1 的卷积层上,而且几乎另外的参数也都在全连接层上。

具体 MobileNetV1 实验部分结果就不在赘述了。值得指出的是,很多人在使用时发现训练完之后,DW 卷积核很容易废掉,即卷积核参数大部分为 0。针对这个问题在 MobileNetV2 会有改善。

5. 代码

MobileNetV1 实现代码如下所示:

# 非官方实现import torch
class MobileNet(nn.Module):def __init__(self):super(MobileNet, self).__init__()def conv_bn(inp, oup, stride):    # 第一层传统的卷积:conv3*3+BN+ReLUreturn nn.Sequential(nn.Conv2d(inp, oup, 3, stride, 1, bias=False),nn.BatchNorm2d(oup),nn.ReLU(inplace=True))def conv_dw(inp, oup, stride):      # 其它层的depthwise convolution:conv3*3+BN+ReLU+conv1*1+BN+ReLUreturn nn.Sequential(nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),nn.BatchNorm2d(inp),nn.ReLU(inplace=True),nn.Conv2d(inp, oup, 1, 1, 0, bias=False),nn.BatchNorm2d(oup),nn.ReLU(inplace=True),)self.model = nn.Sequential(conv_bn(  3,  32, 2),   # 第一层传统的卷积conv_dw( 32,  64, 1),   # 其它层depthwise convolutionconv_dw( 64, 128, 2),conv_dw(128, 128, 1),conv_dw(128, 256, 2),conv_dw(256, 256, 1),conv_dw(256, 512, 2),conv_dw(512, 512, 1),conv_dw(512, 512, 1),conv_dw(512, 512, 1),conv_dw(512, 512, 1),conv_dw(512, 512, 1),conv_dw(512, 1024, 2),conv_dw(1024, 1024, 1),nn.AvgPool2d(7),)self.fc = nn.Linear(1024, 1000)   # 全连接层def forward(self, x):x = self.model(x)x = x.view(-1, 1024)x = self.fc(x)return x

深度学习之图像分类(十)--MobileNetV1 网络结构相关推荐

  1. 深度学习之图像分类(十六)-- EfficientNetV2 网络结构

    深度学习之图像分类(十六)EfficientNetV2 网络结构 目录 深度学习之图像分类(十六)EfficientNetV2 网络结构 1. 前言 2. 从 EfficientNetV1 到 Eff ...

  2. 深度学习之图像分类(十二)--MobileNetV3 网络结构

    深度学习之图像分类(十二)MobileNetV3 网络结构 目录 深度学习之图像分类(十二)MobileNetV3 网络结构 1. 前言 2. 更新 BlocK (bneck) 3. 重新设计激活函数 ...

  3. 深度学习之图像分类(十四)--ShuffleNetV2 网络结构

    深度学习之图像分类(十四)ShuffleNetV2 网络结构 目录 深度学习之图像分类(十四)ShuffleNetV2 网络结构 1. 前言 2. Several Practical Guidelin ...

  4. 深度学习之图像分类(二十五)-- S2MLPv2 网络详解

    深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...

  5. 深度学习之图像分类(十九)-- Bottleneck Transformer(BoTNet)网络详解

    深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 目录 深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 1 ...

  6. 深度学习之图像分类(二十六)-- ConvMixer 网络详解

    深度学习之图像分类(二十六)ConvMixer 网络详解 目录 深度学习之图像分类(二十六)ConvMixer 网络详解 1. 前言 2. A Simple Model: ConvMixer 2.1 ...

  7. 深度学习之图像分类(九)--ResNeXt 网络结构

    深度学习之图像分类(九)ResNeXt 网络结构 目录 深度学习之图像分类(九)ResNeXt 网络结构 1. 前言 2. 组卷积 3. ResNeXt block 分析 4. 代码 本节学习 Res ...

  8. 深度学习之图像分类(二十八)-- Sparse-MLP(MoE)网络详解

    深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 目录 深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 1. 前言 2. Mixture of Experts 2 ...

  9. 干货丨深度学习、图像分类入门,从VGG16卷积神经网络开始

    刚开始接触深度学习.卷积神经网络的时候非常懵逼,不知道从何入手,我觉得应该有一个进阶的过程,也就是说,理应有一些基本概念作为奠基石,让你有底气去完全理解一个庞大的卷积神经网络: 本文思路: 一.我认为 ...

最新文章

  1. 干货 | 神经网络原来这么简单,机器学习入门贴送给你
  2. 面包好吃却五毒俱全,吃前请三思!
  3. Chrome 解决flash问题
  4. Dubbo服务降级配置
  5. 如何正确刷题计算机考研,2020考研:4个方法教你数学如何正确刷题!
  6. 使用Spring MVC时的常见错误
  7. 【渝粤题库】国家开放大学2021春2726畜禽生产概论题目
  8. VS2013正在等待所需操作完成
  9. ArcGIS 9.3/9.3.1 客户端 API 更新信息--2009年5月
  10. 做餐饮服务员有前途吗
  11. 字母数字-ASCII码表(最详细,最直观)
  12. 2019新版35 U.S.C. 101专利适格性审查指南 新增「抽象概念三分类」及「整合至实际应用」判定标准
  13. 【Algorithm】数学归纳法
  14. namecheap注册域名优惠码
  15. AndroidStudio有时候调试会一直卡在:starting LLDB server
  16. Codeforces407C Curious Array
  17. Unity出IOS包报错记 -1
  18. 用日记APP来记录生活,再也不用担心无法坚持写日记
  19. OLTP与OLAP理解
  20. E1协议转换器使用中常见故障问题及处理方法总结

热门文章

  1. 脚本之家----ok
  2. php volist没有数据,thinkphp里volist不显示?
  3. 摄影技术入门知识及答疑
  4. 博士之路-大龄博士也能发光
  5. 魅族MX简单实用小技巧+使用启示+新人必看
  6. 软件人生感触之一 深度和广度
  7. 看spring cloud开源项目Pig的云踩坑记
  8. MixNet解析以及pytorch源码
  9. EntityFrameworkCore2.1的安装使用和其中遇到的那些坑
  10. 【Django框架】——06 Django入门——2.站点管理