日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

轻量模型简介

發(fā)布時間:2023/12/16 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 轻量模型简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

輕量化模型

  • 1. 卷積
    • 深度可分離卷積(Depthwise separable Convolution)
    • 分組卷積(Group Convolution)
  • 2. MobileNet
    • 一個問題
  • 3. ShuffleNet
    • channel shuffle
    • pointwise group convolutions
    • ShuffleNet unit
    • ShuffleNet
  • 4. SE模塊
    • Squeeze操作
    • Excitation操作
    • SE模塊的加載
    • SE Block實現(xiàn)

1. 卷積

深度可分離卷積(Depthwise separable Convolution)

深度可分離卷積depthwise separable convolution較多的應(yīng)用在輕量級的網(wǎng)絡(luò),由depthwise(DW)和pointwise(PW)兩個部分結(jié)合起來提取特征feature map。相比常規(guī)的卷積操作,其參數(shù)數(shù)量和運(yùn)算成本比較低。

Depthwise separable convolution將卷積操作分為兩步,分別是逐點(diǎn)卷積(PointWise Convolution,PW)和逐通道卷積(DepthWise Convolution,DW)。

  • DepthWise Convolution
    標(biāo)準(zhǔn)卷積操作將卷積核用于所有的輸入通道上,如輸入為3×224×224時,一個卷積核在3個通道上同時卷積操作,最終一個卷積核對應(yīng)輸出一個feature map,而DepthWise Convolution不同,它針對每個輸入通道應(yīng)用不同的卷積核,一個卷積核對應(yīng)一個輸入通道。DW卷積完全在二維平面內(nèi)運(yùn)算,卷積核數(shù)量與上一層的通道數(shù)相同,如下圖所示


    Depthwise Convolution完成后的Feature map數(shù)量與輸入層的通道數(shù)相同,無法擴(kuò)展Feature map。而且這種運(yùn)算對輸入層的每個通道獨(dú)立進(jìn)行卷積運(yùn)算,沒有有效的利用不同通道在相同空間位置上的特征信息。因此需要PointWise Convolution來將這些Feature map進(jìn)行組合生成新的Feature map。

  • PointWise Convolution
    PointWise Convolution就是卷積核大小為1×1×M的標(biāo)準(zhǔn)卷積,M為上一層的輸出通道數(shù)。PW卷積在ResNet中已經(jīng)用到,使用1×1卷積降低維度。PW卷積運(yùn)算會將上一步的feature map在深度方向上進(jìn)行加權(quán)組合,生成新的feature map,與普通卷積相同,輸出的feature map數(shù)量與卷積核數(shù)量保持一致,如下圖所示,上一層輸出深度為3,則卷積核大小為1×1×3 。
    PW卷積的作用是對DW后各通道的特征進(jìn)行融合,使得不同通道在相同空間位置上的特征得到有效利用

綜合來看,Depthwise separable convolution運(yùn)算過程如下。

深度可分離卷積降低了參數(shù)數(shù)量和運(yùn)算成本,以3×5×5的輸入,要得到輸出為4×3×3的輸出為例,分別計算使用標(biāo)準(zhǔn)卷積和深度可分離卷積的參數(shù)量與運(yùn)算量。

  • 標(biāo)準(zhǔn)卷積
    由[3, 5, 5]獲得[4, 3, 3],需要4個filter,每個大小為3×3,參數(shù)量為卷積核W x 卷積核H x 輸入通道數(shù) x 輸出通道數(shù) = 4×3×3×3 = 108,計算量為卷積核W x 卷積核H x (圖片W-卷積核W+1) x (圖片H-卷積核H+1) x 輸入通道數(shù) x 輸出通道數(shù) = 3×3×(5-2)×(5-2)×3×4 = 972 。
  • Depthwise separable convolution
    首先考慮DW卷積,維度與輸入通道數(shù)保持一致,則需要3個卷積核,每個大小為3×3,則參數(shù)量=27,計算量為243;
    再考慮PW卷積,卷積核大小為1×1×3,,共有4個,則參數(shù)量為1×1×3×4=12,運(yùn)算量為1×1×3×3×3×4=108;
  • 相加可以得到,深度可分離卷積共計參數(shù)量為39,運(yùn)算量為351,與標(biāo)準(zhǔn)卷積的108,972相比縮小了很多。

    分組卷積(Group Convolution)

    分組卷積對輸入進(jìn)行分組,每組分別卷積,若輸入為C×H×WC×H×WC×H×W,卷積核數(shù)量為N,分為GGG個組,每組需處理的輸入為CG\frac{C}{G}GC?個,每組輸出為NG\frac{N}{G}GN?,設(shè)每個卷積核大小為CG×K×K\frac{C}{G}×K×KGC?×K×K,卷積核共有NNN個,參數(shù)量為N×CG×K×KN×\frac{C}{G}×K×KN×GC?×K×K
    即常規(guī)卷積輸出的特征圖上,每一個點(diǎn)是由輸入特征圖C×H×WC×H×WC×H×W個點(diǎn)計算得到的,分組卷積輸出的特征圖上,每一個點(diǎn)是由輸入特征圖 CG×H×W\frac{C}{G}×H×WGC?×H×W個點(diǎn)計算得到的,所以分組卷積的參數(shù)量是標(biāo)準(zhǔn)卷積的1G\frac{1}{G}G1?

    因為每組的卷積核只與該組的輸入進(jìn)行卷積,不會與其他組的輸入計算,故運(yùn)算量也大大減小。下圖清晰的展示了分組卷積的運(yùn)算。

    2. MobileNet

    MobileNet的基本單元是depthwise separable convolution,它們對參數(shù)規(guī)模和計算量的改進(jìn)我們在上面已經(jīng)有所解釋,根據(jù)論文中進(jìn)一步的推導(dǎo),比較depthwise separable convolution和標(biāo)準(zhǔn)卷積可以得到如下公式:


    其中NNN為輸出特征圖深度,DKD_KDK?為卷積核大小,NNN值一般較大,所以可以粗略地認(rèn)為depthwise separable convolution相較于標(biāo)準(zhǔn)卷積,其參數(shù)量可減少至后者的1DK2\frac{1}{D^2_K}DK2?1?

    MobileNet基本結(jié)構(gòu)如下圖右,

    基本單元即為可分離卷積單元,從代碼角度來看MobileNet的Block更為清晰。

    class Block(nn.Module):'''Depthwise conv + Pointwise conv'''def __init__(self, in_planes, out_planes, stride=1):super(Block, self).__init__()# DW卷積, 卷積核大小3×3, 分為 in_planes,各層單獨(dú)進(jìn)行卷積# 輸入輸出深度相同均為in_planesself.conv1 = nn.Conv2d(in_planes, in_planes, kernel_size=3, stride=stride, padding=1, groups=in_planes, bias=False)self.bn1 = nn.BatchNorm2d(in_planes)# PW 卷積, 1*1 的卷積核self.conv2 = nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=1, padding=0, bias=False)self.bn2 = nn.BatchNorm2d(out_planes)def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = F.relu(self.bn2(self.conv2(out)))return out

    MobileNet共有28層,第一層為標(biāo)準(zhǔn)3×3卷積,總體結(jié)構(gòu)如下圖

    模型在訓(xùn)練時使用了非常少的正則化以及數(shù)據(jù)增強(qiáng)技術(shù),因為小模型很少有過擬合的問題,也沒有使用side heads或者標(biāo)簽平滑操作,因為深度卷積中參數(shù)量很小,所以也沒有進(jìn)行權(quán)重衰減。

    MobileNet為了進(jìn)一步縮小模型,引入了兩個超參數(shù)——width multiplier和resolution multiplier,前者按比例減少通道數(shù),記為α\alphaα,幾個典型的取值為1, 0.75, 0.5和0.25,結(jié)合此參數(shù),計算量為


    后者按比例降低特征圖大小,記為ρ\rhoρ,例如原來輸入特征圖是224x224,可以減少為192x192,引入resolution multiplier后,參數(shù)計算為


    引入width multiplier和resolution multiplier勢必會降低MobileNet的性能,所以根據(jù)需要的accuracy和model size來選擇其取值。

    一個問題

    在很多文章中提到了此時計算量的bottleneck是conv1x1,這是我現(xiàn)在還沒能理解的地方,需要以后繼續(xù)學(xué)習(xí)。

    3. ShuffleNet

    前面提到在MobileNet中,1×1卷積已成為繼續(xù)縮減計算量的瓶頸,這時出現(xiàn)了ShuffleNet,它在Xception和ResNeXt基礎(chǔ)上,使用pointwise group convolutions減少1×1卷積的復(fù)雜性,并且為了克服分組卷積帶來的副作用(分組之間的信息不流通),提出一種新的操作——channel shuffle來幫助不同特征分組之間的信息“交流”。

    ShuffleNet除了已經(jīng)介紹的depthwise separable convolution,還使用了channel shuffle、pointwise group convolutions來改進(jìn)ResNet。

    channel shuffle

    channel shuffle操作基于分組卷積(group convolution),分組卷積已在上面介紹過,如下圖(a)所示,每個卷積核僅與其對應(yīng)分組的feature map做卷積,這樣大大減少了計算量,但是會有“副作用”,對于輸出特征,它僅僅關(guān)注學(xué)習(xí)所在分組的特征,某個通道的輸出僅來自一小部分輸入通道,這樣具有很大的局限性,故作者提出channel shuffle。

    在(b)圖中,在一次分組卷積GConv1后,對所得結(jié)果的feature劃分為subgroups(在代碼中可通過reshape和 transpose來實現(xiàn)),將subgroups順序打亂后輸入到GConv2的分組卷積核中,而( c )圖的思想與(b)圖是一致的,這樣就可以在一定程度上解決分組卷積通道信息不相關(guān)的問題。

    對channel shuffle,原文中已解釋的很明白

    This can be efficiently and elegantly implemented by a channel shuffle operation (Fig 1 (c )): suppose a convolutional layer with g groups whose output has g × n channels; we first reshape the output channel dimension into (g; n), transposing and then flattening it back as the input of next layer.

    即使兩個卷積具有不同的組數(shù),該操作仍然有效。此外,channel shuffle也是可微的,這意味著它可以嵌入到網(wǎng)絡(luò)結(jié)構(gòu)中進(jìn)行端到端訓(xùn)練。

    pointwise group convolutions

    PW卷積為卷積核大小為1×1的卷積操作,pointwise group convolutions即為分組的PW卷積。

    ShuffleNet unit


    作者利用原始ResNet中的Bottleneck模塊,逐步改進(jìn),最終形成ShuffleNet Unit。

    圖(a):用3×3的DW卷積代替Bottleneck中的3×3卷積;
    圖(b):用1×1的分組卷積代替原來的1×1卷積;
    圖(c):在short cut上添加3×3的平均池化并設(shè)置stride=2,改變原有ResNet的Add操作為concat,即按channel合并,這使得在不增加額外計算成本的情況下,很容易擴(kuò)大通道尺寸。

    ShuffleNet

    基于ShuffleNet Unit,提出ShuffleNet結(jié)構(gòu)如下表

    ShuffleNet主要由ShuffleNet Unit堆疊而成,主體遵循ResNet的結(jié)構(gòu),分為3個stage,每個stage中用ShuffleNet Unit代替原有的殘差塊,在ShuffleNet Unit中使用分組數(shù)g控制PW卷積的復(fù)雜度,使用不同組數(shù)和輸出通道數(shù),以確保計算量大致不變。

    將上表中的ShuffleNet作為ShuffleNet 1×,在通道上取一個縮放因子sss,將其模型稱為ShuffleNet s×,sss用于控制filters的數(shù)量,在整個ShuffleNet架構(gòu)上,其復(fù)雜度的變化大概是s2s^2s2倍,不同參數(shù)的表現(xiàn)和計算量如下表所示


    ShuffleNet的實現(xiàn)代碼:ShuffleNet V1 神經(jīng)網(wǎng)絡(luò)簡介與代碼實戰(zhàn)

    對于卷積模型壓縮的幾個變形,這篇文章介紹的很詳細(xì),可作為參考閱讀:
    深入剖析MobileNet和它的變種(例如:ShuffleNet)為什么會變快?

    4. SE模塊

    SENet即Squeeze-and-Excitation Networks,使用SE模塊學(xué)習(xí)通道之間的相關(guān)性,通過對通道進(jìn)行加權(quán),強(qiáng)調(diào)有效信息,抑制無效信息。
    SE模塊分為Squeeze和Excitation兩部分,很容易加載到已有的網(wǎng)絡(luò)架構(gòu)中,SE模塊的結(jié)構(gòu)如下圖所示:

    可以看到,輸入X(C′×H′×W′C'×H'×W'C×H×W)先經(jīng)過一個FtrF_{tr}Ftr?變換(eg. 卷積)獲得特征圖U(C×H×WC×H×WC×H×W),接著就要進(jìn)行SE分支的操作。

    Squeeze操作

    Squeeze本質(zhì)上是一個全局平均池化,順著空間維度進(jìn)行特征壓縮,將每個二維的特征通道變成一個通道描述符(標(biāo)量),這個描述符在某種程度上具有全局的感受野,并且輸出的維度(1×1×C1×1×C1×1×C)與輸入的特征通道數(shù)一致,它允許網(wǎng)絡(luò)的所有層使用來自全局感受野的信息。

    Excitation操作

    輸入為Squeeze的輸出,維度為1×1×C1×1×C1×1×C
    Excitation操作基于特征通道間的相關(guān)性,對每個特征通道生成了一個權(quán)重,用于代表特征通道的重要程度,故Excitation的輸出維度仍是C個標(biāo)量(1×1×C1×1×C1×1×C)。
    權(quán)重生成后,通過乘法逐通道地加權(quán)到之前的特征上,完成通道維度上對原始特征的特征重標(biāo)定

    SE模塊的加載

    SE模塊的簡單性也使得它很容易加入到已有的網(wǎng)絡(luò)結(jié)構(gòu)中,原論文中舉了兩個例子,分別是Inception和ResNet并給出了詳細(xì)的計算圖,結(jié)合Inception網(wǎng)絡(luò)的計算圖,可以更好的理解SE模塊的操作過程。

    Squeeze操作即圖中的Global Pooling,Excitation操作即后續(xù)的FC+RELU+FC+Sigmoid組合。
    在進(jìn)行Excitation時,第一次FC的輸出維度上添加了一個衰減因子reduction,這個參數(shù)的目的是為了減少通道個數(shù)從而降低計算量。

    對Squeeze中的池化選擇、Excitation中reduction值大小和激活函數(shù)選擇,原論文中也做了不同嘗試,可以查看原論文進(jìn)行了解。

    將SE加載到ResNet中,結(jié)構(gòu)是相似的

    這時需要考慮的要更多一些,例如SE block是加在ResNet哪個stage或者放在殘差單元的哪個位置,論文也對不同情況進(jìn)行了實驗,如下圖,將SE放在殘差單元不同位置的結(jié)構(gòu)

    不同實驗的結(jié)果對比,參看原論文,不做介紹。

    SE Block實現(xiàn)

    根據(jù)結(jié)構(gòu)圖,使用pytorch可以快速完成SE模塊的搭建,代碼如下

    class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)

    總結(jié)

    以上是生活随笔為你收集整理的轻量模型简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。