0
本文作者: AI研習(xí)社-譯站 | 2018-08-22 14:28 |
本文為 AI 研習(xí)社編譯的技術(shù)博客,原標題 History of Convolutional Blocks in simple Code,作者為 Paul-Louis Pr?ve。
翻譯 | 孟凡 校對 | Lamaric 審核 | Lamaric
我會努力定期去閱讀機器學(xué)習(xí)和人工智能相關(guān)的論文。這也是能夠持續(xù)跟進最新進展的唯一途徑。作為一名計算機科學(xué)家,我經(jīng)常在翻閱科學(xué)描述文本或者公式的數(shù)學(xué)符號時碰壁。我發(fā)現(xiàn)在普通代碼中理解它要容易的多。因此在本文中,我想引導(dǎo)你通過
Keras 實現(xiàn)精選的最新架構(gòu)的重要卷積塊。
當你在 GitHub 上查閱受歡迎的架構(gòu)實現(xiàn)的時候,你一定會驚訝于他們怎么會包含這么多代碼。這是一個很好的包含足夠數(shù)量的注釋并且使用額外參數(shù)來增強模型的實踐,但是與此同時這會分散架構(gòu)本質(zhì)的注意力。為了更加簡化和縮短代碼,我將使用一些別名函數(shù):
我發(fā)現(xiàn)當刪除模版代碼時更具有可讀性。當然,這只有在您理解我的首字母縮寫后才有效,讓我們開始吧!
瓶頸塊
卷積層的參數(shù)數(shù)量取決于卷積核大小、輸入濾波器和輸出濾波器的的數(shù)量。你的網(wǎng)絡(luò)越寬,3x3 卷積就會付出更大的代價。
瓶頸塊背后的思想是通過一個確定的比率 r 采用代價小的 1x1 卷積來減少通道數(shù),以便隨后的 3x3 卷積具有更少的參數(shù)。最后,我們在再使用一個 1x1 的卷積拓寬網(wǎng)絡(luò)。
Inception 模塊
Inception 模塊引入了并行使用不同操作并且合并結(jié)果的思想。因此網(wǎng)絡(luò)可以學(xué)習(xí)不同類型的濾波器。
這里我們使用卷積核大小為 1、3 和 5 的卷積層和 MaxPooling 層進行合并。這段代碼展示了inception模塊的原始實現(xiàn)。實際的實現(xiàn)是將它與上述瓶頸的思想結(jié)合起來,這使得它稍微復(fù)雜了一些。
Residual 塊
ResNet 是一個被來自微軟的研究者推出的架構(gòu),它允許神經(jīng)網(wǎng)絡(luò)擁有他們希望得到的層數(shù),同時仍能夠提高模型的準確度。到現(xiàn)在你或許已經(jīng)習(xí)慣它了了,但是在ResNet 之前情況并非如此。
這個想法是將初始的激活添加到卷積塊的輸出。因此網(wǎng)絡(luò)可以通過學(xué)習(xí)過程決定用于輸出的新卷積的數(shù)量。做的注意的是Inception模塊串聯(lián)輸出,而Residual模塊是求和。
ResNeXt 塊
基于它的名字你就能夠猜到ResNeXt與ResNet的密切聯(lián)系。作者將基數(shù)一詞云如到另一個維度,比如寬度(通道數(shù))和深度(層數(shù))。
基數(shù)(cardinality)是指出現(xiàn)在模塊中的平行路徑數(shù)。這聽起來像inception塊并行發(fā)生的四個操作。然而,并非并行使用不同類型的操作,基數(shù)為4時是簡單的使用相同操作四次。
如果它們做的是同樣的事情為什么還要把他們并列?好問題。這個概念也被稱作分組卷積而且可以追溯到原始的AlexNet論文。雖然,當時它主要被用做分解訓(xùn)練過程到多個GPU,而ResNeXt則用他們來增加參數(shù)的利用效率。
這個想法是將所有的輸入通道分成幾個組。卷積只會在它們專屬的通道組中進行而不會影響到所有通道組。發(fā)型每個組將會學(xué)到不同類型的特征,同時提高了權(quán)重的效率。
想象一個瓶頸塊,首先使用一個為4的壓縮率將256個輸入通道減少到64個,然后將它們恢復(fù)到256個通道作為輸出。如果我們想引入基數(shù)32和壓縮率2,我們將使用32個平行的1x1的卷積層,其每個的輸出通道為4(256/(32*2))個。之后我們使用32個擁有4個輸出通道的3x3的卷積層,緊接著是32個1x1層,每個層有256個輸出通道。最后一步包含將32個平行路徑相加,使得在加上初始輸入作為一個殘差連接之前為我們提供單個輸出。
左側(cè):ResNet塊 右側(cè):參數(shù)復(fù)雜度大致相同的ResNeXt塊
這里有很多東西需要消化。利用上圖可以直觀了解其如何起作用的,也可以直接復(fù)制這些代碼,以便自己用Keras構(gòu)建一個小型網(wǎng)絡(luò)。我的復(fù)雜描述可以用這9行簡單的代碼總結(jié)出來,難道不是很棒嗎?
順便提一下,如果基數(shù)與通道的數(shù)量相同我們會得到一個稱為深度可分離卷積的東西。自從引入了Xception架構(gòu)以來,得到了廣泛的使用。
Dense 塊
一個dense塊是一個residual塊的極端版本,其中每個卷積層都會這個塊中之前所有卷積層的輸出。首先,我們將輸入激活到列表中,之后我們進入一個循環(huán),循環(huán)遍歷塊的深度。以便后續(xù)的迭代的到越來越多的輸入特征映射。這個方案會持續(xù)進行直到達到所需要的深度為止。
雖然的到一個能夠像DenseNet一樣的出色的架構(gòu)需要花費數(shù)月的研究,但實際的構(gòu)建模塊就是這么簡單,令人著迷。
Squeeze-and-Excitation 塊
SENet在短時間內(nèi)是ImageNet的很杰出的架構(gòu)。它建立在ResNext之上,而且專注于對網(wǎng)絡(luò)逐個通道的信息進行建模。在常規(guī)的卷積層中每個通道對于點積運算中的加法操作有著相同的權(quán)重。
Squeeze- and-Excitation塊
SENet引入了一個非常簡單的模塊,它能夠加入任何已經(jīng)存在的架構(gòu)。它創(chuàng)造了一個小的神經(jīng)網(wǎng)絡(luò),能夠根據(jù)輸入學(xué)習(xí)每個濾波器的權(quán)重。你可以看到它本身并不是卷積塊,但是因為它能夠添加到任何卷積塊中而且能夠提高性能,所以我想要將它添加到混合架構(gòu)中。
每個通道被壓縮成一個單值并饋入兩層神經(jīng)網(wǎng)絡(luò)。根據(jù)分布的通道,這個網(wǎng)絡(luò)會基于重要性加權(quán)這些通道,最后這些權(quán)重會與卷積激活相乘。
SENet引入了一個很小的計算開銷,但是卻可能改進任何卷機模型。在我看來,這個塊并沒有得到應(yīng)有的重視。
NASNet 標準單元
這就是事情開始變得丑陋的地方。我們正在離開人們的空間,提出簡單而有效的設(shè)計決策并且進去一個設(shè)計神經(jīng)網(wǎng)絡(luò)架構(gòu)的算法世界。NASNet在設(shè)計方面令人難以置信,但是他的實際架構(gòu)卻相對復(fù)雜。我們知道,在他ImageNet的表現(xiàn)是相當?shù)暮谩?/p>
通過手工,作者定義了不同類型的卷積和池化層的搜索空間,每個層都有不同的可能性設(shè)置。他還定義了這些層如何平行排列,排列順序以及怎樣加或者串聯(lián)這些層。一定這樣定義,他們就建立了一個基于遞歸神經(jīng)網(wǎng)絡(luò)的強化學(xué)習(xí)(RL)算法,如果特定的方案設(shè)計在CIFAR-10數(shù)據(jù)集上表現(xiàn)的良好,那么就會得到獎勵。
由此產(chǎn)生的架構(gòu)不僅再在CIFAR-10上表現(xiàn)良好,它也在ImageNet得到了杰出的結(jié)果。NASNet由標準單元和還原單元組成,它們彼此重復(fù)。
這是你如何在Keras中使用標準單元的代碼。除了層的組合和設(shè)置非常好用之外沒有什么新的東西。
倒置殘差塊
......
想要繼續(xù)閱讀,請移步至我們的AI研習(xí)社社區(qū):https://club.leiphone.com/page/TextTranslation/614
更多精彩內(nèi)容盡在 AI 研習(xí)社。雷鋒網(wǎng)雷鋒網(wǎng)
不同領(lǐng)域包括計算機視覺,語音語義,區(qū)塊鏈,自動駕駛,數(shù)據(jù)挖掘,智能控制,編程語言等每日更新。
雷鋒網(wǎng)雷鋒
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。