別再用VGG了!一文帶你看透 RepVGG怎么重鑄VGG榮光
寫在前面
VGG算是非常經(jīng)典的網(wǎng)絡(luò)了,它是由牛津大學(xué)計(jì)算機(jī)視覺組(Visual Geometry Group)和Google DeepMind公司的研究員一起研發(fā)的 “直筒型“ 的網(wǎng)絡(luò)。既然在看這篇文章,想必已經(jīng)對(duì)VGG十分熟悉了。VGG有一些特別明顯的缺陷,如網(wǎng)絡(luò)的參數(shù)量較多,模型檢測(cè)準(zhǔn)確率也不是很好,總之VGG網(wǎng)絡(luò)效果不理想。之后的一段時(shí)間,人們總是將網(wǎng)絡(luò)變得更寬更深(如GoogleNet、ResNet),以期待達(dá)到更優(yōu)異的效果。
本文引用地址:http://cafeforensic.com/article/202404/458056.htm事實(shí)上也是這樣,更深更寬的網(wǎng)絡(luò)更容易滿足需求。這樣,VGG變得鮮有問津。這時(shí),一位大佬——丁霄漢,相信科學(xué)技術(shù)總是螺旋式的上升,撿起了VGG模型,給其注入了新思想,RepVGG便橫空出世。
首先我們先來解讀一些RepVGG的取名含義,Rep全稱為re- parameterization(重參數(shù)化),Rep是指首先構(gòu)造一系列結(jié)構(gòu)(一般用于訓(xùn)練),并將其參數(shù)等價(jià)轉(zhuǎn)換為另一組參數(shù)(一般用于推理),從而將這一系列結(jié)構(gòu)等價(jià)轉(zhuǎn)換為另一系列結(jié)構(gòu)。估計(jì)這段話大家讀的似懂非懂,對(duì)于RepVGG來說,就是在訓(xùn)練階段會(huì)訓(xùn)練一個(gè)多分支模型,然后利用重參數(shù)化將多分支模型等價(jià)轉(zhuǎn)換為單路模型,最后在推理時(shí)使用單路模型。
為什么要這樣做呢?因?yàn)樵谟?xùn)練過程中往往多分支的結(jié)構(gòu)會(huì)得到更高的性能收益,即在訓(xùn)練時(shí)采用多分支結(jié)構(gòu)來提升網(wǎng)絡(luò)性能,在推理時(shí),將多分支結(jié)構(gòu)轉(zhuǎn)化為單路結(jié)構(gòu),這樣會(huì)使推理速度大大加快!
RepVGG結(jié)構(gòu)
聽了上文的講解,不知大家對(duì)RepVGG有了多少了解,還有很多疑惑是正常的,不要著急,下面會(huì)詳細(xì)的對(duì)RepVGG的結(jié)構(gòu)和設(shè)計(jì)進(jìn)行分析RepVGG模型具有一個(gè)類似于VGG的拓?fù)浣Y(jié)構(gòu),沒有任何分支,模型只采用了3x3的卷積核和Relu激活函數(shù)?!咀⒁猓哼@里的RepVGG模型指的是推理(inference)時(shí)采用的結(jié)構(gòu),訓(xùn)練(training)時(shí)結(jié)構(gòu)不是這樣的】模型的結(jié)構(gòu)如下圖所示:
從上圖我們可以看出,在RepVGG的訓(xùn)練階段,其結(jié)構(gòu)借鑒了ResNet,同時(shí)引入了殘差結(jié)構(gòu)和1x1的卷積分支,在論文中也證明了加入殘差結(jié)構(gòu)和1x1的卷積均可以提升網(wǎng)絡(luò)的性能,如下圖所示:
至于RepVGG的推理階段,其結(jié)構(gòu)就是簡(jiǎn)單的3x3卷積同Relu函數(shù)的結(jié)合。
多路模型轉(zhuǎn)單路模型
這一部分絕對(duì)是RepVGG的核心了?。?!re- parameterization(重參數(shù)化)要做的其實(shí)就是要將多路模型轉(zhuǎn)成單路模型。首先我們要搞清楚我們要轉(zhuǎn)換的對(duì)象,即多路模型指什么?單路模型指什么?這兩個(gè)模型在上文已經(jīng)提及,多路模型指的就是在訓(xùn)練階段的模型,而單路模型指的是在推理階段的模型,如下圖:
現(xiàn)在我們的目標(biāo)有了,即將上圖右側(cè)模型轉(zhuǎn)換成左側(cè)。仔細(xì)觀察左右兩圖的區(qū)別,可以看出我們只需要將上圖黃框部分進(jìn)行轉(zhuǎn)換就可以了。下面來看看作者是怎么進(jìn)行轉(zhuǎn)換的下圖大致描述了多路模型轉(zhuǎn)換成單路模型的過程,從①到②涉及到了將3x3卷積和BN層的合并、1x1卷積轉(zhuǎn)換為3x3卷積及殘差模塊等效為特殊權(quán)重的卷積層?!咀⒁猓嚎赡苡行』锇榘l(fā)現(xiàn)上文圖中的卷積后都沒有BN層,為什么這里有了了,其實(shí)一般卷積后都會(huì)跟上BN進(jìn)行歸一化,上圖只是省略了網(wǎng)絡(luò)的一些細(xì)節(jié)】
1、卷積層和BN層的合并
上圖展示了卷積層和BN層合并的推導(dǎo)過程,非常容易理解。但需要注意的是這里的卷積層含有偏置b,往往現(xiàn)在帶有BN結(jié)構(gòu)的卷積都不含偏置b了,論文中的推導(dǎo)結(jié)構(gòu)就沒帶偏置b,如下圖所示:可以看出,下式和上圖推導(dǎo)結(jié)構(gòu)是一致的【符號(hào)表示有區(qū)別,沒有偏置項(xiàng)b】
2、1x1卷積轉(zhuǎn)換為3x3卷積
1x1卷積怎么轉(zhuǎn)化為3x3的卷積呢?不知道大家有沒有什么想法?♂??♂??♂?我覺得這個(gè)大家應(yīng)該是很容易就可以想到的——補(bǔ)兩圈0!所以這部分其實(shí)是沒什么好說的,論文中也是一筆帶過。但這里我還是想提醒大家注意一下,因?yàn)槲覀兊娜份敵鲎詈髸?huì)通過Add操作,因此在使用3x3卷積時(shí)應(yīng)該使用same形式,即保證輸入輸出的特征圖維度不變
3、殘差模塊轉(zhuǎn)換為3x3卷積
我們知道殘差模塊就是一個(gè)恒等映射,即要求輸入等于輸出。這一步該怎么實(shí)現(xiàn)呢?這里我們可以使用卷積核權(quán)重為1的1x1卷積,因?yàn)檫@樣的卷積核不會(huì)改變輸入特征圖的值,這樣我們就可以將殘差模塊等效為1x1的卷積操作了。之后再利用第2步將1x1的卷積轉(zhuǎn)化成3x3的卷積。
卷積的可加性原理
完成了上述三步,我們就可以實(shí)現(xiàn)從①到②的變換,即現(xiàn)在我們得到了含3路3x3卷積的結(jié)構(gòu),接下來就是要實(shí)現(xiàn)從②到③的轉(zhuǎn)化,即要將含3路3x3卷積的結(jié)構(gòu)變換成只有1路3x3卷積的結(jié)構(gòu)???這里需要利用卷積的可加性原理,即如果幾個(gè)大小兼容的二維核在相同的輸入上以相同的步幅操作以產(chǎn)生相同分辨率的輸出,并且它們的輸出被求和,我們可以將這些核在相應(yīng)的位置相加,從而得到一個(gè)產(chǎn)生相同輸出的等效核。這句話很好地總結(jié)了可加性原理,但是當(dāng)我開始看到這句話的時(shí)候也是不明白為什么,后面也是自己畫了一些圖,就恍然大悟,所以我想說很多時(shí)候我們應(yīng)該多動(dòng)手,好腦子不如爛筆頭下面給出整理的圖片幫助大家理解,如下圖:
看了上圖可以發(fā)現(xiàn),不管我們是先進(jìn)行卷積得到結(jié)果后再進(jìn)行Add操作,還是先將卷積核的值先相加得到新的卷積核,然后再進(jìn)行卷積,所得到的結(jié)果是一樣的,這就是卷積的可加性。由此可知,我們將②變?yōu)棰燮鋵?shí)只需要將三個(gè)3x3的卷積核的值進(jìn)行相加即可!
實(shí)驗(yàn)結(jié)果
上面其實(shí)就把RepVGG最核心的給講完了,下面來看一下RepVGG的效果叭。可以看出RepVGG的效果還是很好的,特別的表5中RepVGG-B2的FLOPs是EfficientNet-B3的10倍,但1080Ti上的速度是后者的2倍,這說明前者的計(jì)算密度是后者的20余倍。
希望本文章對(duì)你有所幫助!感謝支持!
評(píng)論