深度学习之图像分类(十)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. ubuntu14.04 下安装jdk1.8
  2. 以太网Ethernet解码概述
  3. mysql case when 解释_mysql 语法一 :case when详解
  4. 《网络对抗》Exp5 MSF基础应用
  5. 吴恩达深度学习2.2笔记_Improving Deep Neural Networks_优化算法
  6. windows下 gcc 下载及使用指南
  7. EVM和RF的各种技巧知识详解(转)
  8. UniWebView 3 使用心得
  9. 【解决方案】校园明厨亮灶监控系统实施方案
  10. python对称加密算法库_对称加密算法
  11. 自学PS-持续更新 共勉
  12. MessageCenterUI.exe - 无法找到入口 无法定位程序输入点
  13. 使用PlotNeuralNet绘制自己的网络结构图
  14. 动网新闻系统IWMS中实现带标题幻灯片的功能效果
  15. 基于问答对的问答系统方案设计
  16. 人工智能学习总结(1)——人工智能的三个分支:认知、机器学习、深度学习
  17. Windows 查看系统信息及系统启动时间
  18. 【Linux系统移植】NXP 官方开发板 kernel内核 编译与烧录
  19. 实现纯前端生成字母头像
  20. rk3588-云手机-docker

热门文章

  1. python常用变量名命名_python的变量命名及其使用
  2. Java之stream流去重,单字段,多字段都可
  3. linux学习笔记--命令
  4. Unity3D笔记 英保通二
  5. 深入浅出 gRPC 02:gRPC 客户端创建和调用原理
  6. 无线网服务器有辐射吗,无线路由器放在床附近对人有辐射么?
  7. 复数-共轭-埃尔米特矩阵(Hermite矩阵)-正定矩阵
  8. 拳头公布新的五年计划,继MOBA之后下一款热门是什么?
  9. MT7628 Openwrt21 Fibocom FM650-CN驱动添加rndis拨号
  10. chmod 命令参数