初識mobilenet v1

Depthwise separable convolution

深度級可分離卷積其實是一種可分解卷積操作(factorized convolutions).將卷積分解成兩個更小的操作:

  • depthwise convolution
  • pointwise convolution

在標準卷積中,其卷積核作用于所有輸入通道上(input channel).如輸出圖片為:(6,6,3),原來卷積操作是:(4,4,3,5).4X4的卷積大小,3是卷積的通道數(shù),5是卷積核的數(shù)量.其輸出尺寸為\frac{6-4}{1}+1=3,其輸出特征為(3,3,5),如圖所示(同一個卷積核作用在所有通道上):

image

不同通道結(jié)果相加得到該卷積核的感受野的值.

深度分離卷積(depthwise convolution),針對每個輸入通道采用不同的卷積核瓶籽,就是說一個卷積核對應(yīng)一個輸入通道.如圖所示:


image

輸入有3個通道,對應(yīng)著有3個大小為(4,4,1) (4,4,1)(4,4,1)的深度卷積核祟同,卷積結(jié)果共有3個大小為(3,3,1) (3,3,1)(3,3,1)

最后,采用pointwise convolution.pointwise convolution其實就是普通的卷積悼沈,只不過其采用1x1的卷積核。1 X 1的卷積核作用 用于將不同通道的值相加.

depthwise convolution先將通道(深度)分別進行卷積操作,再用pointwise convolution(1X1的卷積)進行通道間的卷積感受野值相加 最終結(jié)果與標準卷積類似.

官方示意圖如下所示:


image

計算量估計

假設(shè)輸入特征圖大小為:D_{f} * D_{f}*M,而輸出特征圖大小為:D_{f} * D_{f} * N
假設(shè)特征圖的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倍的計算量靖避。其實,后面會有對比择克,參數(shù)量也會減少很多。

mobilenet v1 結(jié)構(gòu)

基礎(chǔ)結(jié)構(gòu)如圖:

image

原始的mobilenet v1 用于imagenet分類任務(wù)中,整個網(wǎng)絡(luò)有28層.

image

mobilenet 超參數(shù)

  • width multiplier
  • resolution multiplier

width multiplier主要按照比例減少通道數(shù):
其記為\alpha,取值范圍從(0,1]
總計算量變?yōu)?
DK · DK · αM · DF · DF + αM · αN · DF · DF

分辨率因子用來控制輸入的分辨率,記為ρ:

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

pytorch實現(xiàn):

在torch.nn.Conv2d中,group參數(shù)用來控制是否對輸入的每個通道單獨設(shè)置卷積:

  • 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基礎(chǔ)結(jié)構(gòu)為:

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的論文結(jié)構(gòu)代碼為:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薪介,一起剝皮案震驚了整個濱河市祠饺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汁政,老刑警劉巖道偷,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異记劈,居然都是意外死亡勺鸦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門目木,熙熙樓的掌柜王于貴愁眉苦臉地迎上來换途,“玉大人,你說我怎么就攤上這事刽射【猓” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵誓禁,是天一觀的道長懈息。 經(jīng)常有香客問我,道長摹恰,這世上最難降的妖魔是什么辫继? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮俗慈,結(jié)果婚禮上姑宽,老公的妹妹穿的比我還像新娘。我一直安慰自己闺阱,他們只是感情好炮车,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著示血,像睡著了一般救拉。 火紅的嫁衣襯著肌膚如雪难审。 梳的紋絲不亂的頭發(fā)上亿絮,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音派昧,去河邊找鬼。 笑死蒂萎,一個胖子當著我的面吹牛秆吵,可吹牛的內(nèi)容都是我干的五慈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼泻拦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了争拐?” 一聲冷哼從身側(cè)響起腋粥,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤架曹,失蹤者是張志新(化名)和其女友劉穎隘冲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑雄,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡展辞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绳慎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵竖。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杏愤,靈堂內(nèi)的尸體忽然破棺而出靡砌,到底是詐尸還是另有隱情,我是刑警寧澤珊楼,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布通殃,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏画舌。R本人自食惡果不足惜堕担,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曲聂。 院中可真熱鬧霹购,春花似錦、人聲如沸朋腋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旭咽。三九已至贞奋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穷绵,已是汗流浹背轿塔。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仲墨,地道東北人勾缭。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像宗收,于是被迫代替她去往敵國和親漫拭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 歡迎關(guān)注本人的微信公眾號AI_Engine 好久不見混稽!由于小G同學(xué)的工作原因采驻,確實有一段時間沒有更新博文了。經(jīng)過謹...
    AI_Engine閱讀 2,106評論 0 0
  • 【嵌牛導(dǎo)讀】:卷積神經(jīng)網(wǎng)絡(luò)日益增長的深度和尺寸為深度學(xué)習(xí)在移動端的部署帶來了巨大的挑戰(zhàn)匈勋,CNN模型壓縮與加速成為了...
    單行車jing閱讀 3,109評論 0 0
  • 技術(shù)是為業(yè)務(wù)服務(wù)的礼旅。不結(jié)合業(yè)務(wù)使用場景單純進行框架,語言優(yōu)劣對比都是扯淡洽洁。 接上句痘系,優(yōu)化重構(gòu)代碼之前要先分析業(yè)務(wù)場...
    飛凡的陀螺閱讀 294評論 0 0
  • 遼寧省吳氏宗親會于2017年3月25日下午,在省軍區(qū)賓館成立了饿自!
    三徑堂閱讀 269評論 0 0