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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

轻量模型简介

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

輕量化模型

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

1. 卷積

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

深度可分離卷積depthwise separable convolution較多的應(yīng)用在輕量級(jí)的網(wǎng)絡(luò),由depthwise(DW)和pointwise(PW)兩個(gè)部分結(jié)合起來(lái)提取特征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時(shí),一個(gè)卷積核在3個(gè)通道上同時(shí)卷積操作,最終一個(gè)卷積核對(duì)應(yīng)輸出一個(gè)feature map,而DepthWise Convolution不同,它針對(duì)每個(gè)輸入通道應(yīng)用不同的卷積核,一個(gè)卷積核對(duì)應(yīng)一個(gè)輸入通道。DW卷積完全在二維平面內(nèi)運(yùn)算,卷積核數(shù)量與上一層的通道數(shù)相同,如下圖所示


    Depthwise Convolution完成后的Feature map數(shù)量與輸入層的通道數(shù)相同,無(wú)法擴(kuò)展Feature map。而且這種運(yùn)算對(duì)輸入層的每個(gè)通道獨(dú)立進(jìn)行卷積運(yùn)算,沒(méi)有有效的利用不同通道在相同空間位置上的特征信息。因此需要PointWise Convolution來(lái)將這些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)算會(huì)將上一步的feature map在深度方向上進(jìn)行加權(quán)組合,生成新的feature map,與普通卷積相同,輸出的feature map數(shù)量與卷積核數(shù)量保持一致,如下圖所示,上一層輸出深度為3,則卷積核大小為1×1×3 。
    PW卷積的作用是對(duì)DW后各通道的特征進(jìn)行融合,使得不同通道在相同空間位置上的特征得到有效利用

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

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

  • 標(biāo)準(zhǔn)卷積
    由[3, 5, 5]獲得[4, 3, 3],需要4個(gè)filter,每個(gè)大小為3×3,參數(shù)量為卷積核W x 卷積核H x 輸入通道數(shù) x 輸出通道數(shù) = 4×3×3×3 = 108,計(jì)算量為卷積核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個(gè)卷積核,每個(gè)大小為3×3,則參數(shù)量=27,計(jì)算量為243;
    再考慮PW卷積,卷積核大小為1×1×3,,共有4個(gè),則參數(shù)量為1×1×3×4=12,運(yùn)算量為1×1×3×3×3×4=108;
  • 相加可以得到,深度可分離卷積共計(jì)參數(shù)量為39,運(yùn)算量為351,與標(biāo)準(zhǔn)卷積的108,972相比縮小了很多。

    分組卷積(Group Convolution)

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

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

    2. MobileNet

    MobileNet的基本單元是depthwise separable convolution,它們對(duì)參數(shù)規(guī)模和計(jì)算量的改進(jìn)我們?cè)谏厦嬉呀?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)如下圖右,

    基本單元即為可分離卷積單元,從代碼角度來(lái)看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í)使用了非常少的正則化以及數(shù)據(jù)增強(qiáng)技術(shù),因?yàn)樾∧P秃苌儆羞^(guò)擬合的問(wèn)題,也沒(méi)有使用side heads或者標(biāo)簽平滑操作,因?yàn)樯疃染矸e中參數(shù)量很小,所以也沒(méi)有進(jìn)行權(quán)重衰減。

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


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


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

    一個(gè)問(wèn)題

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

    3. ShuffleNet

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

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

    channel shuffle

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

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

    對(duì)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.

    即使兩個(gè)卷積具有不同的組數(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的分組卷積代替原來(lái)的1×1卷積;
    圖(c):在short cut上添加3×3的平均池化并設(shè)置stride=2,改變?cè)蠷esNet的Add操作為concat,即按channel合并,這使得在不增加額外計(jì)算成本的情況下,很容易擴(kuò)大通道尺寸。

    ShuffleNet

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

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

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


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

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

    4. SE模塊

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

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

    Squeeze操作

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

    Excitation操作

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

    SE模塊的加載

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

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

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

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

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

    不同實(shí)驗(yàn)的結(jié)果對(duì)比,參看原論文,不做介紹。

    SE Block實(shí)現(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é)

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

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