RepVGG谷歌翻譯

? ? ? ? ? ?RepVGG:使VGG樣式的ConvNets再次出色

摘要

????我們提出了一種簡(jiǎn)單而強(qiáng)大的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),該架構(gòu)具有類似于VGG的推理時(shí)間模型,該推理模型僅由3*3卷積和ReLU的堆棧組成,而訓(xùn)練時(shí)間模型具有多個(gè)分支拓?fù)洹S?xùn)練時(shí)間和推理時(shí)間架構(gòu)的這種解耦是通過(guò)結(jié)構(gòu)性重新參數(shù)化技術(shù)實(shí)現(xiàn)的,因此該模型稱為RepVGG。在ImageNet上,據(jù)我們所知,RepVGG的top-1準(zhǔn)確性達(dá)到80%以上,這是純模型首次實(shí)現(xiàn)該精度。在NVIDIA 1080Ti GPU上,RepVGG模型的運(yùn)行速度比ResNet-50快83%,比ResNet-101快101%,具有更高的精度,并且與最先進(jìn)的模型(例如EfficientNet和RegNet)相比,它顯示了良好的精度-速度折衷??梢栽?a target="_blank">https://github.com/megvii-model/RepVGG找到代碼和訓(xùn)練有素的模型。?

1.引言

????卷積神經(jīng)網(wǎng)絡(luò)(ConvNets)已成為許多任務(wù)的主流解決方案。 VGG [30]通過(guò)由conv,ReLU和pooling堆棧組成的簡(jiǎn)單體系結(jié)構(gòu),在圖像識(shí)別方面取得了巨大成功。 有了Inception [32、33、31、17],ResNet [10]和DenseNet [15],許多研究興趣都轉(zhuǎn)移到了設(shè)計(jì)良好的體系結(jié)構(gòu)上,從而使模型變得越來(lái)越復(fù)雜。 通過(guò)自動(dòng)[43、28、22]或手動(dòng)[27]架構(gòu)搜索,或在基礎(chǔ)架構(gòu)上搜索的復(fù)合縮放策略,可以獲得一些最近的強(qiáng)大架構(gòu)[34]。

圖1:ImageNet上的Top-1準(zhǔn)確性與實(shí)際速度的關(guān)系。左:輕量級(jí)和中量級(jí)RepVGG,以及在120個(gè)時(shí)期內(nèi)訓(xùn)練過(guò)的基線。右圖:重量級(jí)模型經(jīng)過(guò)200個(gè)時(shí)期的訓(xùn)練。在相同的1080Ti上測(cè)試了速度,批次大小為128,全精度(fp32),單次裁剪,并以示例/秒為單位進(jìn)行了測(cè)量。 EfficientNet-B3 [34]的輸入分辨率為300,其他分辨率的輸入分辨率為224。

????盡管許多復(fù)雜的ConvNet都比簡(jiǎn)單的ConvNet提供更高的準(zhǔn)確性,但缺點(diǎn)很明顯。

?1)復(fù)雜的多分支設(shè)計(jì)(例如ResNet中的殘差加法和Inception中的分支級(jí)聯(lián))使模型難以實(shí)現(xiàn)和定制,減慢了推理速度并降低了內(nèi)存利用率。

?2)一些組件(例如,Xception [2]和MobileNets [14,29]中的深度轉(zhuǎn)換以及ShuffleNets [23,40]中的通道混洗)增加了內(nèi)存訪問(wèn)成本,并且缺乏各種設(shè)備的支持。 由于有許多影響推理速度的因素,浮點(diǎn)運(yùn)算(FLOP)的數(shù)量不能準(zhǔn)確反映實(shí)際速度。 盡管某些新穎的模型的FLOP低于老式的模型(如VGG和ResNet-18 / 34/50 [10]),但它們運(yùn)行速度可能不快(表4)。 因此,VGG和ResNets的原始版本在學(xué)術(shù)界和工業(yè)界仍被大量用于實(shí)際應(yīng)用中。

在本文中,我們提出了RepVGG,這是一種VGG風(fēng)格的體系結(jié)構(gòu),其性能優(yōu)于許多復(fù)雜的模型(圖1)。 RepVGG具有以下優(yōu)點(diǎn)。?

?該模型具有類似VGG的普通(也稱為前饋)拓?fù)?,沒(méi)有任何分支。即,每一層都將其唯一的前一層的輸出作為輸入,并將輸出饋送到其唯一的下一層。

??模型的身體僅使用3*3的卷積和ReLU。?

?實(shí)例化混凝土結(jié)構(gòu)(包括特定的深度和層寬),無(wú)需自動(dòng)搜索[43],手動(dòng)優(yōu)化[27],復(fù)合縮放[34]或其他繁瑣的設(shè)計(jì)。

圖2:RepVGG架構(gòu)示意圖。 RepVGG有5個(gè)階段,并在階段開始時(shí)通過(guò)stride-2卷積進(jìn)行下采樣。在這里,我們僅顯示特定階段的前4層。受ResNet [10]的啟發(fā),我們也使用identity和1*1個(gè)分支,但僅用于訓(xùn)練。

????普通模型要達(dá)到與多分支體系結(jié)構(gòu)相當(dāng)?shù)男阅芩?,這是一個(gè)挑戰(zhàn)。一種解釋是,多分支拓?fù)?,例如,ResNet,使模型成為許多較淺模型的隱式集合[35],因此訓(xùn)練多分支模型可以避免梯度消失的問(wèn)題。

? ??由于多分支架構(gòu)的好處全都在訓(xùn)練上,而缺點(diǎn)在推理上是不希望有的,我們建議通過(guò)結(jié)構(gòu)重新參數(shù)化將訓(xùn)練時(shí)的多分支和推理時(shí)的普通架構(gòu)分離,這意味著通過(guò)轉(zhuǎn)換其參數(shù)將模型從一個(gè)建筑轉(zhuǎn)換為另一個(gè)建筑。 具體而言,網(wǎng)絡(luò)結(jié)構(gòu)與一組參數(shù)耦合,例如,用四階內(nèi)核張量表示卷積層。 如果可以將某個(gè)結(jié)構(gòu)的參數(shù)轉(zhuǎn)換為由另一結(jié)構(gòu)耦合的另一組參數(shù),則可以用后者等效地替換前者,從而更改整個(gè)網(wǎng)絡(luò)體系結(jié)構(gòu)。

????具體而言,我們使用identity和1*1的分支來(lái)構(gòu)造訓(xùn)練時(shí)的RepVGG,這受ResNet的啟發(fā),但以不同的方式可以通過(guò)結(jié)構(gòu)重新參數(shù)化除去分支(圖2,4)。經(jīng)過(guò)訓(xùn)練后,我們用簡(jiǎn)單的代數(shù)進(jìn)行變換,因?yàn)橐粋€(gè)等價(jià)分支可以看作是一個(gè)退化的1*1conv,而后者又可以看作是一個(gè)退化的3* 3 conv,因此我們可以用原始3 *3內(nèi)核,identity和1*1分支以及批處理規(guī)范化(BN)[17]層的訓(xùn)練參數(shù)。因此,轉(zhuǎn)換后的模型具有3*3 conv層的堆棧,將其保存以進(jìn)行測(cè)試和部署。

????值得注意的是,推理時(shí)RepVGG的主體僅涉及一種類型的操作:3*3 conv后跟ReLU,這使RepVGG在GPU等通用計(jì)算設(shè)備上快速運(yùn)行。更好的是,RepVGG允許專用硬件實(shí)現(xiàn)更高的速度,因?yàn)榻o定芯片尺寸和功耗,我們需要的操作類型越少,我們可以集成到芯片上的計(jì)算單元就越多。即,專用于RepVGG的推理芯片可以具有大量的3*3-ReLU單元和更少的存儲(chǔ)單元(因?yàn)槠胀ㄍ負(fù)湓诖鎯?chǔ)方面很經(jīng)濟(jì),如圖3所示)。我們的貢獻(xiàn)總結(jié)如下。

?我們提出了RepVGG,這是一種簡(jiǎn)單的體系結(jié)構(gòu),與最新技術(shù)相比,具有良好的速度精度折衷。?

?我們建議使用結(jié)構(gòu)重新參數(shù)化將訓(xùn)練時(shí)的多分支拓?fù)渑c推理時(shí)的純體系結(jié)構(gòu)分離。

??我們已經(jīng)展示了RepVGG在圖像分類和語(yǔ)義分割中的有效性,以及實(shí)現(xiàn)的效率和簡(jiǎn)便性。

2.相關(guān)工作

2.1。從單路徑到多分支

????在VGG [30]將ImageNet分類的top-1準(zhǔn)確性提高到70%以上之后,有很多創(chuàng)新使ConvNets復(fù)雜化以實(shí)現(xiàn)高性能,例如當(dāng)代的GoogLeNet [32]和后來(lái)的Inception模型[33]。 [3] [31,17,17]采用精心設(shè)計(jì)的多分支體系結(jié)構(gòu),ResNet [10]提出了簡(jiǎn)化的兩分支體系結(jié)構(gòu),而DenseNet [15]通過(guò)將低層和許多高層連接在一起使拓?fù)涓訌?fù)雜。 神經(jīng)架構(gòu)搜索(NAS)[43、28、22、34]和手動(dòng)設(shè)計(jì)空間設(shè)計(jì)[27]可以生成具有更高性能的ConvNet,但要付出大量計(jì)算資源或人力的代價(jià)。 NAS生成的模型的某些大型版本甚至無(wú)法在普通GPU上進(jìn)行訓(xùn)練,因此限制了應(yīng)用程序。 除了實(shí)現(xiàn)的不便外,復(fù)雜的模型可能會(huì)降低并行度[23],從而減慢推理速度。

2.2。有效地訓(xùn)練單路徑模型

已經(jīng)嘗試了無(wú)分支訓(xùn)練ConvNets。但是,先前的工作主要是試圖使非常深的模型以合理的精度收斂,但是沒(méi)有比復(fù)雜的模型獲得更好的性能。因此,方法和結(jié)果模型既不簡(jiǎn)單也不實(shí)際。例如,提出了一種初始化方法[36]來(lái)訓(xùn)練極深的普通ConvNet。通過(guò)基于均場(chǎng)理論的方案,在MNIST上對(duì)10,000層網(wǎng)絡(luò)進(jìn)行了超過(guò)99%的精度培訓(xùn),在CIFAR-10上進(jìn)行了82%的精度培訓(xùn)。盡管這些模型不切實(shí)際(即使LeNet-5 [19]在MNIST上可以達(dá)到99.3%的準(zhǔn)確度,而VGG-16在CIFAR-10上也可以達(dá)到93%以上的準(zhǔn)確度),但是理論上的貢獻(xiàn)是有見地的。最近的工作[24]結(jié)合了多種技術(shù),包括泄漏ReLU,最大范數(shù)和仔細(xì)的初始化。在ImageNet上,它顯示具有147M參數(shù)的普通ConvNet可以達(dá)到74.6%的top-1精度,比其報(bào)告的基線(ResNet-101、76.6%,45M參數(shù))低2%。

值得注意的是,本文不僅說(shuō)明了簡(jiǎn)單模型可以很好地收斂,而且無(wú)意訓(xùn)練像ResNets這樣的非常深的ConvNet。相反,我們旨在構(gòu)建一個(gè)具有合理深度和有利的精度-速度折衷的簡(jiǎn)單模型,該模型可以通過(guò)最常見的組件(例如常規(guī)conv和BN)和簡(jiǎn)單的代數(shù)簡(jiǎn)單地實(shí)現(xiàn)。

2.3。模型重新參數(shù)化

DiracNet [38]是與我們相關(guān)的一種重新參數(shù)化方法。它通過(guò)將conv層的內(nèi)核編碼為

來(lái)構(gòu)建深平原模型,其中\hat{W} 是最終用于卷積的權(quán)重(4階張量被視為矩陣) ),a和b是學(xué)習(xí)的向量,而W_{norm} 是規(guī)范化的可學(xué)習(xí)內(nèi)核。與具有相當(dāng)數(shù)量參數(shù)的ResNet相比,DiracNet的top-1準(zhǔn)確性在CIFAR-100上降低了2.29%(78.46%對(duì)80.75%),在ImageNet上降低了0.62%(DiracNet-34的72.21%對(duì)ResNet-34的72.83%)。 DiracNet與我們的方法的不同之處在于:1)我們的結(jié)構(gòu)化重新參數(shù)化是通過(guò)實(shí)際數(shù)據(jù)流通過(guò)一個(gè)具體的結(jié)構(gòu)實(shí)現(xiàn)的,該結(jié)構(gòu)隨后可以轉(zhuǎn)換為另一個(gè)結(jié)構(gòu),而DiracNet只是為了方便使用了conv內(nèi)核的另一個(gè)數(shù)學(xué)表達(dá)式優(yōu)化。即,結(jié)構(gòu)上重新參數(shù)化的純模型是實(shí)際的訓(xùn)練時(shí)多分支模型,但DiracNet并非如此。 2)DiracNet的性能高于通常參數(shù)化的普通模型,但低于可比的ResNet,而RepVGG模型的性能大大優(yōu)于ResNet。Asym Conv Block(ACB)[9]采用非對(duì)稱Conv來(lái)加強(qiáng)規(guī)則Conv的“骨架”,這可以看作是結(jié)構(gòu)再參數(shù)化的另一種形式,因?yàn)樗鼘⒂?xùn)練的塊轉(zhuǎn)換為Conv。與我們的方法相比,不同之處在于ACB是為組件級(jí)改進(jìn)而設(shè)計(jì)的,并用作任何架構(gòu)中conv層的直接替代,而我們的結(jié)構(gòu)重新參數(shù)化對(duì)于訓(xùn)練普通的ConvNets至關(guān)重要。在第4.2節(jié)中顯示。

2.4。 Winograd卷積

RepVGG僅使用3*3 conv,因?yàn)樗言贕PU和CPU上受到一些現(xiàn)代計(jì)算庫(kù)(例如NVIDIA cuDNN [1]和Intel MKL [16])的高度優(yōu)化。表1顯示了在1080Ti GPU上使用cuDNN 7.5.0測(cè)試的理論FLOP,實(shí)際運(yùn)行時(shí)間和計(jì)算密度(以每秒Tera浮點(diǎn)運(yùn)算,TFLOPS衡量)2。結(jié)果表明,3*3 conv的理論計(jì)算密度大約為4,這表明總的理論FLOP不能替代不同體系結(jié)構(gòu)之間的實(shí)際速度。 Winograd算法[18](僅在步幅為1時(shí))是用于加速3*3conv的經(jīng)典算法,而cuDNN和MKL之類的庫(kù)已經(jīng)很好地支持(默認(rèn)情況下啟用)。例如,使用標(biāo)準(zhǔn)F(2*2; 3* 3)Winograd,3*3 conv的乘法(MUL)數(shù)量減少到原始的4/9。由于乘法比加法耗時(shí)得多,因此我們計(jì)算了MUL來(lái)衡量Winograd支持下的計(jì)算成本(在表4、5中由Wino MUL表示)。請(qǐng)注意,特定的計(jì)算庫(kù)和硬件確定是否對(duì)每個(gè)運(yùn)算符使用Winograd,因?yàn)樾∫?guī)模的卷積可能由于內(nèi)存開銷而無(wú)法加速。3

3.通過(guò)結(jié)構(gòu)重參數(shù)構(gòu)建RepVGG

3.1。簡(jiǎn)單即快速,節(jié)省內(nèi)存,靈活

至少有三個(gè)原因可以使用簡(jiǎn)單的Con-vNet:它們快速,節(jié)省內(nèi)存和靈活。

快速????許多最新的多分支體系結(jié)構(gòu)的理論FLOP低于VGG,但運(yùn)行速度可能不快。 例如,VGG-16的FLOP是EfficientNet-B3的8.4倍[34],但在1080Ti上的運(yùn)行速度是1.8倍(表4),這意味著前者的計(jì)算密度是后者的15倍。 除了Winograd conv帶來(lái)的加速之外,F(xiàn)LOP和速度之間的差異可以歸因于兩個(gè)重要因素,這些因素對(duì)速度有很大影響,但FLOP并未考慮這些因素:內(nèi)存訪問(wèn)成本(MAC)和并行度 [23]。例如,盡管所需的分支加法或級(jí)聯(lián)計(jì)算可以忽略不計(jì),但MAC還是很重要的。此外,MAC在成組卷積中占時(shí)間使用的很大一部分。另一方面,在相同的FLOP下,具有高并行度的模型可能比具有低并行度的模型快得多。由于在Inception和自動(dòng)生成的體系結(jié)構(gòu)中廣泛采用了多分支拓?fù)?,因此使用了多個(gè)小運(yùn)算符,而不是幾個(gè)大運(yùn)算符。先前的一項(xiàng)工作[23]報(bào)告說(shuō),NASNET-A [42]中的碎片運(yùn)算符的數(shù)量(即,一個(gè)構(gòu)建塊中的單個(gè)轉(zhuǎn)換或池化操作的數(shù)量)為13,這對(duì)具有強(qiáng)大并行計(jì)算能力的設(shè)備不友好例如GPU,并引入了額外的開銷,例如內(nèi)核啟動(dòng)和同步。相反,在ResNets中,此數(shù)字是2或3,我們將其設(shè)置為1:?jiǎn)蝹€(gè)轉(zhuǎn)換。

表1:在NVIDIA 1080Ti上,不同內(nèi)核大小和批處理大小= 32,輸入通道=輸出通道= 2048,分辨率= 5656,步幅= 1時(shí)的速度測(cè)試。硬件預(yù)熱后,平均使用時(shí)間為10次。

節(jié)省內(nèi)存????多分支拓?fù)涞膬?nèi)存效率低下,因?yàn)樾枰A裘總€(gè)分支的結(jié)果,直到添加或串聯(lián)為止,從而顯著提高了內(nèi)存占用的峰值。例如,如圖3所示,需要保持輸入到剩余塊的時(shí)間,直到相加為止。如圖3所示。假設(shè)該塊保持特征圖的大小,則作為輸入的存儲(chǔ)器占用的峰值為2。相反,簡(jiǎn)單的拓?fù)湓试S在操作完成后立即釋放特定層的輸入所占用的內(nèi)存。在設(shè)計(jì)專用硬件時(shí),普通的ConvNet可以進(jìn)行深度內(nèi)存優(yōu)化并降低內(nèi)存單元的成本,以便我們可以將更多計(jì)算單元集成到芯片上。

靈活? ??多分支拓?fù)鋵?duì)體系結(jié)構(gòu)規(guī)范施加了約束。 例如,ResNet要求將conv層組織為殘差塊,這限制了靈活性,因?yàn)槊總€(gè)殘差塊的最后一個(gè)conv層必須產(chǎn)生相同形狀的張量,否則快捷方式的添加就沒(méi)有意義了。 更糟糕的是,多分支拓?fù)湎拗屏送ǖ佬藜舻膽?yīng)用[20,12],這是刪除一些不重要通道的實(shí)用技術(shù),某些方法可以通過(guò)自動(dòng)發(fā)現(xiàn)每層的適當(dāng)寬度來(lái)優(yōu)化模型結(jié)構(gòu)[ 7]。 但是,多分支模型使修剪變得棘手,并導(dǎo)致明顯的性能下降或低加速比[6、20、8]。 相反,簡(jiǎn)單的體系結(jié)構(gòu)使我們可以根據(jù)我們的要求自由配置每個(gè)conv層,并進(jìn)行修剪以獲得更好的性能效率折衷。

圖3:殘差和普通模型中的峰值內(nèi)存占用。如果殘差塊保持要素圖的大小,則要素圖占用的內(nèi)存峰值將作為輸入。與因此忽略的特征相比,模型參數(shù)占用的內(nèi)存較小。

3.2。訓(xùn)練時(shí)的多分支體系結(jié)構(gòu)

普通的ConvNets有很多優(yōu)點(diǎn),但有一個(gè)致命的缺點(diǎn):性能差。例如,使用BN [17]等現(xiàn)代組件,VGG-16可以在ImageNet上達(dá)到72%的top-1準(zhǔn)確性,這似乎已經(jīng)過(guò)時(shí)了。我們的結(jié)構(gòu)化重新參數(shù)化方法受到ResNet的啟發(fā),該方法明確構(gòu)造了一個(gè)快捷分支,以將信息流建模為y = x + f(x)并使用殘差塊學(xué)習(xí)f。當(dāng)x和f(x)的尺寸不匹配時(shí),它將變?yōu)閥 = g(x)+ f(x),其中g(shù)(x)是由1*1卷積實(shí)現(xiàn)的卷積快捷方式。 ResNets成功的一個(gè)解釋是,這種多分支架構(gòu)使模型成為眾多淺層模型的隱式集合[35]。具體來(lái)說(shuō),對(duì)于n個(gè)塊,該模型可以解釋為2^n 個(gè)模型的集合,因?yàn)槊總€(gè)塊將流分支為兩條路徑。

由于多分支拓?fù)湓谕评矸矫嬗腥秉c(diǎn),但是分支似乎對(duì)訓(xùn)練有好處[35],因此我們使用多個(gè)分支來(lái)制作眾多模型的唯一訓(xùn)練時(shí)間組合。 為了使大多數(shù)成員更淺或更簡(jiǎn)單,我們使用類似于ResNet的identity(僅在尺寸匹配時(shí))和1*1分支,以便構(gòu)建塊的訓(xùn)練時(shí)信息流為y = x + g(x )+ f(x)。 我們簡(jiǎn)單地堆疊幾個(gè)這樣的塊來(lái)構(gòu)建訓(xùn)練時(shí)間模型。 從與[35]相同的角度來(lái)看,模型成為具有n個(gè)這樣的塊的3^n個(gè)成員的集合。 訓(xùn)練后,將其等效轉(zhuǎn)換為y = h(x),其中h由單個(gè)conv層實(shí)現(xiàn),并且其參數(shù)通過(guò)一系列代數(shù)從訓(xùn)練后的參數(shù)中得出。

3.3。普通推理時(shí)間模型的重新參數(shù)

在本小節(jié)中,我們描述如何將訓(xùn)練后的塊轉(zhuǎn)換為單個(gè)3*3 conv層進(jìn)行推理。注意,在添加之前,我們?cè)诿總€(gè)分支中都使用了BN(圖4)。形式上,我們使用

表示3*3 conv層的內(nèi)核,其中C1輸入通道和C2輸出通道,而

表示1*1分支的內(nèi)核。我們使用

作為3*3 conv之后的BN層的累積均值,標(biāo)準(zhǔn)差,學(xué)習(xí)縮放因子和偏差,

對(duì)應(yīng)1*1 conv之后的BN,和

為identity分支。令

分別為輸入和輸出,并\ast 為卷積運(yùn)算符。如果C1 = C2; H1 = H2; W1 = W2,我們有

否則,我們不使用任何identity分支,因此上面的方程式只有前兩項(xiàng)。這里bn是推理時(shí)間BN函數(shù),形式為

我們首先將每個(gè)BN及其之前的conv層轉(zhuǎn)換為具有偏差向量的conv。設(shè)

是從

轉(zhuǎn)換而來(lái)的核和偏差。我們有

上面的轉(zhuǎn)換也適用于identity分支,因?yàn)閕dentity映射可以視為以identity矩陣為內(nèi)核的conv轉(zhuǎn)換。經(jīng)過(guò)這樣的轉(zhuǎn)換,我們將擁有一個(gè)3*3內(nèi)核,兩個(gè)1*1內(nèi)核和三個(gè)偏置矢量。然后我們將三個(gè)偏差向量相加得到最終偏差,將1*1的核加到3*3核的中心點(diǎn)得到最終的3*3核,這可以通過(guò)先將兩個(gè)1*1核zero-padding到3*3并將三個(gè)核相加來(lái)輕松實(shí)現(xiàn),如圖4所示。請(qǐng)注意,此類轉(zhuǎn)換的等效條件要求3*3和1*1層具有相同的步幅,并且后者的填充配置應(yīng)比前者少一個(gè)像素。例如,對(duì)于將輸入填充一個(gè)像素的3*3層(最常見的情況),1*1層應(yīng)具有padding = 0。

圖4:RepVGG塊的結(jié)構(gòu)重新參數(shù)化。為了便于可視化,我們假設(shè)C2 = C1 = 2,因此3*3層具有四個(gè)3*3矩陣,而1*1層的核是2*2矩陣。

3.4。建筑規(guī)格表。

表2顯示了RepVGG的規(guī)范,包括深度和寬度。 RepVGG是VGG風(fēng)格的,因?yàn)樗捎煤?jiǎn)單的拓?fù)洳⒋罅渴褂?*3 conv,但是它不像VGG那樣使用max pooling,因?yàn)槲覀兿M黧w僅具有一種類型的操作。我們將3*3層分成5個(gè)階段,階段的第一層向下采樣,步幅=2。對(duì)于圖像分類,我們使用全局平均池,然后使用完全連接的層作為頭部。對(duì)于其他任務(wù),可以在任何層產(chǎn)生的特征上使用特定于任務(wù)的頭。

我們遵循三個(gè)簡(jiǎn)單的準(zhǔn)則來(lái)決定每個(gè)階段的層數(shù)。 1)第一階段以高分辨率運(yùn)行,這很耗時(shí),因此我們僅使用一層來(lái)降低延遲。 2)最后一級(jí)應(yīng)具有更多通道,因此我們僅使用一層來(lái)保存參數(shù)。 3)緊隨ResNet及其最新版本[10、27、37]之后,我們將最多的層放到倒數(shù)第二級(jí)(在ImageNet上具有14 14輸出分辨率)(例如,ResNet-101在其14 14分辨率中使用69層階段)。我們讓這五個(gè)階段分別具有1、2、4、14、1層,以構(gòu)造一個(gè)名為RepVGG-A的實(shí)例。我們還構(gòu)建了更深的RepVGG-B,在stage2、3和4中又增加了2層。我們使用RepVGG-A與其他輕量級(jí)和中等重量的模型(包括ResNet-18 / 34/50和RepVGG-B)競(jìng)爭(zhēng)性能的。

我們通過(guò)均勻縮放[64; 128; 256; 512]的經(jīng)典寬度設(shè)置(例如VGG和ResNets)來(lái)確定圖層寬度。 我們?cè)谇八膫€(gè)階段使用乘數(shù)比例,在最后一個(gè)階段使用b,通常是setb>,因?yàn)槲覀兿M詈笠粚訉?duì)分類或其他下游任務(wù)具有更豐富的功能。 由于RepVGG在最后階段只有一層,因此較大的值不會(huì)顯著增加等待時(shí)間或參數(shù)數(shù)量。 具體而言,stage2、3、4、5的寬度分別為[64a; 128a; 256a; 512b]。 為了避免在大特征圖上進(jìn)行大卷積,如果a <1,則縮小stage1,但不放大,因此stage1的寬度為min(64; 64a)。

表2:RepVGG.E.g.2的體系結(jié)構(gòu)規(guī)范64ameans stage2具有2個(gè)層,每個(gè)層具有64個(gè)通道。

為了進(jìn)一步減少參數(shù)和計(jì)算量,我們可以選擇將每層3*3conv層與密集層進(jìn)行交錯(cuò),以犧牲精度來(lái)提高效率。具體來(lái)說(shuō),我們?yōu)镽epVGG-A的第3、5、7,...,21層以及RepVGG-B的第23、25和27層設(shè)置組數(shù)g。為簡(jiǎn)單起見,我們?yōu)榇祟悓尤衷O(shè)置了g為 1、2或4,而無(wú)需逐層調(diào)整。我們不使用相鄰的逐層轉(zhuǎn)換層,因?yàn)槟菢訒?huì)禁用通道間的信息交換并帶來(lái)副作用[40]:某個(gè)通道的輸出只能從一小部分輸入通道中得出。請(qǐng)注意,1*1個(gè)分支應(yīng)具有與第3*3個(gè)轉(zhuǎn)化率相同的g。

4.實(shí)驗(yàn)

在本節(jié)中,我們將RepVGG的性能與ImageNet上的基線進(jìn)行比較,通過(guò)一系列的消融研究和比較證明結(jié)構(gòu)重新參數(shù)化的重要性,并驗(yàn)證RepVGG在語(yǔ)義分割上的泛化性能[41]。

4.1。 RepVGG用于ImageNet分類

我們將RepVGG與經(jīng)典和最先進(jìn)的模型進(jìn)行比較,這些模型包括ImageNet-1K [5]上的VGG-16 [30],ResNet [10],ResNeXt [37],EfficientNet [34]和RegNet [27]。 包括用于訓(xùn)練的128萬(wàn)個(gè)高分辨率圖像和用于驗(yàn)證的50K圖像(來(lái)自1000個(gè)類別)。我們分別使用EfficientNet-B0 / B3和RegNet-3.2GF / 12GF作為中量級(jí)和重量級(jí)最新模型的代表。我們改變乘數(shù)a和b以生成一系列RepVGG模型以與基準(zhǔn)進(jìn)行比較。如表3中總結(jié)。

我們首先將RepVGG與最常用的基準(zhǔn)ResNets [10]進(jìn)行比較。 為了與ResNet-18進(jìn)行比較,我們將a設(shè)置為0:75; 對(duì)于RepVGG-A0,b = 2.5。 對(duì)于ResNet-34,我們使用更寬的RepVGG-A1。 為了使RepVGG的參數(shù)比ResNet-50略少,我們構(gòu)建RepVGG-A2,其中a = 1.5; b = 2.75。 為了與更大的模型進(jìn)行比較,我們構(gòu)造了寬度增加的更深的RepVGG-B0 / B1 / B2 / B3。 對(duì)于那些具有交錯(cuò)的分組層的RepVGG模型,我們將g2 / g4附加到模型名稱作為后綴。

表3:由乘數(shù)a和b定義的RepVGG模型。

為了訓(xùn)練輕量級(jí)和中量級(jí)模型,我們僅使用簡(jiǎn)單的數(shù)據(jù)增強(qiáng)管道,包括隨機(jī)裁剪和左右翻轉(zhuǎn),遵循官方PyTorch示例[26]。我們?cè)?個(gè)GPU上使用256的全局批處理大小,學(xué)習(xí)速率初始化為0.1,cosine annealing120個(gè)epochs,標(biāo)準(zhǔn)SGD的動(dòng)量系數(shù)為0.9,權(quán)重衰減為10^{(-4)},在conv和完全連接層的內(nèi)核上。對(duì)于包括RegNetX-12GF,EfficientNet-B3和RepVGG-B3在內(nèi)的重量級(jí)模型,我們使用5階段預(yù)熱,cosine annealing200epochs,標(biāo)簽平滑[33]和混合[39](以下[11] ]),以及Autoaugment [4](隨機(jī)裁剪和翻轉(zhuǎn))的數(shù)據(jù)增強(qiáng)管道。 RepVGG-B2及其g2 / g4變體在兩種設(shè)置中都經(jīng)過(guò)培訓(xùn)。我們先在1080Ti GPU 上以128個(gè)批次的大小測(cè)試每個(gè)模型的速度,方法是先送入50個(gè)批次以預(yù)熱硬件,然后再記錄50個(gè)批次并記錄使用時(shí)間。為了公平地比較,我們?cè)谕籊PU上測(cè)試所有模型,并且所有基線的conv-BN序列也都轉(zhuǎn)換為帶偏差的conv(等式3)。

如表所示。在表4和圖1中,RepVGG顯示出有利的精度-速度折衷。例如,就準(zhǔn)確性和速度而言,RepVGG-A0比ResNet-18好1.25%和33%,RepVGG-A1比ResNet-34好0.29%/ 64%,RepVGG-A2比ResNet?-50好0.17%/ 83%。使用交錯(cuò)的分組層(g2 / g4),可以進(jìn)一步加快RepVGG模型,而準(zhǔn)確性會(huì)降低。例如,RepVGG-B1g4比ResNet-101好0.37%/ 101%,而RepVGG-B1g2則以相同的精度快于ResNet-152 2.66。盡管參數(shù)的數(shù)量不是我們主要關(guān)注的問(wèn)題,但是上述所有RepVGG模型都比ResNets更有效地進(jìn)行參數(shù)設(shè)置。與經(jīng)典的VGG-16相比,RepVGG-B2僅具有58%的參數(shù),運(yùn)行速度快10%,顯示精度高6.57%。相對(duì)于以RePr [25](一種基于修剪的精心設(shè)計(jì)的訓(xùn)練方法)訓(xùn)練的VGG模型(據(jù)我們所知,該模型是精度最高(74.5%)的類VGG模型),RepVGG-B2還具有以下優(yōu)勢(shì):精度達(dá)到4.28%。

與最先進(jìn)的基準(zhǔn)相比,RepVGG考慮到其簡(jiǎn)單性也顯示出良好的性能:RepVGG-A2比EfficientNet-B0好1.37%/ 59%,RepVGG-B1比RegNetX-3.2好0.39% GF,運(yùn)行速度稍快。

值得注意的是,RepVGG模型在200個(gè)紀(jì)元內(nèi)達(dá)到了80%以上的精度(表5),這是平原模型首次據(jù)我們所知趕上最新技術(shù)。與RegNetX-12GF相比,RepVGG-B3的運(yùn)行速度提高了31%,考慮到RepVGG不需要像RegNet [27]那樣的大量人力來(lái)完善設(shè)計(jì)空間,因此這是令人印象深刻的,并且架構(gòu)超參數(shù)是隨便設(shè)置的。

作為計(jì)算復(fù)雜性的兩個(gè)代理,我們計(jì)算了Sect中介紹的理論FLOP和Wino MUL。 2.4。例如,我們發(fā)現(xiàn)Winograd算法不會(huì)加速EfficientNet-B0 / B3中的轉(zhuǎn)換。表4顯示W(wǎng)ino MUL在GPU上是更好的代理,例如ResNet-152的運(yùn)行速度比VGG-16慢,理論上的FLOP較低,但Wino MUL較高。當(dāng)然,實(shí)際速度應(yīng)始終是黃金標(biāo)準(zhǔn)。

4.2。結(jié)構(gòu)重新參數(shù)化是關(guān)鍵

在本小節(jié)中,我們驗(yàn)證了結(jié)構(gòu)重新參數(shù)化技術(shù)的重要性(表6)。使用上述相同的簡(jiǎn)單訓(xùn)練設(shè)置,從頭開始訓(xùn)練所有模塊120個(gè)紀(jì)元。首先,我們通過(guò)從RepVGG-B0的每個(gè)塊中刪除標(biāo)識(shí)和/或1*1分支來(lái)進(jìn)行消融研究。刪除兩個(gè)分支后,訓(xùn)練時(shí)間模型會(huì)降級(jí)為普通的平原模型,并且只能達(dá)到72.39%的準(zhǔn)確性。識(shí)別率提高到73.15%(1*1),識(shí)別率提高到74.79%(identity)。。全功能RepVGG-B0的準(zhǔn)確性為75.14%,比普通的普通模型高2.75%。

然后,我們構(gòu)建了一系列變體和基線,用于在RepVGG-B0上進(jìn)行比較(表7)。同樣,所有模塊都在120個(gè)時(shí)期內(nèi)從零開始訓(xùn)練。

?Identity w/o BN ????刪除身份分支中的身份證明。

?Post-addition BN????刪除三個(gè)分支中的BN層,并在addition后附加BN層。即,將BN的位置從添加前更改為添加后。

?+ReLU in branches????將ReLU插入每個(gè)分支中(在BN之后和添加之前)。由于無(wú)法將這樣的塊轉(zhuǎn)換為單個(gè)conv層,因此沒(méi)有實(shí)際用途,我們只希望了解更多的非線性是否會(huì)帶來(lái)更高的性能。

?DiracNet [38]????采用了經(jīng)過(guò)精心設(shè)計(jì)的conv內(nèi)核重新參數(shù)化,如Sect中所述。 2.2。我們使用其官方的PyTorch代碼構(gòu)建圖層以替換原始的3conv。

?Trivial Re-param????是通過(guò)將一個(gè)身份內(nèi)核直接添加到3內(nèi)核中來(lái)對(duì)轉(zhuǎn)換內(nèi)核進(jìn)行更簡(jiǎn)單的重新參數(shù)化,這可以看作是DiracNet的降級(jí)版本(^ W = I + W [38])。

?Asymmetric Conv Block(ACB) [9]????可以看作是結(jié)構(gòu)重新參數(shù)化的另一種形式。我們與ACB進(jìn)行比較,以查看結(jié)構(gòu)重新參數(shù)化的改進(jìn)是否歸因于組件級(jí)的過(guò)度參數(shù)化(即,額外的參數(shù)使every3 3conv變得更強(qiáng)大)。

?Residual Reorg????通過(guò)以類似于ResNet的方式重新組織每個(gè)階段(每個(gè)塊2層)。具體來(lái)說(shuō),生成的模型在第一個(gè)和最后一個(gè)階段具有one3 3layer,在stage2、3、4具有2、3、8個(gè)殘差塊,并且使用類似于ResNet-18 / 34的快捷方式。

表4:在ImageNet上通過(guò)簡(jiǎn)單的數(shù)據(jù)增強(qiáng)在120個(gè)時(shí)期內(nèi)訓(xùn)練的RepVGG模型和基線。速度在1080Ti上進(jìn)行了測(cè)試,批處理量為128,全精度(fp32),以示例/秒為單位進(jìn)行測(cè)量。我們計(jì)算了Sect中描述的理論FLOP和Wino MUL。 2.4。基線是我們?cè)谙嗤嘤?xùn)設(shè)置下的實(shí)現(xiàn)。


表5:RepVGG模型和基線在200個(gè)時(shí)期內(nèi)使用Autoaugment [4],標(biāo)簽平滑和混合訓(xùn)練。
表6:在ImageNet上具有120個(gè)時(shí)代的消融研究。

我們認(rèn)為結(jié)構(gòu)重參數(shù)優(yōu)于DiractNet和瑣碎重參數(shù)的事實(shí)在于,前者依賴于通過(guò)具有非線性行為(BN)的混凝土結(jié)構(gòu)的實(shí)際數(shù)據(jù)流,而后者僅使用另一個(gè)數(shù)學(xué)表達(dá)式轉(zhuǎn)換內(nèi)核。即,前者“重新參數(shù)”的意思是“使用結(jié)構(gòu)的參數(shù)來(lái)參數(shù)化另一個(gè)結(jié)構(gòu)”,而后者的意思是“首先用另一組參數(shù)計(jì)算參數(shù),然后將其用于其他計(jì)算”。對(duì)于像訓(xùn)練時(shí)間BN這樣的非線性組件,前者不能被后者近似。有證據(jù)表明,去除BN會(huì)降低精度,而增加ReLU則會(huì)提高精度。換句話說(shuō),盡管可以將RepVGG塊等效地轉(zhuǎn)換為單個(gè)conv進(jìn)行推理,但是推理時(shí)間等價(jià)并不意味著訓(xùn)練時(shí)間等價(jià),因?yàn)槲覀儫o(wú)法構(gòu)造具有相同訓(xùn)練時(shí)間行為的conv層作為RepVGG塊。

與ACB的比較表明,RepVGG的成功不應(yīng)僅僅歸因于每個(gè)組件的過(guò)度參數(shù)化,因?yàn)锳CB使用更多的參數(shù),但不能像RepVGG一樣提高性能。仔細(xì)檢查一下,我們將每個(gè)3*3轉(zhuǎn)換量的ResNet-50替換為RepVGG塊,并從頭開始訓(xùn)練120個(gè)紀(jì)元。準(zhǔn)確性為76.34%,僅比ResNet-50基線高0.03%,這表明RepVGG樣式的結(jié)構(gòu)重新參數(shù)化不是通用的過(guò)度參數(shù)化技術(shù),而是對(duì)訓(xùn)練功能強(qiáng)大的普通ConvNets至關(guān)重要的方法。

與具有相同3*3conv數(shù)量和訓(xùn)練和推理額外捷徑的實(shí)際殘差網(wǎng)絡(luò)Residual Reorg相比,RepVGG的表現(xiàn)高出0.58%,這并不奇怪,因?yàn)镽epVGG的分支機(jī)構(gòu)更多。例如,這些分支使RepVGG的stage4成為

個(gè)模型的整體[35],而Reorgid Reorg的數(shù)目是

4.3。語(yǔ)義分割

我們驗(yàn)證了ImageNet預(yù)訓(xùn)練的RepVGG在Cityscapes [3]上的語(yǔ)義分割的泛化性能,其中包含5K精細(xì)注釋的圖像和19個(gè)類別。我們使用PSPNet [41]框架,一個(gè)以0.01為底,功效為0.9,權(quán)重衰減為10 4,8個(gè)GPU的全局批處理大小為16個(gè)(共40個(gè)紀(jì)元)的多學(xué)習(xí)率策略。為了公平起見,我們僅將ResNet-50 / 101主干更改為RepVGG-B1g2 / B2,并保持其他設(shè)置相同。

繼正式實(shí)施PSPNet-50 / 101 [41](在ResNet-50 / 101的后兩個(gè)階段使用膨脹的conv)之后,我們還在RepVGG-B1g2 /的后兩個(gè)階段制作了所有3 3 conv層。 B2擴(kuò)張了。由于當(dāng)前3 3擴(kuò)張的轉(zhuǎn)化效率較低(盡管FLOP與3 3常規(guī)轉(zhuǎn)化相同),因此此類修改會(huì)減慢推理速度。為了便于比較,我們構(gòu)建了另外兩個(gè)僅在最后5層(即,stage4的最后4層和stage5的唯一層)進(jìn)行擴(kuò)張的PSPNet(由fastin表8表示)。比ResNet-50 / 101骨干網(wǎng)快。結(jié)果表明,RepVGG的骨架在平均IoU上具有更高的速度,分別比ResNet-50和ResNet-101優(yōu)越1.71%和1.01%。令人印象深刻的是,RepVGG-B1g2-fast在mIoU方面優(yōu)于ResNet-101主干網(wǎng)0.37,運(yùn)行速度快62%。有趣的是,對(duì)于較大的模型,擴(kuò)張似乎更有效,因?yàn)榕cRepVGG-B1g2-fast相比,使用更多擴(kuò)張的conv層不會(huì)提高性能,但會(huì)以合理的速度將RepVGG-B2的mIuU提高1.05%。

表7:以120個(gè)時(shí)期訓(xùn)練的RepVGG-B0與變體和基線的比較。
表8:在驗(yàn)證子集上測(cè)試的Cityscapes [3]上的語(yǔ)義分割。在同一1080Ti GPU上以批處理大小16,全精度(fp32)和輸入分辨率713713測(cè)試了速度(示例/秒)。


4.4。局限性

RepVGG模型是快速,簡(jiǎn)單和實(shí)用的ConvNet,旨在在GPU和專用硬件上以最高速度運(yùn)行,而無(wú)需考慮參數(shù)或理論FLOP的數(shù)量。盡管RepVGG模型的參數(shù)效率比ResNets高,但它們可能不如MobileNets [14、29、13]和ShuffleNets [40、23]等移動(dòng)系統(tǒng)模型適合低功耗設(shè)備。

5.結(jié)論

我們提出了RepVGG,這是一個(gè)簡(jiǎn)單的體系結(jié)構(gòu),具有3*3 conv和ReLU的堆棧,這使其特別適用于GPU和專用推理芯片。通過(guò)我們的結(jié)構(gòu)重新參數(shù)化方法,這樣一個(gè)簡(jiǎn)單的Con-vNet在ImageNet上達(dá)到了80%的top-1精度,并且與最新的復(fù)雜模型相比,顯示了良好的速度精度折衷。

原文鏈接:https://arxiv.org/abs/2101.03697

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容