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

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

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

PyTorch教程-8.8. 設(shè)計(jì)卷積網(wǎng)絡(luò)架構(gòu)

jf_pJlTbmA9 ? 來(lái)源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:44 ? 次閱讀

過(guò)去的部分帶我們參觀了計(jì)算機(jī)視覺(jué)的現(xiàn)代網(wǎng)絡(luò)設(shè)計(jì)。我們涵蓋的所有工作的共同點(diǎn)是它嚴(yán)重依賴科學(xué)家的直覺(jué)。許多架構(gòu)在很大程度上受到了人類創(chuàng)造力的啟發(fā),而在很大程度上受到了對(duì)深度網(wǎng)絡(luò)提供的設(shè)計(jì)空間的系統(tǒng)探索的影響。盡管如此,這種網(wǎng)絡(luò)工程方法已經(jīng)取得了巨大的成功。

由于 AlexNet(第 8.1 節(jié))在 ImageNet 上擊敗了傳統(tǒng)的計(jì)算機(jī)視覺(jué)模型,因此通過(guò)堆疊卷積塊構(gòu)建非常深的網(wǎng)絡(luò)變得很流行,所有這些都是由相同的模式設(shè)計(jì)的。尤其,3×3卷積由 VGG 網(wǎng)絡(luò)(第 8.2 節(jié))推廣。NiN(第 8.3 節(jié))表明即使1×1通過(guò)添加局部非線性,卷積可能是有益的。此外,NiN 通過(guò)跨所有位置的聚合解決了在網(wǎng)絡(luò)頭部聚合信息的問(wèn)題。GoogLeNet(8.4節(jié))在其Inception block中加入了多個(gè)不同卷積寬度的分支,結(jié)合了VGG和NiN的優(yōu)點(diǎn)。ResNets(第 8.6 節(jié))改變了對(duì)身份映射的歸納偏差(來(lái)自f(x)=0).這允許非常深的網(wǎng)絡(luò)。將近十年后,ResNet 設(shè)計(jì)仍然流行,證明了它的設(shè)計(jì)。最后,ResNeXt(第 8.6.5 節(jié))添加了分組卷積,在參數(shù)和計(jì)算之間提供了更好的權(quán)衡。擠壓和激發(fā)網(wǎng)絡(luò) (SENets) 是用于視覺(jué)的變形金剛的前身,可實(shí)現(xiàn)位置之間的高效信息傳輸(Hu等人,2018 年)。他們通過(guò)計(jì)算每個(gè)通道的全局注意力函數(shù)來(lái)實(shí)現(xiàn)這一點(diǎn)。

到目前為止,我們省略了通過(guò)神經(jīng)架構(gòu)搜索(NAS)獲得的網(wǎng)絡(luò)(Liu等人,2018 年,Zoph 和 Le,2016 年)。我們之所以選擇這樣做,是因?yàn)樗鼈兊某杀就ǔ:芨?,依賴于蠻力搜索、遺傳算法、強(qiáng)化學(xué)習(xí)或某種其他形式的超參數(shù)優(yōu)化。給定一個(gè)固定的搜索空間,NAS 使用搜索策略根據(jù)返回的性能估計(jì)自動(dòng)選擇架構(gòu)。NAS 的結(jié)果是單個(gè)網(wǎng)絡(luò)實(shí)例。EfficientNets 是這次搜索的顯著成果(Tan 和 Le,2019 年)。

下面我們討論一個(gè)與尋求單一最佳網(wǎng)絡(luò)完全不同的想法。它在計(jì)算上相對(duì)便宜,它會(huì)在途中產(chǎn)生科學(xué)見(jiàn)解,并且在結(jié)果質(zhì)量方面非常有效。讓我們回顧一下Radosavovic等人的策略。(2020)設(shè)計(jì)網(wǎng)絡(luò)設(shè)計(jì)空間。該策略結(jié)合了手動(dòng)設(shè)計(jì)和 NAS 的優(yōu)勢(shì)。它通過(guò)對(duì)網(wǎng)絡(luò)分布進(jìn)行操作 并以某種方式優(yōu)化分布以獲得整個(gè)網(wǎng)絡(luò)系列的良好性能來(lái)實(shí)現(xiàn)這一點(diǎn)。它的結(jié)果是RegNets,特別是 RegNetX 和 RegNetY,以及一系列用于設(shè)計(jì)高性能 CNN 的指導(dǎo)原則。

importtorchfromtorchimportnnfromtorch.nnimportfunctionalasFfromd2limporttorchasd2l

frommxnetimportinit,np,npxfrommxnet.gluonimportnnfromd2limportmxnetasd2lnpx.set_np()

fromflaximportlinenasnnfromd2limportjaxasd2l

importtensorflowastffromd2limporttensorflowasd2l

8.8.1.AnyNet 設(shè)計(jì)空間

下面的描述緊跟Radosavovic等人的推理 。(2020)加上一些縮寫以使其符合本書的范圍。首先,我們需要一個(gè)供網(wǎng)絡(luò)系列探索的模板。本章設(shè)計(jì)的共同點(diǎn)之一是網(wǎng)絡(luò)由主干、主體和頭部組成。.stem 執(zhí)行初始圖像處理,通常通過(guò)具有較大窗口大小的卷積。主體由多個(gè)塊組成,執(zhí)行從原始圖像到對(duì)象表示所需的大量轉(zhuǎn)換。最后,頭部將其轉(zhuǎn)換為所需的輸出,例如通過(guò)用于多類分類的 softmax 回歸器。反過(guò)來(lái),身體由多個(gè)階段組成,以降低的分辨率對(duì)圖像進(jìn)行操作。事實(shí)上,主干和每個(gè)后續(xù)階段都占空間分辨率的四分之一。最后,每個(gè)階段由一個(gè)或多個(gè)塊組成。這種模式對(duì)所有網(wǎng)絡(luò)都很常見(jiàn),從 VGG 到 ResNeXt。事實(shí)上,對(duì)于通用 AnyNet 網(wǎng)絡(luò)的設(shè)計(jì),Radosavovic等人。(2020)使用了 ResNeXt 塊圖 8.6.5。

pYYBAGR9Nf6ACtcVAAZq5CR9HWc465.svg

圖 8.8.1AnyNet 設(shè)計(jì)空間。號(hào)碼(c,r)沿每個(gè)箭頭指示通道數(shù)c和決議r×r當(dāng)時(shí)的圖像。從左到右:由主干、主體和頭部組成的通用網(wǎng)絡(luò)結(jié)構(gòu);身體由四個(gè)階段組成;階段的詳細(xì)結(jié)構(gòu);塊的兩種替代結(jié)構(gòu),一種沒(méi)有下采樣,另一種將每個(gè)維度的分辨率減半。設(shè)計(jì)選擇包括深度di, 輸出通道數(shù)ci, 組數(shù)gi和瓶頸比ki對(duì)于任何階段i.

讓我們?cè)敿?xì)回顧一下圖 8.8.1中概述的結(jié)構(gòu)。如前所述,AnyNet 由主干、主體和頭部組成。詞干將 RGB 圖像(3 通道)作為輸入,使用3×3與 stride 的卷積2,然后是批量規(guī)范,將分辨率減半r×r到r/2×r/2.此外,它生成c0作為身體輸入的通道。

由于該網(wǎng)絡(luò)旨在與形狀的 ImageNet 圖像配合使用224×224×3,身體用于將其減少到7×7×c4通過(guò) 4 個(gè)階段(回想一下224/21+4=7), 每個(gè)最終的步幅為2.最后,head 通過(guò)全局平均池采用完全標(biāo)準(zhǔn)的設(shè)計(jì),類似于 NiN(第 8.3 節(jié)),然后是一個(gè)完全連接的層以發(fā)出一個(gè)n維向量為n-類分類。

大多數(shù)相關(guān)的設(shè)計(jì)決策都是網(wǎng)絡(luò)主體固有的。它分階段進(jìn)行,每個(gè)階段都由我們?cè)诘?8.6.5 節(jié)中討論的相同類型的 ResNeXt 塊組成。那里的設(shè)計(jì)再次完全通用:我們從一個(gè)塊開(kāi)始,通過(guò)使用一個(gè)步長(zhǎng)將分辨率減半2(圖8.8.1最右邊)。為了匹配這一點(diǎn),ResNeXt 塊的剩余分支需要通過(guò)1×1卷積。此塊后跟可變數(shù)量的附加 ResNeXt 塊,這些塊使分辨率和通道數(shù)均保持不變。請(qǐng)注意,常見(jiàn)的設(shè)計(jì)實(shí)踐是在卷積塊的設(shè)計(jì)中添加一個(gè)小瓶頸。因此,瓶頸比ki≥1我們提供一些渠道ci/ki在每個(gè)階段的塊內(nèi)i(正如實(shí)驗(yàn)所示,這并不是真正有效,應(yīng)該跳過(guò))。最后,由于我們正在處理 ResNeXt 塊,我們還需要選擇組數(shù)gi對(duì)于階段的分組卷積i.

這個(gè)看似通用的設(shè)計(jì)空間仍然為我們提供了許多參數(shù):我們可以設(shè)置塊寬度(通道數(shù))c0,…c4,每個(gè)階段的深度(塊數(shù))d1,…d4, 瓶頸比k1,…k4和組寬度(組數(shù))g1,…g4.這總共加起來(lái)多達(dá) 17 個(gè)參數(shù),導(dǎo)致不合理的大量配置值得探索。我們需要一些工具來(lái)有效地縮小這個(gè)巨大的設(shè)計(jì)空間。這就是設(shè)計(jì)空間概念美的來(lái)源。在我們這樣做之前,讓我們先實(shí)現(xiàn)通用設(shè)計(jì)。

classAnyNet(d2l.Classifier):defstem(self,num_channels):returnnn.Sequential(nn.LazyConv2d(num_channels,kernel_size=3,stride=2,padding=1),nn.LazyBatchNorm2d(),nn.ReLU())

classAnyNet(d2l.Classifier):defstem(self,num_channels):net=nn.Sequential()net.add(nn.Conv2D(num_channels,kernel_size=3,padding=1,strides=2),nn.BatchNorm(),nn.Activation('relu'))returnnet

classAnyNet(d2l.Classifier):arch:tuplestem_channels:intlr:float=0.1num_classes:int=10training:bool=Truedefsetup(self):self.net=self.create_net()defstem(self,num_channels):returnnn.Sequential([nn.Conv(num_channels,kernel_size=(3,3),strides=(2,2),padding=(1,1)),nn.BatchNorm(notself.training),nn.relu])

classAnyNet(d2l.Classifier):defstem(self,num_channels):returntf.keras.models.Sequential([tf.keras.layers.Conv2D(num_channels,kernel_size=3,strides=2,padding='same'),tf.keras.layers.BatchNormalization(),tf.keras.layers.Activation('relu')])

每個(gè)階段由depthResNeXt 塊組成,其中num_channels指定塊寬度。請(qǐng)注意,第一個(gè)塊將輸入圖像的高度和寬度減半。

@d2l.add_to_class(AnyNet)defstage(self,depth,num_channels,groups,bot_mul):blk=[]foriinrange(depth):ifi==0:blk.append(d2l.ResNeXtBlock(num_channels,groups,bot_mul,use_1x1conv=True,strides=2))else:blk.append(d2l.ResNeXtBlock(num_channels,groups,bot_mul))returnnn.Sequential(*blk)

@d2l.add_to_class(AnyNet)defstage(self,depth,num_channels,groups,bot_mul):net=nn.Sequential()foriinrange(depth):ifi==0:net.add(d2l.ResNeXtBlock(num_channels,groups,bot_mul,use_1x1conv=True,strides=2))else:net.add(d2l.ResNeXtBlock(num_channels,num_channels,groups,bot_mul))returnnet

@d2l.add_to_class(AnyNet)defstage(self,depth,num_channels,groups,bot_mul):blk=[]foriinrange(depth):ifi==0:blk.append(d2l.ResNeXtBlock(num_channels,groups,bot_mul,use_1x1conv=True,strides=(2,2),training=self.training))else:blk.append(d2l.ResNeXtBlock(num_channels,groups,bot_mul,training=self.training))returnnn.Sequential(blk)

@d2l.add_to_class(AnyNet)defstage(self,depth,num_channels,groups,bot_mul):net=tf.keras.models.Sequential()foriinrange(depth):ifi==0:net.add(d2l.ResNeXtBlock(num_channels,groups,bot_mul,use_1x1conv=True,strides=2))else:net.add(d2l.ResNeXtBlock(num_channels,groups,bot_mul))returnnet

將網(wǎng)絡(luò)的主干、主體和頭部放在一起,我們完成了 AnyNet 的實(shí)現(xiàn)。

@d2l.add_to_class(AnyNet)def__init__(self,arch,stem_channels,lr=0.1,num_classes=10):super(AnyNet,self).__init__()self.save_hyperparameters()self.net=nn.Sequential(self.stem(stem_channels))fori,sinenumerate(arch):self.net.add_module(f'stage{i+1}',self.stage(*s))self.net.add_module('head',nn.Sequential(nn.AdaptiveAvgPool2d((1,1)),nn.Flatten(),nn.LazyLinear(num_classes)))self.net.apply(d2l.init_cnn)

@d2l.add_to_class(AnyNet)def__init__(self,arch,stem_channels,lr=0.1,num_classes=10):super(AnyNet,self).__init__()self.save_hyperparameters()self.net=nn.Sequential()self.net.add(self.stem(stem_channels))fori,sinenumerate(arch):self.net.add(self.stage(*s))self.net.add(nn.GlobalAvgPool2D(),nn.Dense(num_classes))self.net.initialize(init.Xavier())

@d2l.add_to_class(AnyNet)defcreate_net(self):net=nn.Sequential([self.stem(self.stem_channels)])fori,sinenumerate(self.arch):net.layers.extend([self.stage(*s)])net.layers.extend([nn.Sequential([lambdax:nn.avg_pool(x,window_shape=x.shape[1:3],strides=x.shape[1:3],padding='valid'),lambdax:x.reshape((x.shape[0],-1)),nn.Dense(self.num_classes)])])returnnet

@d2l.add_to_class(AnyNet)def__init__(self,arch,stem_channels,lr=0.1,num_classes=10):super(AnyNet,self).__init__()self.save_hyperparameters()self.net=tf.keras.models.Sequential(self.stem(stem_channels))fori,sinenumerate(arch):self.net.add(self.stage(*s))self.net.add(tf.keras.models.Sequential([tf.keras.layers.GlobalAvgPool2D(),tf.keras.layers.Dense(units=num_classes)]))

8.8.2.設(shè)計(jì)空間的分布和參數(shù)

正如在第 8.8.1 節(jié)中討論的那樣,設(shè)計(jì)空間的參數(shù)是該設(shè)計(jì)空間中網(wǎng)絡(luò)的超參數(shù)。考慮在 AnyNet 設(shè)計(jì)空間中識(shí)別好的參數(shù)的問(wèn)題。我們可以嘗試為給定的計(jì)算量(例如,F(xiàn)LOPs 和計(jì)算時(shí)間)找到單個(gè)最佳參數(shù)選擇。如果我們只允許每個(gè)參數(shù)有兩種可能的選擇,我們將不得不探索217=131072組合以找到最佳解決方案。由于其過(guò)高的成本,這顯然是不可行的。更糟糕的是,就應(yīng)該如何設(shè)計(jì)網(wǎng)絡(luò)而言,我們并沒(méi)有真正從這個(gè)練習(xí)中學(xué)到任何東西。下次我們添加 X 階段或移位操作或類似操作時(shí),我們需要從頭開(kāi)始。更糟糕的是,由于訓(xùn)練中的隨機(jī)性(舍入、混洗、位錯(cuò)誤),沒(méi)有兩次運(yùn)行可能產(chǎn)生完全相同的結(jié)果。更好的策略是嘗試確定參數(shù)選擇應(yīng)如何關(guān)聯(lián)的一般準(zhǔn)則。例如,瓶頸率、通道、塊、組的數(shù)量,或者它們?cè)趯又g的變化,理想情況下應(yīng)該由一組簡(jiǎn)單的規(guī)則來(lái)控制。Radosavovic等人的方法。(2019)依賴于以下四個(gè)假設(shè):

我們假設(shè)通用設(shè)計(jì)原則確實(shí)存在,這樣許多滿足這些要求的網(wǎng)絡(luò)應(yīng)該提供良好的性能。因此,識(shí)別網(wǎng)絡(luò)分布可能是一個(gè)很好的策略。換句話說(shuō),我們假設(shè)大海撈針很多。

在我們?cè)u(píng)估網(wǎng)絡(luò)是否良好之前,我們不需要訓(xùn)練網(wǎng)絡(luò)收斂。相反,使用中間結(jié)果作為最終精度的可靠指導(dǎo)就足夠了。使用(近似)代理來(lái)優(yōu)化目標(biāo)被稱為多重保真度優(yōu)化(Forrester等人,2007 年)。因此,根據(jù)僅幾次通過(guò)數(shù)據(jù)集后獲得的準(zhǔn)確性進(jìn)行設(shè)計(jì)優(yōu)化,從而顯著降低成本。

在較小規(guī)模(對(duì)于較小網(wǎng)絡(luò))下獲得的結(jié)果可以推廣到較大的網(wǎng)絡(luò)。因此,對(duì)結(jié)構(gòu)相似但塊數(shù)少、通道數(shù)少等的網(wǎng)絡(luò)進(jìn)行優(yōu)化。只有到最后,我們才需要驗(yàn)證這樣發(fā)現(xiàn)的網(wǎng)絡(luò)是否也能在規(guī)模上提供良好的性能。

設(shè)計(jì)的各個(gè)方面可以近似分解,這樣就可以在某種程度上獨(dú)立地推斷出它們對(duì)結(jié)果質(zhì)量的影響。換句話說(shuō),優(yōu)化問(wèn)題比較容易。

這些假設(shè)使我們能夠廉價(jià)地測(cè)試許多網(wǎng)絡(luò)。特別是,我們可以從配置空間中均勻采樣并評(píng)估它們的性能。隨后,我們可以通過(guò)查看上述網(wǎng)絡(luò)可以實(shí)現(xiàn)的誤差/準(zhǔn)確度分布來(lái)評(píng)估參數(shù)選擇的質(zhì)量。表示為F(e)給定設(shè)計(jì)空間網(wǎng)絡(luò)錯(cuò)誤的累積分布函數(shù) (CDF),使用概率分布繪制p.那是,

(8.8.1)F(e,p)=defPnet~p{e(net)≤e}.

我們現(xiàn)在的目標(biāo)是找到一個(gè)分布p通過(guò)網(wǎng)絡(luò)使得大多數(shù)網(wǎng)絡(luò)的錯(cuò)誤率非常低,并且支持p簡(jiǎn)潔。當(dāng)然,這在計(jì)算上無(wú)法準(zhǔn)確執(zhí)行。我們求助于網(wǎng)絡(luò)樣本Z=def{net1,…netn}(有錯(cuò)誤e1,…,en,分別)從p并使用經(jīng)驗(yàn) CDFF^(e,Z)反而:

(8.8.2)F^(e,Z)=1n∑i=1n1(ei≤e).

每當(dāng)一組選擇的 CDF 主要(或匹配)另一個(gè) CDF 時(shí),它的參數(shù)選擇是優(yōu)越的(或無(wú)關(guān)緊要的)。因此,Radosavovic等人。(2020)試驗(yàn)共享網(wǎng)絡(luò)瓶頸比ki=k對(duì)于所有階段i的網(wǎng)絡(luò)。這擺脫了3的4控制瓶頸比的參數(shù)。要評(píng)估這是否(負(fù)面)影響性能,可以從受約束和不受約束的分布中提取網(wǎng)絡(luò)并比較相應(yīng)的 CDF。事實(shí)證明,這個(gè)約束根本不影響網(wǎng)絡(luò)分布的準(zhǔn)確性,如圖8.8.2的第一幅圖所示。同樣,我們可以選擇選擇相同的組寬度gi=g發(fā)生在網(wǎng)絡(luò)的各個(gè)階段。同樣,這不會(huì)影響性能,如圖8.8.2的第二個(gè)面板所示。這兩個(gè)步驟結(jié)合起來(lái)減少了自由參數(shù)的數(shù)量6.

pYYBAGR3JHyAGZTYAAZLdJPltzA857.png

圖 8.8.2比較設(shè)計(jì)空間的誤差經(jīng)驗(yàn)分布函數(shù)。AnyNetA是原設(shè)計(jì)空間;AnyNetB聯(lián)系瓶頸比率,AnyNetC也聯(lián)系組寬度,AnyNetD跨階段增加網(wǎng)絡(luò)深度。從左到右:(i) 綁定瓶頸比率對(duì)性能沒(méi)有影響,(ii) 綁定組寬度對(duì)性能沒(méi)有影響,(iii) 增加跨階段的網(wǎng)絡(luò)寬度(通道)可以提高性能,(iv) 增加跨階段的網(wǎng)絡(luò)深度階段提高性能。圖由Radosavovic等人提供 。(2020 年)。

接下來(lái),我們尋找方法來(lái)減少階段寬度和深度的多種潛在選擇。一個(gè)合理的假設(shè)是,隨著我們深入,通道的數(shù)量應(yīng)該增加,即ci≥ci?1(wi+1≥wi根據(jù)他們?cè)趫D 8.8.2中的符號(hào)),產(chǎn)生AnyNetXD.同樣,同樣合理的假設(shè)是隨著階段的進(jìn)展,它們應(yīng)該變得更深,即,di≥di?1, 屈服AnyNetXE.這可以分別在圖 8.8.2的第三和第四圖中進(jìn)行實(shí)驗(yàn)驗(yàn)證。

8.8.3.注冊(cè)網(wǎng)

所結(jié)果的AnyNetXE設(shè)計(jì)空間由遵循易于理解的設(shè)計(jì)原則的簡(jiǎn)單網(wǎng)絡(luò)組成:

分享瓶頸比例ki=k對(duì)于所有階段i;

共享組寬度gi=g對(duì)于所有階段i;

增加跨階段的網(wǎng)絡(luò)寬度:ci≤ci+1;

跨階段增加網(wǎng)絡(luò)深度:di≤di+1.

這給我們留下了最后一組選擇:如何為最終的上述參數(shù)選擇特定值A(chǔ)nyNetXE設(shè)計(jì)空間。通過(guò)研究分布在AnyNetXE可以觀察到:理想情況下,網(wǎng)絡(luò)的寬度隨著網(wǎng)絡(luò)中的塊索引線性增加,即cj≈c0+caj, 在哪里j是塊索引和斜率ca>0.鑒于我們只能在每個(gè)階段選擇不同的塊寬度,我們得到了一個(gè)分段常數(shù)函數(shù),該函數(shù)被設(shè)計(jì)為匹配這種依賴性。其次,實(shí)驗(yàn)還表明,瓶頸比為k=1表現(xiàn)最好,即我們建議根本不要使用瓶頸。

我們建議有興趣的讀者仔細(xì)閱讀Radosavovic等人,以了解有關(guān)如何為不同計(jì)算量設(shè)計(jì)特定網(wǎng)絡(luò)的更多詳細(xì)信息。(2020 年)。例如,一個(gè)有效的 32 層 RegNetX 變體由下式給出k=1(沒(méi)有瓶頸),g=16(組寬為 16),c1=32和c2=80第一階段和第二階段的渠道,分別被選為d1=4和d2=6塊深。該設(shè)計(jì)的驚人見(jiàn)解是它適用,即使在調(diào)查更大規(guī)模的網(wǎng)絡(luò)時(shí)也是如此。更好的是,它甚至適用于具有全局通道激活的擠壓和激勵(lì) (SE) 網(wǎng)絡(luò)設(shè)計(jì) (RegNetY)(Hu等人,2018 年)。

classRegNetX32(AnyNet):def__init__(self,lr=0.1,num_classes=10):stem_channels,groups,bot_mul=32,16,1depths,channels=(4,6),(32,80)super().__init__(((depths[0],channels[0],groups,bot_mul),(depths[1],channels[1],groups,bot_mul)),stem_channels,lr,num_classes)

classRegNetX32(AnyNet):def__init__(self,lr=0.1,num_classes=10):stem_channels,groups,bot_mul=32,16,1depths,channels=(4,6),(32,80)super().__init__(((depths[0],channels[0],groups,bot_mul),(depths[1],channels[1],groups,bot_mul)),stem_channels,lr,num_classes)

classRegNetX32(AnyNet):lr:float=0.1num_classes:int=10stem_channels:int=32arch:tuple=((4,32,16,1),(6,80,16,1))

classRegNetX32(AnyNet):def__init__(self,lr=0.1,num_classes=10):stem_channels,groups,bot_mul=32,16,1depths,channels=(4,6),(32,80)super().__init__(((depths[0],channels[0],groups,bot_mul),(depths[1],channels[1],groups,bot_mul)),stem_channels,lr,num_classes)

我們可以看到,每個(gè) RegNetX 階段都逐漸降低分辨率并增加輸出通道。

RegNetX32().layer_summary((1,1,96,96))

Sequentialoutputshape:torch.Size([1,32,48,48])Sequentialoutputshape:torch.Size([1,32,24,24])Sequentialoutputshape:torch.Size([1,80,12,12])Sequentialoutputshape:torch.Size([1,10])

RegNetX32().layer_summary((1,1,96,96))

Sequentialoutputshape:(1,32,48,48)Sequentialoutputshape:(1,32,24,24)Sequentialoutputshape:(1,80,12,12)GlobalAvgPool2Doutputshape:(1,80,1,1)Denseoutputshape:(1,10)

RegNetX32(training=False).layer_summary((1,96,96,1))

Sequentialoutputshape:(1,48,48,32)Sequentialoutputshape:(1,24,24,32)Sequentialoutputshape:(1,12,12,80)Sequentialoutputshape:(1,10)

RegNetX32().layer_summary((1,96,96,1))

Sequentialoutputshape:(1,48,48,32)Sequentialoutputshape:(1,24,24,32)Sequentialoutputshape:(1,12,12,80)Sequentialoutputshape:(1,10)

8.8.4.訓(xùn)練

在 Fashion-MNIST 數(shù)據(jù)集上訓(xùn)練 32 層 RegNetX 就像以前一樣。

model=RegNetX32(lr=0.05)trainer=d2l.Trainer(max_epochs=10,num_gpus=1)data=d2l.FashionMNIST(batch_size=128,resize=(96,96))trainer.fit(model,data)

pYYBAGR9NgeANXl4AAF-nWPyUhw118.svg

model=RegNetX32(lr=0.05)trainer=d2l.Trainer(max_epochs=10,num_gpus=1)data=d2l.FashionMNIST(batch_size=128,resize=(96,96))trainer.fit(model,data)

poYBAGR9NgmASS9wAAGIwz3h5IQ030.svg

model=RegNetX32(lr=0.05)trainer=d2l.Trainer(max_epochs=10,num_gpus=1)data=d2l.FashionMNIST(batch_size=128,resize=(96,96))trainer.fit(model,data)

poYBAGR9NgyAS8kxAAGL0U6AVEQ609.svg

trainer=d2l.Trainer(max_epochs=10)data=d2l.FashionMNIST(batch_size=128,resize=(96,96))withd2l.try_gpu():model=RegNetX32(lr=0.01)trainer.fit(model,data)

pYYBAGR9Ng6AE2ZCAAFzLzgqzik578.svg

8.8.5。討論

具有理想的歸納偏差(假設(shè)或偏好),如視覺(jué)的局部和平移不變性(第 7.1 節(jié)),CNN 一直是該領(lǐng)域的主導(dǎo)架構(gòu)。自 LeNet 以來(lái)一直如此,直到最近 Transformers(第 11.7 節(jié))(Dosovitskiy等人,2021 年,Touvron等人,2021 年)開(kāi)始在準(zhǔn)確性方面超越 CNN。雖然最近在視覺(jué) Transformer 方面取得的大部分進(jìn)展都可以反向移植到 CNN 中(Liu等人,2022 年),只有在更高的計(jì)算成本下才有可能。同樣重要的是,最近的硬件優(yōu)化(NVIDIA Ampere 和 Hopper)只是擴(kuò)大了支持變形金剛的差距。

值得注意的是,與 CNN 相比,Transformer 對(duì)局部性和平移不變性的歸納偏差程度要低得多。這并不是最不重要的,因?yàn)榇笮蛨D像集的可用性,例如 LAION-400m 和 LAION-5B(Schuhmann等人,2022 年),其中有多達(dá) 50 億張學(xué)習(xí)結(jié)構(gòu)的圖像。令人驚訝的是,在這方面的一些更相關(guān)的工作甚至包括 MLP(Tolstikhin等人,2021 年)。

總之,視覺(jué) Transformers(第 11.8 節(jié))目前在大規(guī)模圖像分類中的最先進(jìn)性能方面處于領(lǐng)先地位,表明可擴(kuò)展性勝過(guò)歸納偏差(Dosovitskiy等人,2021 年)。這包括使用多頭自注意力(第 11.5節(jié))預(yù)訓(xùn)練大型 Transformers(第11.9節(jié))。我們邀請(qǐng)讀者深入研究這些章節(jié)以進(jìn)行更詳細(xì)的討論。

8.8.6.練習(xí)

將階段數(shù)增加到 4。你能設(shè)計(jì)一個(gè)性能更好的更深的 RegNetX 嗎?

通過(guò)用 ResNet 塊替換 ResNeXt 塊來(lái)去除 ResNeXt-ify RegNets。你的新模型表現(xiàn)如何?

通過(guò)違反RegNetX 的設(shè)計(jì)原則來(lái)實(shí)現(xiàn)“VioNet”系列的多個(gè)實(shí)例。他們的表現(xiàn)如何?哪一個(gè)(di,ci,gi,bi) 是最重要的因素?

您的目標(biāo)是設(shè)計(jì)“完美”的 MLP。你能用上面介紹的設(shè)計(jì)原則找到好的架構(gòu)嗎?是否可以從小型網(wǎng)絡(luò)推斷到大型網(wǎng)絡(luò)?

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    795

    瀏覽量

    13091
  • 卷積網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    0

    文章

    42

    瀏覽量

    2148
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用PyTorch深度解析卷積神經(jīng)網(wǎng)絡(luò)

    卷積神經(jīng)網(wǎng)絡(luò)(CNN)是一種特殊類型的神經(jīng)網(wǎng)絡(luò),在圖像上表現(xiàn)特別出色。卷積神經(jīng)網(wǎng)絡(luò)由Yan LeCun在1998年提出,可以識(shí)別給定輸入圖像
    發(fā)表于 09-21 10:12 ?803次閱讀

    如何在PyTorch上學(xué)習(xí)和創(chuàng)建網(wǎng)絡(luò)模型呢?

    分。如果有興趣,建議嘗試下面的官方教程,盡管它是英文的。使用 PYTORCH 進(jìn)行深度學(xué)習(xí):60 分鐘閃電戰(zhàn)卷積神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò) (CN
    發(fā)表于 02-21 15:22

    卷積神經(jīng)網(wǎng)絡(luò)CNN架構(gòu)分析-LeNet

    對(duì)于神經(jīng)網(wǎng)絡(luò)卷積有了粗淺的了解,關(guān)于CNN 卷積神經(jīng)網(wǎng)絡(luò),需要總結(jié)深入的知識(shí)有很多:人工神經(jīng)網(wǎng)絡(luò) ANN
    發(fā)表于 11-16 13:28 ?2731次閱讀
    <b class='flag-5'>卷積</b>神經(jīng)<b class='flag-5'>網(wǎng)絡(luò)</b>CNN<b class='flag-5'>架構(gòu)</b>分析-LeNet

    PyTorch教程7.1之從全連接層到卷積

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程7.1之從全連接層到卷積.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:50 ?0次下載
    <b class='flag-5'>PyTorch</b>教程7.1之從全連接層到<b class='flag-5'>卷積</b>

    PyTorch教程7.2之圖像卷積

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程7.2之圖像卷積.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 10:13 ?0次下載
    <b class='flag-5'>PyTorch</b>教程7.2之圖像<b class='flag-5'>卷積</b>

    PyTorch教程8.1之深度卷積神經(jīng)網(wǎng)絡(luò)(AlexNet)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程8.1之深度卷積神經(jīng)網(wǎng)絡(luò)(AlexNet).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 10:09 ?0次下載
    <b class='flag-5'>PyTorch</b>教程8.1之深度<b class='flag-5'>卷積</b>神經(jīng)<b class='flag-5'>網(wǎng)絡(luò)</b>(AlexNet)

    PyTorch教程8.8之設(shè)計(jì)卷積網(wǎng)絡(luò)架構(gòu)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程8.8之設(shè)計(jì)卷積網(wǎng)絡(luò)架構(gòu).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 10:02 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>8.8</b>之設(shè)計(jì)<b class='flag-5'>卷積</b><b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>架構(gòu)</b>

    PyTorch教程14.10之轉(zhuǎn)置卷積

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程14.10之轉(zhuǎn)置卷積.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:11 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.10之轉(zhuǎn)置<b class='flag-5'>卷積</b>

    PyTorch教程14.11之全卷積網(wǎng)絡(luò)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程14.11之全卷積網(wǎng)絡(luò).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:19 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.11之全<b class='flag-5'>卷積</b><b class='flag-5'>網(wǎng)絡(luò)</b>

    PyTorch教程16.3之情感分析:使用卷積神經(jīng)網(wǎng)絡(luò)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程16.3之情感分析:使用卷積神經(jīng)網(wǎng)絡(luò).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 10:56 ?0次下載
    <b class='flag-5'>PyTorch</b>教程16.3之情感分析:使用<b class='flag-5'>卷積</b>神經(jīng)<b class='flag-5'>網(wǎng)絡(luò)</b>

    PyTorch教程20.2之深度卷積生成對(duì)抗網(wǎng)絡(luò)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程20.2之深度卷積生成對(duì)抗網(wǎng)絡(luò).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 10:21 ?2次下載
    <b class='flag-5'>PyTorch</b>教程20.2之深度<b class='flag-5'>卷積</b>生成對(duì)抗<b class='flag-5'>網(wǎng)絡(luò)</b>

    PyTorch教程-14.11. 全卷積網(wǎng)絡(luò)

    14.11. 全卷積網(wǎng)絡(luò)? Colab [火炬]在 Colab 中打開(kāi)筆記本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的頭像 發(fā)表于 06-05 15:44 ?488次閱讀
    <b class='flag-5'>PyTorch</b>教程-14.11. 全<b class='flag-5'>卷積</b><b class='flag-5'>網(wǎng)絡(luò)</b>

    卷積神經(jīng)網(wǎng)絡(luò)主要包括哪些 卷積神經(jīng)網(wǎng)絡(luò)組成部分

    ,并且在處理圖像、音頻、文本等方面具有非常出色的表現(xiàn)。本文將從卷積神經(jīng)網(wǎng)絡(luò)的原理、架構(gòu)、訓(xùn)練、應(yīng)用等方面進(jìn)行詳細(xì)介紹。 一、卷積神經(jīng)網(wǎng)絡(luò)原理
    的頭像 發(fā)表于 08-21 17:15 ?1487次閱讀

    如何在PyTorch中實(shí)現(xiàn)LeNet-5網(wǎng)絡(luò)

    PyTorch中實(shí)現(xiàn)LeNet-5網(wǎng)絡(luò)是一個(gè)涉及深度學(xué)習(xí)基礎(chǔ)知識(shí)、PyTorch框架使用以及網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)的綜合性任務(wù)。LeNet-5是
    的頭像 發(fā)表于 07-11 10:58 ?599次閱讀

    基于PyTorch卷積核實(shí)例應(yīng)用

    在深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)領(lǐng)域,卷積操作是一種至關(guān)重要的技術(shù),尤其在圖像處理和特征提取方面發(fā)揮著核心作用。PyTorch作為當(dāng)前最流行的深度學(xué)習(xí)框架之一,提供了強(qiáng)大的張量操作功能和靈活的API,使得實(shí)現(xiàn)
    的頭像 發(fā)表于 07-11 15:19 ?313次閱讀