女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于魯棒神經(jīng)架構(gòu)的設(shè)計(jì)

3D視覺(jué)工坊 ? 來(lái)源:3D視覺(jué)工坊 ? 2023-07-17 14:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導(dǎo)讀 繼卷積神經(jīng)網(wǎng)絡(luò)之后,Transformer又推進(jìn)了圖像識(shí)別的發(fā)展,成為視覺(jué)領(lǐng)域的又一主導(dǎo)。最近有人提出Transformer的這種優(yōu)越性應(yīng)歸功于Self-Attention的架構(gòu)本身,本文帶著質(zhì)疑的態(tài)度對(duì)Transformer進(jìn)行了仔細(xì)研究,提出了3種高效的架構(gòu)設(shè)計(jì),將這些組件結(jié)合在一起構(gòu)建一種純粹的CNN架構(gòu),其魯棒性甚至比Transformer更優(yōu)越。

視覺(jué)Transformer最近的成功動(dòng)搖了卷積神經(jīng)網(wǎng)絡(luò)(CNNs)在圖像識(shí)別領(lǐng)域十年來(lái)的長(zhǎng)期主導(dǎo)地位。具體而言,就out-of-distribution樣本的魯棒性而言,最近的研究發(fā)現(xiàn),無(wú)論不同的訓(xùn)練設(shè)置如何,Transformer本質(zhì)上都比神經(jīng)網(wǎng)絡(luò)更魯棒。 此外,人們認(rèn)為T(mén)ransformer的這種優(yōu)越性在很大程度上應(yīng)該歸功于它們類(lèi)似Self-Attention的架構(gòu)本身。在本文中,作者通過(guò)仔細(xì)研究Transformer的設(shè)計(jì)來(lái)質(zhì)疑這種信念。作者的發(fā)現(xiàn)導(dǎo)致了3種高效的架構(gòu)設(shè)計(jì),以提高魯棒性,但足夠簡(jiǎn)單,可以在幾行代碼中實(shí)現(xiàn),即:

對(duì)輸入圖像進(jìn)行拼接

擴(kuò)大kernel-size

減少激活層和規(guī)范化層

將這些組件結(jié)合在一起,作者能夠構(gòu)建純粹的CNN架構(gòu),而無(wú)需任何像Transformer一樣魯棒甚至比Transformer更魯棒的類(lèi)似注意力的操作。作者希望這項(xiàng)工作能夠幫助社區(qū)更好地理解魯棒神經(jīng)架構(gòu)的設(shè)計(jì)。

1、簡(jiǎn)介

深度學(xué)習(xí)計(jì)算機(jī)視覺(jué)中的成功很大程度上是由卷積神經(jīng)網(wǎng)絡(luò)(CNNs)推動(dòng)的。從AlexNet這一里程碑式的工作開(kāi)始,CNNs不斷地向計(jì)算機(jī)視覺(jué)的前沿邁進(jìn)。有趣的是,最近出現(xiàn)的視覺(jué)Transformer(ViT)挑戰(zhàn)了神經(jīng)網(wǎng)絡(luò)的領(lǐng)先地位。ViT通過(guò)將純粹的基于Self-Attention的架構(gòu)應(yīng)用于圖像Patch序列,提供了一個(gè)完全不同的路線圖。與CNN相比,ViT能夠在廣泛的視覺(jué)基準(zhǔn)上獲得有競(jìng)爭(zhēng)力的性能。 最近關(guān)于out-of-distribution魯棒性的研究進(jìn)一步加劇了神經(jīng)網(wǎng)絡(luò)和Transformer之間的爭(zhēng)論。與兩種模型緊密匹配的標(biāo)準(zhǔn)視覺(jué)基準(zhǔn)不同,Transformer在開(kāi)箱測(cè)試時(shí)比神經(jīng)網(wǎng)絡(luò)更強(qiáng)大。此外,Bai等人認(rèn)為,這種強(qiáng)大的out-of-distribution魯棒性并沒(méi)有從中提供的高級(jí)訓(xùn)練配置中受益,而是與Transformer的類(lèi)似Self-Attention的架構(gòu)內(nèi)在地聯(lián)系在一起。例如,簡(jiǎn)單地將純CNN“升級(jí)”為混合架構(gòu)(即同時(shí)具有CNN塊和Transformer塊)可以有效地提高out-of-distribution魯棒性。 盡管人們普遍認(rèn)為架構(gòu)差異是導(dǎo)致Transformer和CNNs之間魯棒性差距的關(guān)鍵因素,但現(xiàn)有的工作并沒(méi)有回答Transformer中的哪些架構(gòu)元素應(yīng)該歸因于這種更強(qiáng)的魯棒性。最相關(guān)的分析都指出,Self-Attention操作是中樞單元的Transformer塊對(duì)魯棒性至關(guān)重要。盡管如此,給定

Transformer塊本身已經(jīng)是一個(gè)復(fù)合設(shè)計(jì)

Transformer還包含許多其他層(例如,Patch嵌入層),魯棒性和Transformer的架構(gòu)元素之間的關(guān)系仍然令人困惑。

在這項(xiàng)工作中,作者將更深入地了解Transformer的架構(gòu)設(shè)計(jì)。更重要的是,作者旨在借助Transformer中的架構(gòu)元素,探索神經(jīng)網(wǎng)絡(luò)是否也能成為強(qiáng)大的學(xué)習(xí)者。 從神經(jīng)架構(gòu)設(shè)計(jì)的角度來(lái)看,作者的診斷為提高out-of-distribution魯棒性提供了3個(gè)關(guān)鍵信息:

首先,將圖像拼接成不重疊的Patch可以顯著地提高out-of-distribution魯棒性;更有趣的是,關(guān)于Patch大小的選擇,作者發(fā)現(xiàn)越大越好;

其次,盡管應(yīng)用小卷積核是一種流行的設(shè)計(jì)方法,但作者觀察到,采用更大的卷積核(例如,從3×3到7×7,甚至到11×11)對(duì)于確保out-of-distribution樣本的模型魯棒性是必要的;

最后,受最近工作的啟發(fā),作者注意到減少規(guī)范化層和激活函數(shù)的數(shù)量有利于out-of-distribution魯棒性;同時(shí),由于使用的規(guī)范化層較少,訓(xùn)練速度可能會(huì)加快23%。

493c780a-2452-11ee-962d-dac502259ad0.png 作者的實(shí)驗(yàn)驗(yàn)證了所有這3個(gè)體系結(jié)構(gòu)元素在一組CNN體系結(jié)構(gòu)上一致有效地提高了out-of-distribution魯棒性。據(jù)報(bào)道,最大的改進(jìn)是將所有這些集成到CNNs的架構(gòu)設(shè)計(jì)中,如圖1所示,在不應(yīng)用任何類(lèi)似Self-Attention的組件的情況下,作者的增強(qiáng)型ResNet(稱(chēng)為Robust-ResNet)能夠在Stylized-ImageNet上比類(lèi)似規(guī)模的Transformer DeiT-S高2.4%(16.2%對(duì)18.6%),在ImageNet-C上高0.5%(42.8%對(duì)42.3%),ImageNet-R上為4.0%(41.9%對(duì)45.9%),ImageNet Sketch上為3.9%(29.1%對(duì)33.0%)。 作者希望這項(xiàng)工作能幫助社區(qū)更好地理解設(shè)計(jì)魯棒神經(jīng)架構(gòu)的基本原理。

2、SETTINGS

在本文中,使用ResNet和ViT對(duì)CNN和Transformer之間的魯棒性進(jìn)行了徹底的比較。

2.1、CNN Block Instantiations

如圖2所示,本文作者考慮4種不同的塊實(shí)例化。 49943fa4-2452-11ee-962d-dac502259ad0.png

第1個(gè)Block是Depth-wise ResNet Bottleneck block,其中3×3卷積層被3×3深度卷積層取代;

第2個(gè)Block是Inverted Depth-wise ResNet Bottleneck block,其中隱藏維度是輸入維度的4倍;

第3個(gè)Block基于第2個(gè)Block,深度卷積層在ConvNeXT中的位置向上移動(dòng);

基于第2個(gè)Block,第4 Block向下移動(dòng)深度卷積層的位置。

作者用這4個(gè)塊替換了原始ResNet架構(gòu)中的Bottleneck構(gòu)建塊,并將生成的模型分別稱(chēng)為ResNet-DW、ResNet-Inverted-DW、 ResNet-Up-Inverted-DW和ResNet-Down-Inverted-DW。

2.2、Computational Cost

在這項(xiàng)工作中,作者使用FLOP來(lái)測(cè)量模型大小。在這里,作者注意到,由于使用了深度卷積,用上述4個(gè)實(shí)例化塊直接替換ResNet Bottleneck 塊將顯著減少模型的總FLOP。 為了減少計(jì)算成本損失并提高模型性能,遵循ResNeXT的精神,作者將每個(gè)階段的通道設(shè)置從(64,128,256,512)更改為(96,192,384,768)。 49c69292-2452-11ee-962d-dac502259ad0.png 然后,作者在第3階段調(diào)整塊數(shù),以保持 Baseline 模型的總FLOP與DeiT-S大致相同。作者的 Baseline模型的最終FLOP如表1所示。除非另有說(shuō)明,否則本工作中考慮的所有模型都與DEITS具有相似的規(guī)模。

2.3、Robustness Benchmarks

在這項(xiàng)工作中,作者使用以下基準(zhǔn)廣泛評(píng)估了模型在out-of-distribution魯棒性方面的性能:

Stylized-ImageNet,它包含具有形狀-紋理沖突線索的合成圖像;

ImageNet-C,具有各種常見(jiàn)的圖像損壞;

ImageNet-R,它包含具有不同紋理和局部圖像統(tǒng)計(jì)的ImageNet對(duì)象類(lèi)的自然呈現(xiàn);

ImageNet Sketch,其中包括在線收集的相同ImageNet類(lèi)的草圖圖像。

2.4、Training Recipe

神經(jīng)網(wǎng)絡(luò)可以通過(guò)簡(jiǎn)單地調(diào)整訓(xùn)練配置來(lái)實(shí)現(xiàn)更好的魯棒性。因此,在這項(xiàng)工作中,除非另有說(shuō)明,否則作者將標(biāo)準(zhǔn)的300-epoch DeiT訓(xùn)練配置應(yīng)用于所有模型,因此模型之間的性能差異只能歸因于架構(gòu)差異。

2.5、Baseline Results

為了簡(jiǎn)單起見(jiàn),作者使用“IN”、“S-IN”、”INC“、”IN-R“和”IN-SK“作為“ImageNet”、“Styleized ImageNet”,“ImageNet-C”、“ImageNet-R”和“ImageNet Sketch”的縮寫(xiě)。 49c69292-2452-11ee-962d-dac502259ad0.png 結(jié)果如表1所示,DeiT-S表現(xiàn)出比ResNet50更強(qiáng)的魯棒性泛化。此外,作者注意到,即使配備了更強(qiáng)的深度卷積層,ResNet架構(gòu)也只能在clean圖像上實(shí)現(xiàn)相當(dāng)?shù)木?,同時(shí)保持明顯不如DeiT架構(gòu)的魯棒性。這一發(fā)現(xiàn)表明,視覺(jué)Transformer令人印象深刻的魯棒性的關(guān)鍵在于其架構(gòu)設(shè)計(jì)。

3、COMPONENT DIAGNOSIS

3.1、PATCHIFY STEM

CNN或Transformer通常在網(wǎng)絡(luò)開(kāi)始時(shí)對(duì)輸入圖像進(jìn)行下采樣,以獲得適當(dāng)?shù)奶卣鲌D大小。標(biāo)準(zhǔn)的ResNet架構(gòu)通過(guò)使用Stride為2的7×7卷積層,然后使用Stride為2中的3×3最大池化來(lái)實(shí)現(xiàn)這一點(diǎn),從而降低了4倍的分辨率。 另一方面,ViT采用了一種更積極的下采樣策略,將輸入圖像劃分為p×p個(gè)不重疊的Patch,并用線性層投影每個(gè)Patch。在實(shí)踐中,這是通過(guò)具有 kernel-size p和Stride p的卷積層來(lái)實(shí)現(xiàn)的,其中p通常設(shè)置為16。這里,ViT中的典型ResNet Block或Self-Attention塊之前的層被稱(chēng)為Backbone。雖然之前的工作已經(jīng)研究了神經(jīng)網(wǎng)絡(luò)和Transformer中Stem設(shè)置的重要性,但沒(méi)有人從魯棒性的角度來(lái)研究這個(gè)模塊。 為了進(jìn)一步研究這一點(diǎn),作者將 Baseline 模型中的ResNet-style stem替換為 ViT-style patchify stem。具體來(lái)說(shuō),作者使用 kernel-size 為p和Stride為p的卷積層,其中p從4到16不等。作者保持模型的總Stride固定,因此224×224的輸入圖像將始終在最終全局池化層之前產(chǎn)生7×7的特征圖。 特別地,原始ResNet在階段2、3和4中為第1個(gè)塊設(shè)置Stride=2。當(dāng)使用8×8 patchify Stem時(shí),作者在第2階段為第1個(gè)塊設(shè)置Stride=1,當(dāng)使用16×16 patchify stem時(shí),在第2和第3階段為第1塊設(shè)置Stride=1。為了確保公平的比較,作者在第3階段添加了額外的塊,以保持與以前類(lèi)似的FLOP。 4a85c9fa-2452-11ee-962d-dac502259ad0.png 在表2中,作者觀察到,增加ViT-style Patch Stem的Patch大小會(huì)提高魯棒性基準(zhǔn)的性能,盡管可能會(huì)以clean準(zhǔn)確性為代價(jià)。具體而言,對(duì)于所有 Baseline 模型,當(dāng)Patch大小設(shè)置為8時(shí),所有魯棒性基準(zhǔn)的性能至少提高了0.6%。當(dāng)Patch大小增加到16時(shí),所有魯棒性基準(zhǔn)的性能提高了至少1.2%,其中最顯著的改進(jìn)是Stylized-ImageNet的6.6%。 根據(jù)這些結(jié)果,作者可以得出結(jié)論,這種簡(jiǎn)單的Patch操作在很大程度上有助于ViT的強(qiáng)大魯棒性,同時(shí),可以在縮小CNNs和Transformers之間的魯棒性差距方面發(fā)揮重要作用。 作者還對(duì) Advanced patchify stems進(jìn)行了實(shí)驗(yàn)。令人驚訝的是,雖然這些Stem提高了相應(yīng)的干凈圖像的準(zhǔn)確性,但作者發(fā)現(xiàn)它們對(duì)out-of-distribution魯棒性的貢獻(xiàn)很小。這一觀察結(jié)果表明,clean準(zhǔn)確性和out-of-distribution的魯棒性并不總是表現(xiàn)出正相關(guān)性。換言之,增強(qiáng)clean精度的設(shè)計(jì)可能不一定會(huì)帶來(lái)更好的魯棒性。強(qiáng)調(diào)了探索除了提高clean精度之外還可以提高魯棒性的方法的重要性。

3.2、LARGE KERNEL SIZE

將Self-Attention運(yùn)算與經(jīng)典卷積運(yùn)算區(qū)分開(kāi)來(lái)的一個(gè)關(guān)鍵特性是,它能夠?qū)φ麄€(gè)輸入圖像或特征圖進(jìn)行運(yùn)算,從而產(chǎn)生全局感受野。甚至在Vision Transformer出現(xiàn)之前,就已經(jīng)證明了捕獲長(zhǎng)期依賴(lài)關(guān)系對(duì)神經(jīng)網(wǎng)絡(luò)的重要性。一個(gè)值得注意的例子是 Non-local 神經(jīng)網(wǎng)絡(luò),它已被證明對(duì)靜態(tài)和序列圖像識(shí)別都非常有效,即使只配備了一個(gè)non-local block。然而,CNN中最常用的方法仍然是堆疊多個(gè)3×3卷積層,以隨著網(wǎng)絡(luò)的深入逐漸增加網(wǎng)絡(luò)的感受野。 4ae90d80-2452-11ee-962d-dac502259ad0.png

在本節(jié)中,作者旨在通過(guò)增加深度卷積層的內(nèi) kernel-size 來(lái)模擬Self-Attention塊的行為。如圖3所示,作者對(duì)不同大小的Kernel進(jìn)行了實(shí)驗(yàn),包括5、7、9、11和13,并在不同的魯棒性基準(zhǔn)上評(píng)估了它們的性能。作者的研究結(jié)果表明,較大的 kernel-size 通常會(huì)帶來(lái)更好的clean精度和更強(qiáng)的魯棒性。盡管如此,作者也觀察到,當(dāng) kernel-size 變得太大時(shí),性能增益會(huì)逐漸飽和。

值得注意的是,使用具有較大Kernel的(標(biāo)準(zhǔn))卷積將導(dǎo)致計(jì)算量的顯著增加。例如,如果作者直接將ResNet50中的 kernel-size 從3更改為5,則生成的模型的總FLOP將為7.4G,這比Transformer的對(duì)應(yīng)模型大得多。

然而,在使用深度卷積層的情況下,將內(nèi) kernel-size 從3增加到13通常只會(huì)使FLOP增加0.3G,與DeiT-S(4.6G)的FLOP相比相對(duì)較小。

這里唯一的例外情況是ResNet-Inverted-DW:由于其Inverted Bottleneck設(shè)計(jì)中的大通道尺寸,將 kernel-size 從3增加到13帶來(lái)了1.4G FLOP的增加,這在某種程度上是一個(gè)不公平的比較。順便說(shuō)一句,使用具有大Patchvsize的Patch Stem可以減輕大 kernel-size 所產(chǎn)生的額外計(jì)算成本。

因此,作者的最終模型仍將處于與DeiT-S相同的規(guī)模。對(duì)于具有多個(gè)擬議設(shè)計(jì)的模型。

3.3、減少激活層和規(guī)范化層

與ResNet塊相比,典型的Vision Transformer塊具有更少的激活和規(guī)范化層。這種架構(gòu)設(shè)計(jì)選擇也被發(fā)現(xiàn)在提高ConvNeXT的性能方面是有效的。受此啟發(fā),作者采用了在所有4個(gè)塊實(shí)例化中減少激活和規(guī)范化層的數(shù)量的想法,以探索其對(duì)魯棒性泛化的影響。 具體而言,ResNet塊通常包含一個(gè)規(guī)范化層和每個(gè)卷積層之后的一個(gè)激活層,導(dǎo)致一個(gè)塊中總共有3個(gè)規(guī)范化和激活層。在作者的實(shí)現(xiàn)中,作者從每個(gè)塊中移除了兩個(gè)規(guī)范化層和激活層,從而只產(chǎn)生了一個(gè)規(guī)范化和激活層。 4b1cb478-2452-11ee-962d-dac502259ad0.png 如圖4所示,作者用去除激活層和規(guī)范化層的不同組合進(jìn)行了實(shí)驗(yàn),并根據(jù)經(jīng)驗(yàn)發(fā)現(xiàn),在通道維度擴(kuò)展的卷積層之后只留下一個(gè)激活層(即輸出通道的數(shù)量大于輸入通道的數(shù)量),在第一次卷積之后留下一個(gè)規(guī)范化層,可以獲得最佳結(jié)果層最佳配置。 具有不同去除層的模型的結(jié)果如表3和表4所示。 4b5ccdd8-2452-11ee-962d-dac502259ad0.png4b9d7090-2452-11ee-962d-dac502259ad0.png 例如,對(duì)于 ResNet-Up-Inverted-DW,作者觀察到Stylized-ImageNet上有1.4%的顯著改進(jìn)(14.3%對(duì)12.9%),ImageNet-C上有2.9%的改進(jìn)(45.0%對(duì)47.9%),ImageNet-R上有4.3%的改進(jìn)(47.2%對(duì)42.9%),而ImageNet Sketch上有2.3%的改進(jìn)(33.1%對(duì)30.8%)。 此外,減少規(guī)范化層的數(shù)量會(huì)降低GPU內(nèi)存使用率并加快訓(xùn)練,通過(guò)簡(jiǎn)單地去除幾個(gè)規(guī)范化層來(lái)實(shí)現(xiàn)高達(dá)23%的加速。

4、組件組合

在本節(jié)中,作者將探討組合所有建議的組件對(duì)模型性能的影響。具體來(lái)說(shuō),作者采用了16×16的Patch Stem和11×11的 kernel-size ,以及為所有架構(gòu)放置規(guī)范化和激活層的相應(yīng)最佳位置。 這里的一個(gè)例外是ResNet-Inverted-DW,作者使用7×7的 kernel-size ,因?yàn)樽髡吒鶕?jù)經(jīng)驗(yàn)發(fā)現(xiàn),使用過(guò)大的 kernel-size (例如,11×11)會(huì)導(dǎo)致不穩(wěn)定的訓(xùn)練。 4c07654a-2452-11ee-962d-dac502259ad0.png4c569da4-2452-11ee-962d-dac502259ad0.png4c8088b2-2452-11ee-962d-dac502259ad0.png4cb5ffce-2452-11ee-962d-dac502259ad0.png 如表5和表9、表10、表11所示,作者可以看到這些簡(jiǎn)單的設(shè)計(jì)不僅在單獨(dú)應(yīng)用于ResNet時(shí)效果良好,而且在一起使用時(shí)效果更好。 此外,通過(guò)采用所有3種設(shè)計(jì),ResNet現(xiàn)在在所有4個(gè)out-of-distribution基準(zhǔn)測(cè)試上都優(yōu)于DeiT。這些結(jié)果證實(shí)了作者提出的架構(gòu)設(shè)計(jì)的有效性,并表明沒(méi)有任何類(lèi)Self-Attention塊的純CNN可以實(shí)現(xiàn)與ViT一樣好的魯棒性。

5、知識(shí)蒸餾

知識(shí)蒸餾是一種通過(guò)轉(zhuǎn)移更強(qiáng)的教師模型的知識(shí)來(lái)訓(xùn)練能力較弱的學(xué)生模型的技術(shù)。通常情況下,學(xué)生模型可以通過(guò)知識(shí)蒸餾獲得與教師模型相似甚至更好的性能。然而,直接應(yīng)用知識(shí)蒸餾讓ResNet-50(學(xué)生模型)向DeiT-S(教師模型)學(xué)習(xí)在增強(qiáng)魯棒性方面效果較差。

令人驚訝的是,當(dāng)模型角色切換時(shí),學(xué)生模型DeiT-S在一系列魯棒性基準(zhǔn)上顯著優(yōu)于教師模型ResNet-50,從而得出結(jié)論,實(shí)現(xiàn)DeiT良好魯棒性的關(guān)鍵在于其架構(gòu),因此不能通過(guò)知識(shí)蒸餾將其轉(zhuǎn)移到ResNet。

4cf4f972-2452-11ee-962d-dac502259ad0.png 為了進(jìn)一步研究這一點(diǎn),作者用將所有3種提出的建筑設(shè)計(jì)相結(jié)合的模型作為學(xué)生模型,并用DeiT-S作為教師模型來(lái)重復(fù)這些實(shí)驗(yàn)。如表所示,作者觀察到,在ViT提出的架構(gòu)組件的幫助下,作者得到的Robust ResNet系列現(xiàn)在可以在out-of-distribution樣本上始終比DeiT表現(xiàn)得更好。相比之下,盡管 Baseline 模型在clean ImageNet上取得了良好的性能,但不如教師模型DeiT那樣魯棒。

6、更大的模型

為了證明作者提出的模型在更大尺度上的有效性,作者進(jìn)行了實(shí)驗(yàn)來(lái)匹配DeiT Base的總FLOP。具體而言,作者將基本通道維度增加到(128、256、512和1024),并在網(wǎng)絡(luò)的第3階段添加20多個(gè)塊,同時(shí)使用ConvNeXT-B配置進(jìn)行訓(xùn)練。作者將調(diào)整后的模型的性能與DeiT-B進(jìn)行了比較,如表7所示。 4d222a28-2452-11ee-962d-dac502259ad0.png 作者的結(jié)果表明,即使在更大的規(guī)模上,作者提出的Robust-ResNet家族也能很好地對(duì)抗DeiT-B,這表明作者的方法在擴(kuò)大模型規(guī)模方面有很大的潛力。

7、更多STEM實(shí)驗(yàn)

最近的研究表明,用少量stacked 2-stride 3×3 convolution layers取代ViT-style patchify stem可以極大地簡(jiǎn)化優(yōu)化,從而提高clean精度。為了驗(yàn)證其在魯棒性基準(zhǔn)上的有效性,作者還實(shí)現(xiàn)了ViT-S的卷積Backbone,使用4個(gè)3×3卷積層的堆棧,Stride為2。 結(jié)果如表8所示。令人驚訝的是,盡管卷積stem的使用確實(shí)獲得了更高的clean精度,但在out-of-distribution魯棒性方面,它似乎不如ViT-style patchify stem有幫助。 4d47f334-2452-11ee-962d-dac502259ad0.png

8、與其他模型的比較

除了DeiT,這里作者還評(píng)估了作者提出的Robust-ResNet模型,ConvNeXt和Swin-Transformer,在out-of-distribution魯棒性。如表12中所示,4個(gè)模型中,所有的out-of-distribution測(cè)試的性能都類(lèi)似于ConvNeXt或Swin-Transformer或更好。 4d8971f6-2452-11ee-962d-dac502259ad0.png

9、重復(fù)實(shí)驗(yàn)

為了證明作者提出的組件所實(shí)現(xiàn)的魯棒性改進(jìn)的統(tǒng)計(jì)意義,作者用不同的隨機(jī)種子進(jìn)行了3次實(shí)驗(yàn),并在表13中報(bào)告了平均值和標(biāo)準(zhǔn)差。作者在3次運(yùn)行中只觀察到很小的變化,這證實(shí)了作者提出的模型實(shí)現(xiàn)了一致和可靠的性能增益。 4db34ec2-2452-11ee-962d-dac502259ad0.png

10、Imagenet評(píng)估

ImageNet-A數(shù)據(jù)集包括一組自然對(duì)抗性樣本,這些樣本對(duì)機(jī)器學(xué)習(xí)模型的性能有相當(dāng)大的負(fù)面影響。在表14中,作者比較了作者的Robust-ResNet模型和DeiT在ImageNet-A數(shù)據(jù)集上的性能。 值得注意的是,雖然Robust ResNet模型在輸入分辨率為224的情況下不如DeiT執(zhí)行得好,但將輸入分辨率增加(例如,增加到320)顯著縮小了Robust ResNet和ImageNet-A上的DeiT之間的差距。作者推測(cè)這是因?yàn)镮mageNet-A中感興趣的目標(biāo)往往比標(biāo)準(zhǔn)ImageNet中的目標(biāo)小。 4e0c8776-2452-11ee-962d-dac502259ad0.png

11、結(jié)構(gòu)化重參

最近的一系列工作通過(guò)結(jié)構(gòu)重參化促進(jìn)了訓(xùn)練多分支但推理plain模型架構(gòu)的想法。RepLKNet特別表明,使用小Kernel的重參化可以緩解與大Kernel卷積層相關(guān)的優(yōu)化問(wèn)題,而不會(huì)產(chǎn)生額外的推理成本。 4e55d9f8-2452-11ee-962d-dac502259ad0.png 考慮到Robust ResNet模型也使用大Kernel,作者在這里試驗(yàn)了結(jié)構(gòu)重參化的想法,并利用訓(xùn)練時(shí)間多分支塊架構(gòu)來(lái)進(jìn)一步提高模型性能。塊架構(gòu)如圖5所示。 4e991c54-2452-11ee-962d-dac502259ad0.png4ef08002-2452-11ee-962d-dac502259ad0.png 表15和表16顯示了兩種不同模型尺度的結(jié)果,表明這種重參化方法總體上提高了性能。一個(gè)例外可能是Robust ResNet-Up-Inverted-DW,它偶爾會(huì)在重參化的情況下表現(xiàn)出稍差的魯棒性。 值得注意的是,通過(guò)重參化技術(shù),作者能夠使用 kernel-size 為11的卷積來(lái)訓(xùn)練Robust-ResNet-Up-Inverted-DW模型。

12、總結(jié)

最近的研究聲稱(chēng),Transformer在out-of-distribution樣本上的表現(xiàn)優(yōu)于神經(jīng)網(wǎng)絡(luò),類(lèi)Self-Attention架構(gòu)是主要因素。相比之下,本文更仔細(xì)地研究了Transformer架構(gòu),并確定了Self-Attention塊之外的幾個(gè)有益設(shè)計(jì)。通過(guò)將這些設(shè)計(jì)結(jié)合到ResNet中,作者開(kāi)發(fā)了一種CNN架構(gòu),該架構(gòu)可以匹配甚至超過(guò)同等大小的視覺(jué)Transformer模型的魯棒性。 作者希望作者的發(fā)現(xiàn)能促使研究人員重新評(píng)估Transformers和CNNs之間的魯棒性比較,并啟發(fā)人們進(jìn)一步研究開(kāi)發(fā)更具魯棒性的架構(gòu)設(shè)計(jì)。

13、參考

[1].CAN CNNS BE MORE ROBUST THAN TRANSFORMERS?.

14、Robust ResNet的實(shí)現(xiàn)

fromcollectionsimportOrderedDict
fromfunctoolsimportpartial

importtorch
importtorch.nnasnn
fromtimm.dataimportIMAGENET_DEFAULT_MEAN,IMAGENET_DEFAULT_STD
from.helpersimportbuild_model_with_cfg
from.layersimportSelectAdaptivePool2d,AvgPool2dSame
from.layersimportRobustResNetDWBlock,RobustResNetDWInvertedBlock,RobustResNetDWUpInvertedBlock,RobustResNetDWDownInvertedBlock
from.registryimportregister_model


__all__=['RobustResNet']#model_registrywilladdeachentrypointfntothis


def_cfg(url='',**kwargs):
return{
'url':url,
'num_classes':1000,'input_size':(3,224,224),'pool_size':(7,7),
'crop_pct':0.875,'interpolation':'bicubic',
'mean':IMAGENET_DEFAULT_MEAN,'std':IMAGENET_DEFAULT_STD,
'first_conv':'stem.0','classifier':'head.fc',
**kwargs
}


default_cfgs=dict(
small=_cfg(),
base=_cfg(),
)


defget_padding(kernel_size,stride,dilation=1):
padding=((stride-1)+dilation*(kernel_size-1))//2
returnpadding


defdownsample_conv(
in_channels,out_channels,kernel_size,stride=1,dilation=1,first_dilation=None,norm_layer=None):
norm_layer=norm_layerornn.BatchNorm2d
kernel_size=1ifstride==1anddilation==1elsekernel_size
first_dilation=(first_dilationordilation)ifkernel_size>1else1
p=get_padding(kernel_size,stride,first_dilation)

returnnn.Sequential(*[
nn.Conv2d(
in_channels,out_channels,kernel_size,stride=stride,padding=p,dilation=first_dilation,bias=True),
norm_layer(out_channels)
])


defdownsample_avg(
in_channels,out_channels,kernel_size,stride=1,dilation=1,first_dilation=None,norm_layer=None):
norm_layer=norm_layerornn.BatchNorm2d
avg_stride=strideifdilation==1else1
ifstride==1anddilation==1:
pool=nn.Identity()
else:
avg_pool_fn=AvgPool2dSameifavg_stride==1anddilation>1elsenn.AvgPool2d
pool=avg_pool_fn(2,avg_stride,ceil_mode=True,count_include_pad=False)

returnnn.Sequential(*[
pool,
nn.Conv2d(in_channels,out_channels,1,stride=1,padding=0,bias=True),
norm_layer(out_channels)
])


classStage(nn.Module):
def__init__(
self,block_fn,in_chs,chs,stride=2,depth=2,dp_rates=None,layer_scale_init_value=1.0,
norm_layer=nn.BatchNorm2d,act_layer=partial(nn.ReLU,partial=True),
avg_down=False,down_kernel_size=1,mlp_ratio=4.,inverted=False,**kwargs):
super().__init__()

blocks=[]
dp_rates=dp_ratesor[0.]*depth
forblock_idxinrange(depth):
stride_block_idx=depth-1ifblock_fn==RobustResNetDWDownInvertedBlockelse0
current_stride=strideifblock_idx==stride_block_idxelse1

downsample=None
ifinverted:
ifin_chs!=chsorcurrent_stride>1:
down_kwargs=dict(
in_channels=in_chs,out_channels=chs,kernel_size=down_kernel_size,
stride=current_stride,norm_layer=norm_layer)
downsample=downsample_avg(**down_kwargs)ifavg_downelsedownsample_conv(**down_kwargs)
else:
ifin_chs!=int(mlp_ratio*chs)orcurrent_stride>1:
down_kwargs=dict(
in_channels=in_chs,out_channels=int(mlp_ratio*chs),kernel_size=down_kernel_size,
stride=current_stride,norm_layer=norm_layer)
downsample=downsample_avg(**down_kwargs)ifavg_downelsedownsample_conv(**down_kwargs)
ifdownsampleisnotNone:
assertblock_idxin[0,depth-1]

blocks.append(block_fn(
indim=in_chs,dim=chs,drop_path=dp_rates[block_idx],layer_scale_init_value=layer_scale_init_value,
mlp_ratio=mlp_ratio,
norm_layer=norm_layer,act_layer=act_layer,
stride=current_stride,
downsample=downsample,
**kwargs,
))
in_chs=int(chs*mlp_ratio)ifnotinvertedelsechs

self.blocks=nn.Sequential(*blocks)

defforward(self,x):
x=self.blocks(x)
returnx


classRobustResNet(nn.Module):
#TODO:finishcommenthere
r"""RobustResNetDW
APyTorchimplof:

Args:
in_chans(int):Numberofinputimagechannels.Default:3
num_classes(int):Numberofclassesforclassificationhead.Default:1000
depths(tuple(int)):Numberofblocksateachstage.Default:[3,3,9,3]
dims(tuple(int)):Featuredimensionateachstage.Default:[96,192,384,768]
drop_rate(float):Headdropoutrate
drop_path_rate(float):Stochasticdepthrate.Default:0.
layer_scale_init_value(float):InitvalueforLayerScale.Default:1e-6.
head_init_scale(float):Initscalingvalueforclassifierweightsandbiases.Default:1.
"""

def__init__(
self,block_fn,in_chans=3,num_classes=1000,global_pool='avg',output_stride=32,
patch_size=16,stride_stage=(3,),
depths=(3,3,9,3),dims=(96,192,384,768),layer_scale_init_value=1e-6,
head_init_scale=1.,head_norm_first=False,
norm_layer=nn.BatchNorm2d,act_layer=partial(nn.ReLU,inplace=True),
drop_rate=0.,drop_path_rate=0.,mlp_ratio=4.,block_args=None,
):
super().__init__()
assertblock_fnin[RobustResNetDWBlock,RobustResNetDWInvertedBlock,RobustResNetDWUpInvertedBlock,RobustResNetDWDownInvertedBlock]
self.inverted=Trueifblock_fn!=RobustResNetDWBlockelseFalse
assertoutput_stride==32

self.num_classes=num_classes
self.drop_rate=drop_rate
self.feature_info=[]

block_args=block_argsordict()
print(f'usingblockargs:{block_args}')

assertpatch_size==16
self.stem=nn.Conv2d(in_chans,dims[0],kernel_size=patch_size,stride=patch_size)
curr_stride=patch_size

self.stages=nn.Sequential()
dp_rates=[x.tolist()forxintorch.linspace(0,drop_path_rate,sum(depths)).split(depths)]
prev_chs=dims[0]
stages=[]
#4featureresolutionstages,eachconsistingofmultipleresidualblocks
foriinrange(4):
stride=2ifiinstride_stageelse1
curr_stride*=stride
chs=dims[i]
stages.append(Stage(
block_fn,prev_chs,chs,stride=stride,
depth=depths[i],dp_rates=dp_rates[i],layer_scale_init_value=layer_scale_init_value,
norm_layer=norm_layer,act_layer=act_layer,mlp_ratio=mlp_ratio,
inverted=self.inverted,**block_args)
)
prev_chs=int(mlp_ratio*chs)ifnotself.invertedelsechs
self.feature_info+=[dict(num_chs=prev_chs,reduction=curr_stride,module=f'stages.{i}')]
self.stages=nn.Sequential(*stages)
assertcurr_stride==output_stride

self.num_features=prev_chs

self.norm_pre=nn.Identity()
self.head=nn.Sequential(OrderedDict([
('global_pool',SelectAdaptivePool2d(pool_type=global_pool)),
#('norm',norm_layer(self.num_features)),
('flatten',nn.Flatten(1)ifglobal_poolelsenn.Identity()),
('drop',nn.Dropout(self.drop_rate)),
('fc',nn.Linear(self.num_features,num_classes)ifnum_classes>0elsenn.Identity())
]))

self.resnet_init_weights()

defresnet_init_weights(self):
forn,minself.named_modules():
ifisinstance(m,nn.Conv2d):
nn.init.kaiming_normal_(m.weight,mode='fan_out',nonlinearity='relu')
nn.init.zeros_(m.bias)
elifisinstance(m,nn.BatchNorm2d):
nn.init.ones_(m.weight)
nn.init.zeros_(m.bias)

defget_classifier(self):
returnself.head.fc

defreset_classifier(self,num_classes=0,global_pool='avg'):
#pool->norm->fc
self.head=nn.Sequential(OrderedDict([
('global_pool',SelectAdaptivePool2d(pool_type=global_pool)),
('norm',self.head.norm),
('flatten',nn.Flatten(1)ifglobal_poolelsenn.Identity()),
('drop',nn.Dropout(self.drop_rate)),
('fc',nn.Linear(self.num_features,num_classes)ifnum_classes>0elsenn.Identity())
]))

defforward_features(self,x):
x=self.stem(x)
x=self.stages(x)
x=self.norm_pre(x)
returnx

defforward(self,x):
x=self.forward_features(x)
x=self.head(x)
returnx


def_create_robust_resnet(variant,pretrained=False,**kwargs):
model=build_model_with_cfg(
RobustResNet,variant,pretrained,
default_cfg=default_cfgs[variant],
feature_cfg=dict(out_indices=(0,1,2,3),flatten_sequential=True),
**kwargs)
returnmodel


@register_model
defrobust_resnet_dw_small(pretrained=False,**kwargs):
'''
4.49GFLOPsand38.6MParams
'''
assertnotpretrained,'nopretrainedmodels!'
model_args=dict(block_fn=RobustResNetDWBlock,depths=(3,4,12,3),dims=(96,192,384,768),
block_args=dict(kernel_size=11,padding=5),
patch_size=16,stride_stage=(3,),
norm_layer=nn.BatchNorm2d,act_layer=partial(nn.ReLU,inplace=True),
**kwargs)
model=_create_robust_resnet('small',pretrained=pretrained,**model_args)
returnmodel


@register_model
defrobust_resnet_inverted_dw_small(pretrained=False,**kwargs):
'''
4.59GFLOPsand33.6MParams
'''
assertnotpretrained,'nopretrainedmodels!'
model_args=dict(block_fn=RobustResNetDWInvertedBlock,depths=(3,4,14,3),dims=(96,192,384,768),
block_args=dict(kernel_size=7,padding=3),
patch_size=16,stride_stage=(3,),
norm_layer=nn.BatchNorm2d,act_layer=partial(nn.ReLU,inplace=True),
**kwargs)
model=_create_robust_resnet('small',pretrained=pretrained,**model_args)
returnmodel


@register_model
defrobust_resnet_up_inverted_dw_small(pretrained=False,**kwargs):
'''
4.43GFLOPsand34.4MParams
'''
assertnotpretrained,'nopretrainedmodels!'
model_args=dict(block_fn=RobustResNetDWUpInvertedBlock,depths=(3,4,14,3),dims=(96,192,384,768),
block_args=dict(kernel_size=11,padding=5),
patch_size=16,stride_stage=(3,),
norm_layer=nn.BatchNorm2d,act_layer=partial(nn.ReLU,inplace=True),
**kwargs)
model=_create_robust_resnet('small',pretrained=pretrained,**model_args)
returnmodel


@register_model
defrobust_resnet_down_inverted_dw_small(pretrained=False,**kwargs):
'''
4.55GFLOPsand24.3MParams
'''
assertnotpretrained,'nopretrainedmodels!'
model_args=dict(block_fn=RobustResNetDWDownInvertedBlock,depths=(3,4,15,3),dims=(96,192,384,768),
block_args=dict(kernel_size=11,padding=5),
patch_size=16,stride_stage=(2,),
norm_layer=nn.BatchNorm2d,act_layer=partial(nn.ReLU,inplace=True),
**kwargs)
model=_create_robust_resnet('small',pretrained=pretrained,**model_args)
returnmodel

責(zé)任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4812

    瀏覽量

    103286
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3507

    瀏覽量

    50252
  • Transformer
    +關(guān)注

    關(guān)注

    0

    文章

    151

    瀏覽量

    6476

原文標(biāo)題:超強(qiáng)Trick,一個(gè)比Transformer更強(qiáng)的CNN Backbone(附源碼)

文章出處:【微信號(hào):3D視覺(jué)工坊,微信公眾號(hào):3D視覺(jué)工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    自動(dòng)駕駛中常提的性是個(gè)啥?

    隨著自動(dòng)駕駛技術(shù)的快速發(fā)展,性(Robustness)成為評(píng)價(jià)自動(dòng)駕駛系統(tǒng)的重要指標(biāo)之一。很多小伙伴也會(huì)在自動(dòng)駕駛相關(guān)的介紹中,對(duì)某些功能用性進(jìn)行描述。一個(gè)
    的頭像 發(fā)表于 01-02 16:32 ?7109次閱讀
    自動(dòng)駕駛中常提的<b class='flag-5'>魯</b><b class='flag-5'>棒</b>性是個(gè)啥?

    數(shù)據(jù)傳輸方案

    MS-2511:集成信號(hào)和電源隔離提供且緊湊的測(cè)量與控制
    發(fā)表于 09-04 11:12

    自適應(yīng)控制綜述A survey of robust ad

    討論了自適應(yīng)控制的產(chǎn)生,現(xiàn)有的自適應(yīng)控制方案及發(fā)展方向。關(guān)鍵詞:性; 自適應(yīng)控制;
    發(fā)表于 05-25 10:27 ?40次下載

    基于系統(tǒng)辨識(shí)的神經(jīng)網(wǎng)絡(luò)性研究

    給出了神經(jīng)網(wǎng)絡(luò)性的概念" 基于系統(tǒng)辨識(shí)的BP網(wǎng)絡(luò)RBF網(wǎng)絡(luò)和ELMAN 網(wǎng)絡(luò)的性問(wèn)題進(jìn)行了分析和研究$ 仿真結(jié)果表明"
    發(fā)表于 07-22 16:20 ?7次下載

    Linux內(nèi)核函數(shù)的性關(guān)聯(lián)

    軟件(或軟件構(gòu)件)性是衡量軟件在異常輸入和應(yīng)力環(huán)境條件下保持正常工作能力的一種度量。性測(cè)試主要用于測(cè)試操作系統(tǒng)、應(yīng)用程序、COTS軟件、構(gòu)件及服務(wù)協(xié)議等軟件和協(xié)議的可靠性及健壯
    發(fā)表于 10-31 16:44 ?0次下載
    Linux內(nèi)核函數(shù)的<b class='flag-5'>魯</b><b class='flag-5'>棒</b>性關(guān)聯(lián)

    性是什么意思_Robust為什么翻譯成

    性的定義 性是什么意思?頭一次看到這個(gè)詞的你可能會(huì)想歪(邪惡的笑臉)。但其實(shí)性是一個(gè)
    發(fā)表于 11-29 09:08 ?12.9w次閱讀
    <b class='flag-5'>魯</b><b class='flag-5'>棒</b>性是什么意思_Robust為什么翻譯成<b class='flag-5'>魯</b><b class='flag-5'>棒</b>性

    性和穩(wěn)定性的區(qū)別

    性和穩(wěn)定性都是反應(yīng)控制系統(tǒng)抗干擾能力的參數(shù)。那么關(guān)于性和穩(wěn)定性的區(qū)別有哪些,我們先來(lái)看看兩者的定義。 定義上 所謂
    發(fā)表于 11-29 09:39 ?24.7w次閱讀

    Linux的性度量詳解及性關(guān)聯(lián)測(cè)試分析

    軟件(或軟件構(gòu)件)性是衡量軟件在異常輸入和應(yīng)力環(huán)境條件下保持正常工作能力的一種度量。性測(cè)試主要用于測(cè)試操作系統(tǒng)、應(yīng)用程序、COTS軟件、構(gòu)件及服務(wù)協(xié)議等軟件和協(xié)議的可靠性及健壯
    發(fā)表于 12-02 09:29 ?4957次閱讀
     Linux的<b class='flag-5'>魯</b><b class='flag-5'>棒</b>性度量詳解及<b class='flag-5'>魯</b><b class='flag-5'>棒</b>性關(guān)聯(lián)測(cè)試分析

    提高產(chǎn)品的性(2)

    提高產(chǎn)品的性TI隔離技術(shù)詳探-中篇
    的頭像 發(fā)表于 05-30 09:00 ?3650次閱讀
    提高產(chǎn)品的<b class='flag-5'>魯</b><b class='flag-5'>棒</b>性(2)

    一文淺談性(Robustness)

    性(Robustness)
    的頭像 發(fā)表于 10-16 09:50 ?2502次閱讀

    性的含義以及如何提高模型的性?

    性的含義以及如何提高模型的性? 什么是性?
    的頭像 發(fā)表于 10-29 11:21 ?4572次閱讀

    如何提高系統(tǒng)的

    在當(dāng)今的技術(shù)環(huán)境中,系統(tǒng)面臨著各種挑戰(zhàn),包括硬件故障、軟件缺陷、網(wǎng)絡(luò)攻擊和人為錯(cuò)誤。性是指系統(tǒng)在面對(duì)這些挑戰(zhàn)時(shí)保持正常運(yùn)行的能力。 一、定義
    的頭像 發(fā)表于 11-11 10:17 ?2333次閱讀

    性算法在數(shù)據(jù)處理中的應(yīng)用

    一、性算法的基本概念 性算法是指在面對(duì)數(shù)據(jù)中的異常值、噪聲和不確定性時(shí),仍能保持穩(wěn)定性能的算法。這類(lèi)算法的核心思想是提高算法對(duì)數(shù)據(jù)異常的容忍度,從而在數(shù)據(jù)質(zhì)量不佳的情況下也能獲
    的頭像 發(fā)表于 11-11 10:22 ?1761次閱讀

    深度學(xué)習(xí)模型的性優(yōu)化

    深度學(xué)習(xí)模型的性優(yōu)化是一個(gè)復(fù)雜但至關(guān)重要的任務(wù),它涉及多個(gè)方面的技術(shù)和策略。以下是一些關(guān)鍵的優(yōu)化方法: 一、數(shù)據(jù)預(yù)處理與增強(qiáng) 數(shù)據(jù)清洗 :去除數(shù)據(jù)中的噪聲和異常值,這是提高模型
    的頭像 發(fā)表于 11-11 10:25 ?1100次閱讀

    性原理在控制系統(tǒng)中的應(yīng)用

    在現(xiàn)代控制系統(tǒng)的設(shè)計(jì)和分析中,性是一個(gè)核心概念。性指的是系統(tǒng)在面對(duì)模型不確定性、外部干擾和參數(shù)變化時(shí),仍能保持性能的能力。
    的頭像 發(fā)表于 11-11 10:26 ?3876次閱讀