MobileNet 论文阅读 #paper reading_奔跑的汉堡包的博客-程序员秘密

技术标签: CNN  模型复杂度  深度学习  mobilenet  

最近做笔试题考了一道这样的选择题:
用CPU和GPU分别跑以下网络,如果时间分别为X和Y,以下哪个网络的X/Y最大?
A、AlextNet B、VGG19 C、ResNet101 D、MobileNet
仔细一想,其实就是考察哪个网络的参数最多,需要的计算量最大,其实这些网络差别还是比较大的,特别是ResNet,网络非常深,所以不需要具体的计算参数量,只需要大体的计算一个深度就可以(个人理解,可能有错误)。但是对MobileNet不是很熟悉,所以第一时间要读一下,另外就是MobileNet V2、V3版本似乎是自动学出来的?也还是蛮有兴趣。
这个名字的由来,就是因为这个网络使得CNN部署在移动端、嵌入式等设备成为了可能,因此取名“Mobile” Net。那么这篇论文是怎么减少网络参数,降低了训练的复杂度的呢?这还要从神经网络FLOPS的计算说起:
对于一个神经网络,最主要的计算来自于乘法,像是卷积层的卷积操作,和全连接层的全连接操作等,一般来说,计算神经网络的FLOPS,是忽略掉池化、激活函数和偏置这些操作的,因为其实这些操作并不会占很大的比例。(其实全连接层也没有占很大,主要来自于卷积操作)。对于一个卷积层,我们假设这一层的输入特征大小是 ( D F , D F , M ) (D_{F},D_{F},M) (DF,DF,M),输出的特征大小是 ( D G , D G , N ) (D_{G},D_{G},N) (DG,DG,N),这其中有一个维度变化,因此需要一个卷积核来执行升维(降维),卷积核大小为 ( D K , D K , M , N ) (D_{K},D_{K},M,N) (DK,DK,M,N),一般来说,输入输出的特征、卷积核的长和宽都是相等的。那么这层卷积的FLOPS为:
D G ∗ D G ∗ D K ∗ D K ∗ M ∗ N ( 1 ) D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M\ast N(1) DGDGDKDKMN1
怎么来的呢,首先,输入图像的像素点,需要与卷积核进行卷积操作,一个像素点的卷积操作,需要的FLOPS数量为 D K ∗ D K D_{K}\ast D_{K} DKDK,那么一共有多少个点需要做卷积操作呢,一共有 D G ∗ D G ∗ N D_{G}\ast D_{G}\ast N DGDGN个像素点,也就是输出的每一个像素值,都是经过一次卷积操作得到的,所以最终需要 D G ∗ D G ∗ D K ∗ D K ∗ M ∗ N D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M\ast N DGDGDKDKMN的FLOPS,如果加上偏置,那么就需要 D G ∗ D G ∗ D K ∗ D K ∗ M ∗ N + D G ∗ D G ∗ N D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M\ast N+D_{G}\ast D_{G}\ast N DGDGDKDKMN+DGDGN
为什么要详细算一下这个公式呢,因为MobileNet是从这个公式出发,用两个超参数对这个公式进行了处理优化,使得总的公式不变的条件下,计算量大大降低。MobileNet使用了叫做Depthwise separable convolution的模块,这个模块包括两个卷积操作:一个叫做depthwise convolution,使用的卷积核大小为 ( D K , D K , M ) (D_{K},D_{K},M) (DK,DK,M),这个卷积核的作用是,输出一个与输入特征维度相同,与目标输出长宽相同的中间特征 ( D G , D G , M ) (D_{G},D_{G},M) (DG,DG,M),也就是输入特征的每一个channel(1~M),与对应的卷积核的每一个channel做卷积,计算量为 D G ∗ D G ∗ D K ∗ D K ∗ M D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M DGDGDKDKM;另一个卷积操作叫做pointwise convolution,作用是升维(降维),卷积核大小为 ( 1 , 1 , M , N ) (1,1,M,N) (1,1,M,N),计算量为 D G ∗ D G ∗ M ∗ N D_{G}\ast D_{G}\ast M\ast N DGDGMN 1 ∗ 1 1\ast1 11的卷积核常常用来做升维、降维)。那么总的FLOPS,就是两部分相加: D G ∗ D G ∗ D K ∗ D K ∗ M + D G ∗ D G ∗ M ∗ N ( 2 ) D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M+D_{G}\ast D_{G}\ast M\ast N(2) DGDGDKDKM+DGDGMN2
比较一下式(1)和式(2), D G ∗ D G ∗ D K ∗ D K ∗ M + D G ∗ D G ∗ M ∗ N D G ∗ D G ∗ D K ∗ D K ∗ M ∗ N = 1 N + 1 D K ∗ D K \frac{D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M+D_{G}\ast D_{G}\ast M\ast N}{D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast M\ast N}=\frac{1}{N}+\frac{1}{D_{K}\ast D_{K}} DGDGDKDKMNDGDGDKDKM+DGDGMN=N1+DKDK1,可以看出完全是成倍的降低了运算量,同时卷积的输出并没有什么改变。文章提到,在第一部分使用 3 ∗ 3 3\ast3 33的卷积核,可以降低8~9倍的计算量,同时精度只会有略微的降低。
普通卷积,和文章提出的depthwise separable convolution的对比
具体网络架构:
MobileNet包括了一层的传统卷积层(第一层),和一个全连接层(最后一层),这个与ResNet是一样的。剩余的都是包括两层卷积操作的Depthwise separable convolution模块,这两层卷积每一层后面都加了一个BN和Relu(第一层传统卷积层也是有BN和Relu的,但是全连接层没有,全连接层加的是softmax)。
Depthwise separable convolution模块中的两个卷积,每一层后面都加了BN和Relu
如果一个Depthwise separable conbolution模块计算为两层卷积,那么MobileNet网络一共有28层。
除去图中的Avg Pool和Softmax,一共有28层(图中有十层折叠起来了)
有了这些之后,作者还是不满意,表示还有很多应用环境之下,要求模型需要更快,计算量更少,于是引入了第一个超参(width multiplier) α \alpha α。这个 α \alpha α作用在channel上,是一个0~1之间的系数,每一层都使用同样的 α \alpha α,添加之后计算量的公式为: D G ∗ D G ∗ D K ∗ D K ∗ α M + D G ∗ D G ∗ α   M ∗ α N D_{G}\ast D_{G}\ast D_{K}\ast D_{K}\ast\alpha M+D_{G}\ast D_{G}\ast\alpha\ M\ast\alpha N DGDGDKDKαM+DGDGα MαN
也就是每一层中的每一个channel,M和N之前都乘一个系数 α \alpha α,这个系数可以看作与剪枝、dropout相似,是为了降低模型的复杂性,抛弃一部分维度,做速度和精度的折衷。引入 α \alpha α后,计算量减少 α 2 \alpha^{2} α2
有了第一个超参,用同样的思想,很自然的就能想到去降低分辨率,也就是特征图的大小,来降低计算量。于是文章引入了第二个超参(resolution multiplier) ρ \rho ρ,作用在特征图上,引入第二个超参之后,计算量:
ρ D G ∗ ρ D G ∗ D K ∗ D K ∗ α M + ρ D G ∗ ρ D G ∗ α   M ∗ α N \rho D_{G}\ast\rho D_{G}\ast D_{K}\ast D_{K}\ast\alpha M+\rho D_{G}\ast\rho D_{G}\ast\alpha\ M\ast\alpha N ρDGρDGDKDKαM+ρDGρDGα MαN
具体实现来说,就是直接把输入特征大小限制一下就可以了,比如原本输入是224×224( ρ = 1 \rho=1 ρ=1),我们把输入改为112*112( ρ = 0.5 \rho=0.5 ρ=0.5),当然后面的特征大小也都要改变。同样的,引入第二个超参可以降低模型计算量 ρ 2 \rho^{2} ρ2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29679623/article/details/100750937

智能推荐

计算年year、月month和日day对应的是该年的第几天_最快乐星球居民的博客-程序员秘密

6-1 计算年year、月month和日day对应的是该年的第几天 (10 分)自定义1个函数day_of_year(year, month, day),计算并返回年year、月month和日day对应的是该年的第几天。函数接口定义:int day_of_year(year, month, day);year, month, day分别为输入的年,月,日裁判测试程序样例:#includ...

python如何关闭multiprocess_Python(29):Python程序中的进程操作(multiprocess.process)_weixin_39995351的博客-程序员秘密

一、multiprocess模块multiprocess不是一个模块而是python中一个操作、管理进程的包。子模块分为四个部分:创建进程部分(multiprocess.process)进程同步部分((multiprocess.Lock))进程池部分((multiprocess.Pool))进程之间数据共享(ThreadLocal、multiprocess.Queue、Pipes)二、multip...

错误 C4996 'strcpy': This function or variable may be unsafe. Consider using 的解决(基于visual studio2017)_let米的博客-程序员秘密

#include "stdafx.h"#include <iostream>#include <cstring>using namespace std;#define use_CRT_SECURE_NO_WARNINGS// String 类定义class String{public: String(); ...

netty 接收不到客户端传来的消息_Netty客户端发送消息并同步获取结果_weixin_39658019的博客-程序员秘密

客户端发送消息并同步获取结果,其实是违背Netty的设计原则的,但是有时候不得不这么做的话,那么建议进行如下的设计:比如我们的具体用法如下:NettyRequest request = new NettyRequest();request.setRequestId(UUID.randomUUID().toString());request.setClassName(method.getDeclar...

Timeline 时间轴_反内卷第一名的博客-程序员秘密

Timeline 时间轴Timeline 时间轴可视化地呈现时间流信息。基础用法可参照element官网时间轴太长可鼠标滚动<el-scrollbar wrapClass="scrollbar-wrap" style="height: 10rem" ref="scrollbarContainer"> <div> // 时间轴代码可参考element官网 <el-timeline>

微笑一下就过了_whatiwhere的博客-程序员秘密

请使用微笑过关源代码以上为题目打开的界面为额 先看源码吧发现这里指向了一个新的链接得到php源码<?php header("Content-type: text/html; charset=utf-8"); if (isset($_GET['view-source'])) { show_source(__FILE__); ...

随便推点

使用qt播放本地视频与rtsp流之vlc-qt_qt vlc_小菜刀_的博客-程序员秘密

使用qt 编写视频播放程序,想到两种方案分别是:qt+ffmpeg和 qt+vlc。qt+vlc又有两种,一种是qt+libvlc,一种是qt+ vlc-qt 库。本文是介绍如何编译及使用vlc-qt库和vlc-qt-examples。安装编译依赖包apt install -y qtcreatorapt install -y qt5-qmake qtbase5-devapt install -y qtdeclarative5-devcd /usr/lib/mips64el-linux-gun

dedecms教程:文章内页获取缩略图的调用标签_buzhang1314的博客-程序员秘密

文章内容页缩略图的调用,图片集内容页缩略图的调用,相信大家都想找这个,对于初学者来说,很容易混淆。 比如大江网络就在这个问题上犯 了糊涂,大江网络在跟客户做网站的过程中,在内页用到了缩略图的调用。当时也没注意,直接写了[filed:picname/]后来客户反映调用出错。于 是查找了一下原因发现在dedecms中,内页想调用缩略图只能用{dede:field.picname/}来实现。

Android定制RadioButton样式三种实现方法_ThunderRong的博客-程序员秘密

三种方法实现Android定制RadioButton样式:使用XML文件进行定义/在JAVA代码中定义等等,感兴趣的朋友可以参考下,希望可以帮助到你三种方法 1.使用XML文件进行定义 res/drawable/radio.xml 复制代码代码如下:   android:state_checked="false" android:drawable

解决DDMS模拟器无法查看data目录_yzzCool的博客-程序员秘密

解决DDMS模拟器无法查看data目录在查看数据库是否创建成功时,发现竟然打不开data目录: 为了查看安卓设备上某个应用的SQLite数据库内容,打开了DDMS,能看到data文件夹,但是打不开。 可是mnt文件夹却是可以打开的,然后仔细查看两个文件夹的不同: data drwxrsw–x mnt drwxrwxr-x mnt drwxr-xr-x 好像少了read权限

PAT 甲级 A1136 A Delayed Palindrome (20 分)_不会写程序猿的代码的博客-程序员秘密

题目传送门签到题给搞了半天,一开始我没看到数据范围要到1000。后面看到了这个之后根本就开始改了,longlong会爆炸数据范围只能得18分,最后一个测试点过不去。于是呢就放弃用longlong,自己写了一个高精度的加法(用string),代码有点长。愿意看的同学就看一看吧。//// Created by 曾仕邦 on 2021/9/10.//#include "bits/stdc++.h"using namespace std;typedef long long ll;bool che

中国国内开源网站都有哪些呢?_chuanzou4767的博客-程序员秘密

先说说自己常用的吧,后面那些是从百度百科上搞过来的。 1.http://www.oschina.net/开源中国社区,这是我接触到的第一个开源相关的社区。 2.http://git.oschina.net/代码托管,个人理解就是中国话的github,一个代码托管的地方,开始学着用了,管理代...

推荐文章

热门文章

相关标签