初识mobilenet v1

Depthwise separable convolution

深度级可分离卷积其实是一种可分解卷积操作(factorized convolutions).将卷积分解成两个更小的操作:

  • depthwise convolution
  • pointwise convolution

在标准卷积中,其卷积核作用于所有输入通道上(input channel).如输出图片为:(6,6,3),原来卷积操作是:(4,4,3,5).4X4的卷积大小,3是卷积的通道数,5是卷积核的数量.其输出尺寸为\frac{6-4}{1}+1=3,其输出特征为(3,3,5),如图所示(同一个卷积核作用在所有通道上):

image

不同通道结果相加得到该卷积核的感受野的值.

深度分离卷积(depthwise convolution),针对每个输入通道采用不同的卷积核,就是说一个卷积核对应一个输入通道.如图所示:


image

输入有3个通道,对应着有3个大小为(4,4,1) (4,4,1)(4,4,1)的深度卷积核,卷积结果共有3个大小为(3,3,1) (3,3,1)(3,3,1)

最后,采用pointwise convolution.pointwise convolution其实就是普通的卷积,只不过其采用1x1的卷积核。1 X 1的卷积核作用 用于将不同通道的值相加.

depthwise convolution先将通道(深度)分别进行卷积操作,再用pointwise convolution(1X1的卷积)进行通道间的卷积感受野值相加 最终结果与标准卷积类似.

官方示意图如下所示:


image

计算量估计

假设输入特征图大小为:D_{f} * D_{f}*M,而输出特征图大小为:D_{f} * D_{f} * N
假设特征图的width与height,与输出图大小一样,两者差别在于通道.

标准卷积

对于标准卷积(D_{k} * D_{k}):

每个卷积核的乘积计算量:D_{K} * D_{K}

单个通道输出特征图边长所需的乘积计算量:D_{F} * D_{F} * D_{K} *D_{K}

单个卷积核跨通道值相乘:D_{F} * D_{F} * D_{K} * D_{K} * M

N个卷积:D_{F} * D_{F} * D_{K} * D_{K} * M * N

depthwise convolution

对于每一个通道,都有一个卷积,所以其计算量为:D_{K} * D_{K} *D_{F} * D_{K} * M

pointwise convolution

1*1卷积,其计算量为:
M * N * D_{F} * D_{F}

最后比较depthwise separable convolution和标准卷积如下:
\frac{M * N * D_{F} * D_{F} + D_{K} * D_{K} *D_{F} * D_{K} * M}{D_{F} * D_{F} * D_{K} * D_{K} * M * N} = \frac{1}{N} + \frac{1}{D_{K}^{2}}

一般情况下 N 比较大,那么如果采用3x3卷积核的话,depthwise separable convolution相较标准卷积可以降低大约9倍的计算量。其实,后面会有对比,参数量也会减少很多。

mobilenet v1 结构

基础结构如图:

image

原始的mobilenet v1 用于imagenet分类任务中,整个网络有28层.

image

mobilenet 超参数

  • width multiplier
  • resolution multiplier

width multiplier主要按照比例减少通道数:
其记为\alpha,取值范围从(0,1]
总计算量变为:
DK · DK · αM · DF · DF + αM · αN · DF · DF

分辨率因子用来控制输入的分辨率,记为ρ:

DK · DK · αM · ρDF · ρDF + αM · αN · ρDF · ρDF

pytorch实现:

在torch.nn.Conv2d中,group参数用来控制是否对输入的每个通道单独设置卷积:

  • At groups=1, all inputs are convolved to all outputs.(groups=1的时候,为标准卷积)
  • At groups=2, the operation becomes equivalent to having two conv layers side by side, each seeing half the input channels, and producing half the output channels, and both subsequently concatenated.(=2时,用两个卷积核,一个卷积核看一半,最后concat)
  • At groups= in_channels, each input channel is convolved with its own set of filters.(每个通道放一个卷积核,这就是我们要的depthwise convolution)

所以,论文中的mobilenet基础结构为:

def conv_dw(inp, oup, stride):
            return 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),
            )

整个mobilenet v1的论文结构代码为:

class MobileNet(nn.Module):
    def __init__(self):
        super(MobileNet, self).__init__()

        def conv_bn(inp, oup, stride):
            return nn.Sequential(
                nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True)
            )

        def conv_dw(inp, oup, stride):
            return 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),
            conv_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

代码出自:https://github.com/marvis/pytorch-mobilenet.git

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 欢迎关注本人的微信公众号AI_Engine 好久不见!由于小G同学的工作原因,确实有一段时间没有更新博文了。经过谨...
    AI_Engine阅读 2,123评论 0 0
  • 【嵌牛导读】:卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,CNN模型压缩与加速成为了...
    单行车jing阅读 3,113评论 0 0
  • 技术是为业务服务的。不结合业务使用场景单纯进行框架,语言优劣对比都是扯淡。 接上句,优化重构代码之前要先分析业务场...
    飞凡的陀螺阅读 296评论 0 0
  • 辽宁省吴氏宗亲会于2017年3月25日下午,在省军区宾馆成立了!
    三径堂阅读 269评论 0 0