深度学习之图像分类(十)--MobileNetV1 网络结构
深度学习之图像分类(十)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+Dk21,通常 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 网络结构相关推荐
- 深度学习之图像分类(十六)-- EfficientNetV2 网络结构
深度学习之图像分类(十六)EfficientNetV2 网络结构 目录 深度学习之图像分类(十六)EfficientNetV2 网络结构 1. 前言 2. 从 EfficientNetV1 到 Eff ...
- 深度学习之图像分类(十二)--MobileNetV3 网络结构
深度学习之图像分类(十二)MobileNetV3 网络结构 目录 深度学习之图像分类(十二)MobileNetV3 网络结构 1. 前言 2. 更新 BlocK (bneck) 3. 重新设计激活函数 ...
- 深度学习之图像分类(十四)--ShuffleNetV2 网络结构
深度学习之图像分类(十四)ShuffleNetV2 网络结构 目录 深度学习之图像分类(十四)ShuffleNetV2 网络结构 1. 前言 2. Several Practical Guidelin ...
- 深度学习之图像分类(二十五)-- S2MLPv2 网络详解
深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...
- 深度学习之图像分类(十九)-- Bottleneck Transformer(BoTNet)网络详解
深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 目录 深度学习之图像分类(十九)Bottleneck Transformer(BoTNet)网络详解 1 ...
- 深度学习之图像分类(二十六)-- ConvMixer 网络详解
深度学习之图像分类(二十六)ConvMixer 网络详解 目录 深度学习之图像分类(二十六)ConvMixer 网络详解 1. 前言 2. A Simple Model: ConvMixer 2.1 ...
- 深度学习之图像分类(九)--ResNeXt 网络结构
深度学习之图像分类(九)ResNeXt 网络结构 目录 深度学习之图像分类(九)ResNeXt 网络结构 1. 前言 2. 组卷积 3. ResNeXt block 分析 4. 代码 本节学习 Res ...
- 深度学习之图像分类(二十八)-- Sparse-MLP(MoE)网络详解
深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 目录 深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 1. 前言 2. Mixture of Experts 2 ...
- 干货丨深度学习、图像分类入门,从VGG16卷积神经网络开始
刚开始接触深度学习.卷积神经网络的时候非常懵逼,不知道从何入手,我觉得应该有一个进阶的过程,也就是说,理应有一些基本概念作为奠基石,让你有底气去完全理解一个庞大的卷积神经网络: 本文思路: 一.我认为 ...
最新文章
- ubuntu14.04 下安装jdk1.8
- 以太网Ethernet解码概述
- mysql case when 解释_mysql 语法一 :case when详解
- 《网络对抗》Exp5 MSF基础应用
- 吴恩达深度学习2.2笔记_Improving Deep Neural Networks_优化算法
- windows下 gcc 下载及使用指南
- EVM和RF的各种技巧知识详解(转)
- UniWebView 3 使用心得
- 【解决方案】校园明厨亮灶监控系统实施方案
- python对称加密算法库_对称加密算法
- 自学PS-持续更新 共勉
- MessageCenterUI.exe - 无法找到入口 无法定位程序输入点
- 使用PlotNeuralNet绘制自己的网络结构图
- 动网新闻系统IWMS中实现带标题幻灯片的功能效果
- 基于问答对的问答系统方案设计
- 人工智能学习总结(1)——人工智能的三个分支:认知、机器学习、深度学习
- Windows 查看系统信息及系统启动时间
- 【Linux系统移植】NXP 官方开发板 kernel内核 编译与烧录
- 实现纯前端生成字母头像
- rk3588-云手机-docker