RepVGG谷歌翻譯

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

摘要

????我們提出了一種簡(jiǎn)單而強(qiáng)大的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)笨触,該架構(gòu)具有類(lèi)似于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)的,因此該模型稱(chēng)為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)相比,它顯示了良好的精度-速度折衷俊扳。可以在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ò)的基線(xiàn)菠赚。右圖:重量級(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)液茎。?

?該模型具有類(lèi)似VGG的普通(也稱(chēng)為前饋)拓?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è)階段达址,并在階段開(kāi)始時(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ù)淦ぃ纾琑esNet锄贷,使模型成為許多較淺模型的隱式集合[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的主體僅涉及一種類(lèi)型的操作:3*3 conv后跟ReLU,這使RepVGG在GPU等通用計(jì)算設(shè)備上快速運(yùn)行蝴韭。更好的是够颠,RepVGG允許專(zhuān)用硬件實(shí)現(xiàn)更高的速度,因?yàn)榻o定芯片尺寸和功耗榄鉴,我們需要的操作類(lèi)型越少履磨,我們可以集成到芯片上的計(jì)算單元就越多蛉抓。即,專(zhuān)用于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在圖像分類(lèi)和語(yǔ)義分割中的有效性,以及實(shí)現(xiàn)的效率和簡(jiǎn)便性杨刨。

2.相關(guān)工作

2.1晤柄。從單路徑到多分支

????在VGG [30]將ImageNet分類(lèi)的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)是有見(jiàn)地的妇智。最近的工作[24]結(jié)合了多種技術(shù)滥玷,包括泄漏ReLU,最大范數(shù)和仔細(xì)的初始化巍棱。在ImageNet上惑畴,它顯示具有147M參數(shù)的普通ConvNet可以達(dá)到74.6%的top-1精度,比其報(bào)告的基線(xiàn)(ResNet-101航徙、76.6%如贷,45M參數(shù))低2%。

值得注意的是到踏,本文不僅說(shuō)明了簡(jiǎn)單模型可以很好地收斂杠袱,而且無(wú)意訓(xùn)練像ResNets這樣的非常深的ConvNet。相反窝稿,我們旨在構(gòu)建一個(gè)具有合理深度和有利的精度-速度折衷的簡(jiǎn)單模型楣富,該模型可以通過(guò)最常見(jiàn)的組件(例如常規(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ì)稱(chēng)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之類(lèi)的庫(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)存開(kāi)銷(xiāo)而無(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,并引入了額外的開(kāi)銷(xiāo)嚼酝,例如內(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ì)專(zhuān)用硬件時(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)單,我們使用類(lèi)似于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)注意分飞,此類(lèi)轉(zhuǎn)換的等效條件要求3*3和1*1層具有相同的步幅悴务,并且后者的填充配置應(yīng)比前者少一個(gè)像素。例如譬猫,對(duì)于將輸入填充一個(gè)像素的3*3層(最常見(jiàn)的情況)讯檐,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僅具有一種類(lèi)型的操作梢灭。我們將3*3層分成5個(gè)階段夷家,階段的第一層向下采樣蒸其,步幅=2。對(duì)于圖像分類(lèi)库快,我們使用全局平均池摸袁,然后使用完全連接的層作為頭部。對(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ì)分類(lèi)或其他下游任務(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)單起見(jiàn)梭纹,我們?yōu)榇祟?lèi)層全局設(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上的基線(xiàn)進(jìn)行比較击儡,通過(guò)一系列的消融研究和比較證明結(jié)構(gòu)重新參數(shù)化的重要性,并驗(yàn)證RepVGG在語(yǔ)義分割上的泛化性能[41]蝠引。

4.1阳谍。 RepVGG用于ImageNet分類(lèi)

我們將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è)類(lèi)別)茧痒。我們分別使用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附加到模型名稱(chēng)作為后綴爪模。

表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è)試所有模型,并且所有基線(xiàn)的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%)的類(lèi)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è)置礼烈,從頭開(kāi)始訓(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)建了一系列變體和基線(xiàn),用于在RepVGG-B0上進(jìn)行比較(表7)铜异。同樣哥倔,所有模塊都在120個(gè)時(shí)期內(nèi)從零開(kā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í)際用途芽突,我們只希望了解更多的非線(xiàn)性是否會(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ò)以類(lèi)似于ResNet的方式重新組織每個(gè)階段(每個(gè)塊2層)攀甚。具體來(lái)說(shuō)箩朴,生成的模型在第一個(gè)和最后一個(gè)階段具有one3 3layer,在stage2秋度、3炸庞、4具有2、3荚斯、8個(gè)殘差塊埠居,并且使用類(lèi)似于ResNet-18 / 34的快捷方式。

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


表5:RepVGG模型和基線(xiàn)在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í)在于枷餐,前者依賴(lài)于通過(guò)具有非線(xiàn)性行為(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這樣的非線(xiàn)性組件,前者不能被后者近似唉匾。有證據(jù)表明孕讳,去除BN會(huì)降低精度匠楚,而增加ReLU則會(huì)提高精度。換句話(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塊裆甩,并從頭開(kāi)始訓(xùn)練120個(gè)紀(jì)元冗锁。準(zhǔn)確性為76.34%,僅比ResNet-50基線(xiàn)高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è)類(lèi)別。我們使用PSPNet [41]框架昨凡,一個(gè)以0.01為底爽醋,功效為0.9,權(quán)重衰減為10 4便脊,8個(gè)GPU的全局批處理大小為16個(gè)(共40個(gè)紀(jì)元)的多學(xué)習(xí)率策略蚂四。為了公平起見(jiàn),我們僅將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)化相同),因此此類(lèi)修改會(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與變體和基線(xiàn)的比較士嚎。
表8:在驗(yàn)證子集上測(cè)試的Cityscapes [3]上的語(yǔ)義分割。在同一1080Ti GPU上以批處理大小16悔叽,全精度(fp32)和輸入分辨率713713測(cè)試了速度(示例/秒)莱衩。


4.4。局限性

RepVGG模型是快速娇澎,簡(jiǎn)單和實(shí)用的ConvNet笨蚁,旨在在GPU和專(zhuān)用硬件上以最高速度運(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和專(zhuān)用推理芯片炫彩。通過(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)系作者
  • 序言:七十年代末丁频,一起剝皮案震驚了整個(gè)濱河市杉允,隨后出現(xiàn)的幾起案子邑贴,更是在濱河造成了極大的恐慌,老刑警劉巖叔磷,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拢驾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡改基,警方通過(guò)查閱死者的電腦和手機(jī)繁疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秕狰,“玉大人稠腊,你說(shuō)我怎么就攤上這事∶В” “怎么了架忌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)我衬。 經(jīng)常有香客問(wèn)我鳖昌,道長(zhǎng),這世上最難降的妖魔是什么低飒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任许昨,我火速辦了婚禮,結(jié)果婚禮上褥赊,老公的妹妹穿的比我還像新娘糕档。我一直安慰自己,他們只是感情好拌喉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布速那。 她就那樣靜靜地躺著,像睡著了一般尿背。 火紅的嫁衣襯著肌膚如雪端仰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天田藐,我揣著相機(jī)與錄音荔烧,去河邊找鬼。 笑死汽久,一個(gè)胖子當(dāng)著我的面吹牛鹤竭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播景醇,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼臀稚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了三痰?” 一聲冷哼從身側(cè)響起吧寺,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窜管,失蹤者是張志新(化名)和其女友劉穎租谈,沒(méi)想到半個(gè)月后界斜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氓奈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年抒钱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜓肆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谋币,死狀恐怖仗扬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕾额,我是刑警寧澤早芭,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站诅蝶,受9級(jí)特大地震影響退个,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜调炬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一语盈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缰泡,春花似錦刀荒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宜猜,卻和暖如春泼返,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姨拥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工绅喉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垫毙。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓霹疫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親综芥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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