導航:首頁 > 網路問題 > 怎麼對輕量神經網路進行優化

怎麼對輕量神經網路進行優化

發布時間:2022-12-27 11:18:06

㈠ matlab的遺傳演算法優化BP神經網路

對y=x1^2+x2^2非線性系統進行建模,用1500組數據對網路進行構建網路,500組數據測試網路。由於BP神經網路初始神經元之間的權值和閾值一般隨機選擇,因此容易陷入局部最小值。本方法使用遺傳演算法優化初始神經元之間的權值和閾值,並對比使用遺傳演算法前後的效果。
步驟:
未經遺傳演算法優化的BP神經網路建模
1、
隨機生成2000組兩維隨機數(x1,x2),並計算對應的輸出y=x1^2+x2^2,前1500組數據作為訓練數據input_train,後500組數據作為測試數據input_test。並將數據存儲在data中待遺傳演算法中使用相同的數據。
2、
數據預處理:歸一化處理。
3、
構建BP神經網路的隱層數,次數,步長,目標。
4、
使用訓練數據input_train訓練BP神經網路net。

㈡ 用粒子群群演算法優化BP神經網路的參數,進行極值尋優

這四個都屬於人工智慧演算法的范疇。其中BP演算法、BP神經網路和神經網路
屬於神經網路這個大類。遺傳演算法為進化演算法這個大類。
神經網路模擬人類大腦神經計算過程,可以實現高度非線性的預測和計算,主要用於非線性擬合,識別,特點是需要「訓練」,給一些輸入,告訴他正確的輸出。若干次後,再給新的輸入,神經網路就能正確的預測對於的輸出。神經網路廣泛的運用在模式識別,故障診斷中。BP演算法和BP神經網路是神經網路的改進版,修正了一些神經網路的缺點。
遺傳演算法屬於進化演算法,模擬大自然生物進化的過程:優勝略汰。個體不斷進化,只有高質量的個體(目標函數最小(大))才能進入下一代的繁殖。如此往復,最終找到全局最優值。遺傳演算法能夠很好的解決常規優化演算法無法解決的高度非線性優化問題,廣泛應用在各行各業中。差分進化,蟻群演算法,粒子群演算法等都屬於進化演算法,只是模擬的生物群體對象不一樣而已。

㈢ SENet及對輕量級網路的一些理解

轉自: https://zhuanlan.hu.com/p/71995304

受限於硬體的羸弱,深度學習在上世紀的發展一直是不溫不火,直到2012年,Alexnet橫空出世,深度學習才開始前所未有的大發展。隨著技術的發展,卷積神經網路逐漸取代了之前全連接的神經網路,成為深度學習領域的主流演算法。

卷積神經網路的優勢在於能夠更好的提取特徵和權值共享,自Alexnet之後,VGG又提出了神經網路的深度越深,效果越好的思想。自此深度成為構建網路時所考慮的第一要素。此時,又有人提出了Inception模型,這是人們在關注深度之外第一次關注網路的時間復雜度和空間復雜度。

圖1

如圖1所示,就是Inception v1的模型,該模型主要利用了1x1卷積進行了降維處理,達到了減小網路參數量和計算量的效果。在接下來的改進中,Inception又提出了利用兩層3x3網路取代一層5x5網路這樣的奇思妙想,進一步達到了減輕網路復雜度的作用。

如圖2所示,就是5x5卷積變成3x3卷積的示意圖。

圖2

從此之後,輕量級網路開始盛行。諸如Squeezenet,Mobilenet等都是輕量級網路中的傑出代表。

自Inception之後,人們已經不再通過暴力的增加網路層數的方法來企圖獲得更高的准確率了,然而面對復雜的問題,過淺的網路很難達到理想的效果,所以加深網路依然是解決圖像分類問題的最佳途徑。但是增加網路很容易造成overfiting甚至訓練集上得到的效果也比淺層網路要差,所以如何有效的增加網路層數就成了深度學習領域研究的重中之重。

為了解決這個問題,很多學者提出了自己的見解,如resnet所講述的殘差網路就是一例。然而殘差網路雖然能夠增加層數但是層數增加到三位數之後再增加也就有些無能為力了。此時作者另闢蹊徑,提出了一種新型的網路結構SENet,這個網路結構可以對所有網路進行改進然後做到真正有效的增加層數,無論原網路層數有多深,通過加入SENet,都能增加相當數量的深度,並有效的提高實驗效果。值得一提的是SENet在2017年的ImageNet挑戰賽獲得冠軍。

從Inception開始,學者們提出網路的時候就主要是提出一個block,然後用這個block像搭積木一樣的搭出整個網路。同樣,作者也是用這個方法設計網路的,作者提出了一個Squeeze-and-Excitation block,然後用這個SE block搭出了整個網路。

卷積神經網路雖然有諸多的好處,但是卷積神經網路捕捉到的只是局部的信息,假如卷積核是7x7,那麼感受野的大小也只有7x7。但是一張圖片的每一個像素點之間都是互相有聯系的,之前使用局部感受野的網路都忽略掉了全局像素點之間的關聯信息,使得實驗效果不夠理想。Inception通過多尺度的卷積核,找到了提取一張feature map上全局關聯信息的方法,然而直到本文網路之前都沒有誰考慮各通道之間的全局關聯信息。所以作者將關注點放到了通道關聯信息上,作者發現提取出通道之間互相關聯的信息可以有效的增加神經網路的分類准確率。

圖3

如圖3所示,就是一個SE block。對於任意給定的變換

(1)

我們可以構造一個對應的SE塊來進行特徵重新校準。首先通過擠壓操作,跨越空間維度WXH產生一個全局描述符,這個全局描述符聚合了所有通道的空間信息,之後再進行激勵操作,其中通過基於通道依賴性的門控機制為每個通道學習特定采樣的激活,控制每個通道的激勵。然後特徵映射U被重新加權以生成SE塊的輸出,再與之前的block結合在一起,就達到了提取通道關聯信息的目的。

SE網路可以通過簡單地堆疊SE block的集合來生成,也可以用作架構中任意深度的原始塊的直接替換。

新CNN架構的開發是一項具有挑戰性的工程任務,通常涉及許多新的超參數和網路各層配置的選擇。相比之下,上面概述的SE塊的設計是簡單的,並且可以直接與現有的最新架構一起使用,其卷積層可以通過直接用對應的SE層來替換從而使效果得到加強。另外,SE塊在計算上是輕量級的,並且在模型復雜性和計算負擔方面僅稍微增加。為了支持這些聲明,作者開發了一些SENets,即SE-ResNet,SE-Inception,SE-ResNeXt和SE-Inception-ResNet,並在ImageNet 2012數據集上對SENets進行了廣泛的評估。此外,為了證明SE塊的一般適用性,作者還呈現了ImageNet之外的結果,這表明作者所提出的方法不受限於特定的數據集或任務。

圖3所示的Ftr,我們可以將其看做一個普通的卷積層,事實上,在SE-ResNet,SE-Inception中,對應的Ftr分別就是殘差塊和Inception塊。

Squeeze操作的目的其實就是將空間信息提取出來,為了網路的輕量級,事實上我們還希望能夠將信息進行壓縮,不要增加過大的時間復雜度和空間復雜度。

因此作者選取了全局平均池化進行Squeeze操作。如圖3所示,我們將通過全局平均池化得到的向量設為Z,那麼z的第c個元素即可通過公式(2)進行計算:

(2)

這個操作實際上是在得到U之後再進行的全局平均池化。一般CNN的每個通道的濾波器都是對局部感受野進行特徵提取,因此U中的每個feature map都無法利用與其他feature map之間的關聯關系,而且在較低網路層次上對應到原圖尺寸上的感受野相對於較高層數的來說,無疑是很小的,這樣空間關聯信息的流失就會更加嚴重。

那麼作者提出的這個Squeeze,實際上就相當於將感受野擴展到了全局,自然能夠提取的特徵就更為豐富,通過訓練得到的分類識別的准確率就更高了。

為了利用在上一個操作中得到的全局信息,作者就提出了Excitation這個操作來全面捕獲通道相關性。如圖4和圖5所示,就分別是SE-Inception Mole和SE-Inception Mole。作者指出我們所需的這個Excitation必須是靈活的同時又要能學習到非互斥的信息。

那麼通過觀察圖4和圖5我們也能輕易的得知:

(3)

其中指的是Relu函數,指的是sigmoid函數,r為壓縮比例。這實際上就是兩個全連接層再加上兩個激活層。第一層全連接層的作用就是將global pooling所得到的全局信息進行壓縮,作者通過實驗發現,壓縮比例r=16的時候實驗結果最為理想。那麼第二層全連接層的作用就是將被壓縮的向量進行還原,還原到和global pooling層之後的向量大小一致。然後再將該向量與Ftr得到的三維卷積進行乘運算,實際上該向量中的每個值就與三維卷積中每個通道對應的feature map 相乘,這樣每一個feather map就得到了與其他通道的空間關聯特徵了。

圖4

那麼圖4和圖5中的C指的就是通道的數目,而指的就是這個模塊輸入的feather map的尺寸大小。而通過圖示我們也能清楚的看到SE block可以通用的加在所有的網路結構中從而達到提升性能的作用。

SENet通過堆疊一組SE塊來構建。實際上,它是通過用原始塊的SE對應部分(即SE殘差塊)替換每個原始塊(即殘差塊)而產生的,作者在表1中描述了SE-ResNet-50和SE-ResNeXt-50的架構。

圖5

表1

作者通過實驗發現,SE block改進resnet-50時,所增加參數量不超過10%,卻提升了1.5個百分點的准確率,並且作者後來通過實驗發現整體網路最末尾的SE block對效果提升作用很小,去除掉這些block網路的准確率也不過下降0.1個百分點,而增加的額外參數量就減小到4%了。如表2所示,是幾個原有的網路結構的top-1和top-5的准確率,original表示的是網路提出者得到的結果,而re-implementation指的是作者復現的結果,而SENet指的是作者運用SENet加強之後得到的結果,很明顯有顯著的准確率提升。

表2(該表截取自論文)

同時,作者還提出了一個計算模型復雜度的方法來探究運用了SENet之後,模型的參數量到底增加了多少,很顯然准確率增加百分比相同的情況下,參數量增加越少的話,演算法性價比越高。

兩個全連接層的參數量都是,那麼兩個全連接層的參數量就是。以resnet為例,假設resnet一共包含了S個stage,其中第s個stage裡麵包含了個重復的殘差塊,那麼用SENet加強過的resnet所增加的參數量就可以用公式(4)進行計算:

(4)

SENet的結構非常簡單,特別容易部署,不需要引入新的函數或者卷積層,並且增加的參數量微乎其微,是一個有效增加神經網路分類准確率的方法。同時,作者通過實驗發現,在Faster-rcnn等用於實現目標檢測的網路中增加SENet塊進行加強,也能得到很好的效果,這進一步證明了SENet網路的通用性。

接下來,作者思考了最後一個問題,增加的SE block添加在原有block中位置的不同會不會影響到實驗結果。為此,作者進行了對比試驗。

如圖6所示, 是原來的殘差網路與作者在四個不同位置添加了SE block的四種不同的網路結構,總共是五個不同的網路結構。

圖6

表3

而表3即是四種不同的SENet結構的錯誤率對比,我們能夠看到SE-PRE結構是其中相對表現最好的,這說明了SE block塊所在位置確實會影響到神經網路的整體效果,所以我們在運用SENet時,對於其所添加的位置應該好好斟酌。

這篇論文提出了一個名為名為SE block的架構單元,通過使網路能夠執行動態的信道特徵重新校準來提高網路的表示能力。實驗證明了SENets的有效性,它在多個數據集和任務之間實現了最先進的性能。此外,SE塊揭示了以前的體系結構無法充分地對通道相關關系建模。並且SE塊生成的特徵重要度值可以用於其他任務,例如用於模型壓縮的網路剪枝。

㈣ 輕量化CNN構建總結

感受野(Receptive Field)

感受野指的是卷積神經網路每一層輸出的特徵圖(feature map)上每個像素點映射回輸入圖像上的區域大小,神經元感受野的范圍越大表示其能接觸到的原始圖像范圍就越大,也意味著它能學習更為全局,語義層次更高的特徵信息,相反,范圍越小則表示其所包含的特徵越趨向局部和細節。因此感受野的范圍可以用來大致判斷每一層的抽象層次,並且我們可以很明顯地知道網路越深,神經元的感受野越大。

解析度(Resolution)

解析度指的是輸入模型的圖像尺寸,即長寬大小。通常情況會根據模型下采樣次數n和最後一次下采樣後feature map的解析度k×k來決定輸入解析度的大小,即:

從輸入r×r到最後一個卷積特徵feature map的k×k,整個過程是一個信息逐漸抽象化的過程,即網路學習到的信息逐漸由低級的幾何信息轉變為高級的語義信息,這個feature map的大小可以是3×3,5×5,7×7,9×9等等,k太大會增加後續的計算量且信息抽象層次不夠高,影響網路性能,k太小會造成非常嚴重的信息丟失,如原始解析度映射到最後一層的feature map有效區域可能不到一個像素點,使得訓練無法收斂。

在ImageNet分類任務中,通常設置的5次下采樣,並且考慮到其原始圖像大多數在300解析度左右,所以把最後一個卷積特徵大小設定為7×7,將輸入尺寸固定為224×224×3。在目標檢測任務中,很多採用的是416×416×3的輸入尺寸,當然由於很多目標檢測模型是全卷積的結構,通常可以使用多尺寸訓練的方式,即每次輸入只需要保證是32×的圖像尺寸大小就行,不固定具體數值。但這種多尺度訓練的方式在圖像分類當中是不通用的,因為分類模型最後一層是全連接結構,即矩陣乘法,需要固定輸入數據的維度。

深度(Depth)

神經網路的深度決定了網路的表達能力,它有兩種計算方法,早期的backbone設計都是直接使用卷積層堆疊的方式,它的深度即神經網路的層數,後來的backbone設計採用了更高效的mole(或block)堆疊的方式,每個mole是由多個卷積層組成,它的深度也可以指mole的個數,這種說法在神經架構搜索(NAS)中出現的更為頻繁。通常而言網路越深表達能力越強,但深度大於某個值可能會帶來相反的效果,所以它的具體設定需要不斷調參得到。

寬度(Width)

寬度決定了網路在某一層學到的信息量,但網路的寬度時指的是卷積神經網路中最大的通道數,由卷積核數量最多的層決定。通常的結構設計中卷積核的數量隨著層數越來越多的,直到最後一層feature map達到最大,這是因為越到深層,feature map的解析度越小,所包含的信息越高級,所以需要更多的卷積核來進行學習。通道越多效果越好,但帶來的計算量也會大大增加,所以具體設定也是一個調參的過程,並且各層通道數會按照8×的倍數來確定,這樣有利於GPU的並行計算。

下采樣(Down-Sample)

下采樣層有兩個作用,一是減少計算量,防止過擬合,二是增大感受野,使得後面的卷積核能夠學到更加全局的信息。下采樣的設計有兩種:

採用stride為2的池化層,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因為它計算簡單且最大響應能更好保留紋理特徵;

採用stride為2的卷積層,下采樣的過程是一個信息損失的過程,而池化層是不可學習的,用stride為2的可學習卷積層來代替pooling可以得到更好的效果,當然同時也增加了一定的計算量。

上采樣(Up-Sampling)

在卷積神經網路中,由於輸入圖像通過卷積神經網路(CNN)提取特徵後,輸出的尺寸往往會變小,而有時我們需要將圖像恢復到原來的尺寸以便進行進一步的計算(如圖像的語義分割),這個使圖像由小解析度映射到大解析度的操作,叫做上采樣,它的實現一般有三種方式:

插值,一般使用的是雙線性插值,因為效果最好,雖然計算上比其他插值方式復雜,但是相對於卷積計算可以說不值一提;

轉置卷積又或是說反卷積,通過對輸入feature map間隔填充0,再進行標準的卷積計算,可以使得輸出feature map的尺寸比輸入更大;

Max Unpooling,在對稱的max pooling位置記錄最大值的索引位置,然後在unpooling階段時將對應的值放置到原先最大值位置,其餘位置補0;

參數量(Params)

參數量指的網路中可學習變數的數量,包括卷積核的權重weight,批歸一化(BN)的縮放系數γ,偏移系數β,有些沒有BN的層可能有偏置bias,這些都是可學習的參數 ,即在模型訓練開始前被賦予初值,在訓練過程根據鏈式法則中不斷迭代更新,整個模型的參數量主要由卷積核的權重weight的數量決定,參數量越大,則該結構對運行平台的內存要求越高,參數量的大小是輕量化網路設計的一個重要評價指標。

計算量(FLOPs)

神經網路的前向推理過程基本上都是乘累加計算,所以它的計算量也是指的前向推理過程中乘加運算的次數,通常用FLOPs來表示,即floating point operations(浮點運算數)。計算量越大,在同一平台上模型運行延時越長,尤其是在移動端/嵌入式這種資源受限的平台上想要達到實時性的要求就必須要求模型的計算量盡可能地低,但這個不是嚴格成正比關系,也跟具體運算元的計算密集程度(即計算時間與IO時間佔比)和該運算元底層優化的程度有關。

在神經網路架構設計中,標准卷積是最常見的結構,假設其輸入feature map的維度是(1, iC, iH, iW),每個卷積核的維度是(1, iC, k, k),一次卷積濾波得到一層feature map的維度為(1,1, oH, oW),一共有oC個卷積核,則輸出feature map的維度是(1, oC, oH, oW),計算量為iC×k×k×oC×oH×oW,

深度卷積 (Depthwise Convolution)

深度卷積與標准卷積相比,顧名思義是在深度上做了文章,而這里的深度跟網路的深度無關,它指的通道,標准卷積中每個卷積核都需要與feature map的所有層進行計算,所以每個卷積核的通道數等於輸入feature map的通道數,通過設定卷積核的數量可以控制輸出feature map的通道數。而深度卷積每個卷積核都是單通道的,維度為(1,1,k,k) ,卷積核的個數為iC,即第i個卷積核與feature map第i個通道進行二維的卷積計算,最後輸出維度為(1,iC,oH,oW),它不能改變輸出feature map的通道數,所以通常會在深度卷積後面接上一個(oC,iC,1,1)的標准卷積來代替3×3或更大尺寸的標准卷積,總的計算量為iC×k×k×oH×oW+iC×oH×oW×oC,是普通卷積的1/oC+1/(k×k),大大減少了計算量和參數量,又可以達到相同的效果,這種結構被稱為深度可分離卷積(Depthwise Separable Convolution),在MobileNet V1被提出,後來漸漸成為輕量化結構設計的標配。

分組卷積 (Group Convolution)

分組卷積最早在AlexNet中出現,當時作者在訓練模型時為了減少顯存佔用而將feature map分組然後給多個GPU進行處理,最後把多個輸出進行融合。具體計算過程是,分組卷積首先將輸入feature map分成g個組,每個組的大小為(1, iC/g, iH, iW),對應每組中一個卷積核的大小是(1,iC/g,k,k),每組有oC/g個卷積核,所以每組輸出feature map的尺寸為(1,oC/g,oH,oW),最終g組輸出拼接得到一個(1,oC,oH,oW)的大feature map,總的計算量為iC/g×k×k×oC×oH×oW,是標准卷積的1/g,參數量也是標准卷積的1/g。

空洞卷積 (Dilated Convolution)

空洞卷積是針對圖像語義分割問題中下采樣會降低圖像解析度、丟失信息而提出的一種卷積思路。通過間隔取值擴大感受野,讓原本3x3的卷積核,在相同參數量和計算量下擁有更大的感受野。這裡面有個擴張率(dilation rate)的系數,

,標准卷積相當於dilation rate為1的空洞卷積,下圖展示的是dilation rate為2的空洞卷積計算過程,可以看出3×3的卷積核可以感知標準的5×5卷積核的范圍,還有一種理解思路就是先對3×3的卷積核間隔補0,使它變成5×5的卷積,然後再執行標准卷積的操作。

轉置卷積 (Transposed Convolutions)

轉置卷積又稱反卷積(Deconvolution),它和空洞卷積的思路正好相反,是為上采樣而生,也應用於語義分割當中,而且他的計算也和空洞卷積正好相反,先對輸入的feature map間隔補0,卷積核不變,然後使用標準的卷積進行計算,得到更大尺寸的feature map。

可變形卷積 (deformable convolution)

以上的卷積計算都是固定的,每次輸入不同的圖像數據,卷積計算的位置都是完全固定不變,即使是空洞卷積/轉置卷積,0填充的位置也都是事先確定的。而可變性卷積是指卷積核上對每一個元素額外增加了一個h和w方向上偏移的參數,然後根據這個偏移在feature map上動態取點來進行卷積計算,這樣卷積核就能在訓練過程中擴展到很大的范圍。而顯而易見的是可變性卷積雖然比其他卷積方式更加靈活,可以根據每張輸入圖片感知不同位置的信息,類似於注意力,從而達到更好的效果,但是它比可行變卷積在增加了很多計算量和實現難度,目前感覺只在GPU上優化的很好,在其他平台上還沒有見到部署。

池化(pooling)

池化這個操作比較簡單,一般在上采樣和下采樣的時候用到,沒有參數,不可學習,但操作極為簡單,和depthwise卷積類似,只是把乘累加操作替換成取最大/取平均操作。

最大池化和平均池化

全局平均池化  全局平均池化的操作是對一個維度為(C,H,W)的feature map,在HW方向整個取平均,然後輸出一個長度為C的向量,這個操作一般在分類模型的最後一個feature map之後出現,然後接一個全連接層就可以完成分類結果的輸出了。早期的分類模型都是把最後一個feature map直接拉平成C×H×W的向量,然後再接全連接層,但是顯然可以看出來這個計算量極大,甚至有的模型最後一個全連接層佔了整個模型計算量的50%以上,之後由研究人員發現對這個feature map做一個全局平均池化,然後再加全連接層可以達到相似的效果,且計算量降低到了原來的1/HW。

全連接計算(Full Connected)

這個本質其實就是矩陣乘法,輸入一個(B, iC)的數據,權重為(iC, oC),那麼輸出為(B, oC),在多層感知機和分類模型最後一層常常見到。

Addition / Concatenate分支

Addition和Concatenate分支操作統稱為shortcut,如下圖所示,操作極為簡單。Addition是在ResNet中提出,兩個相同維度的feature map相同位置點的值直接相加,得到新的相同維度feature map,這個操作可以融合之前的特徵,增加信息的表達,Concatenate操作是在Inception中首次使用,被DenseNet發揚光大,和addition不同的是,它只要求兩個feature map的HW相同,通道數可以不同,然後兩個feature map在通道上直接拼接,得到一個更大的feature map,它保留了一些原始的特徵,增加了特徵的數量,使得有效的信息流繼續向後傳遞。

Channel shuffle

channel shuffle是ShuffleNet中首次提出,主要是針對分組卷積中不同組之間信息不流通,對不同組的feature map進行混洗的一個操作,如下圖所示,假設原始的feature map維度為(1,9,H,W),被分成了3個組,每個組有三個通道,那麼首先將這個feature map進行重塑操作,得到(1,3,3,H,W),然後對中間的兩個大小為3的維度進行轉置,依然是(1,3,3,H,W),最後將通道拉平,變回(1,9,H,W),就完成了通道混洗,使得不同組的feature map間隔保存,增強了信息的交互。

激活函數的非線性是神經網路發揮作用最重要的因素之一,而對於實際部署,激活函數的實現也是很重要的一個方面,實現的不好對加速效果影響很大。

ReLU系列

這里主要指常用的ReLU,ReLU6和leaky ReLU。ReLU比較好部署,小於0的部分為0,大於0的部分為原始值,只需要判斷一下符號位就行;ReLU6與ReLU相比也只是在正向部分多了個閾值,大於6的值等於6,在實現時多了個比較也不算麻煩;而leaky ReLU和ReLU正向部分一樣,都是大於0等於原始值,但負向部分卻是等於原始值的1/10,浮點運算的話乘個0.1就好了,如果因為量化要實現整數運算,這塊可以做個近似,如0.1用13>>7來代替,

Sigmoid系列

早期比較經典的卷積神經網路,如AlexNet,VGG,GoogleNet(或Inception),ResNet,DenseNet都是以提升模型在ImageNet數據集上的分類精度為主了,很少考慮參數量和計算量的問題,他們的主要結構解析起來也比較簡單,基本都是由標准卷積(7×7,5×5,3×3和1×1),Pooling和shortcut操作(Addition / Concatenate)構成,而且以3×3及其以上的卷積核為主,通道數也是動輒上千,所以參數量和計算量巨大。後續研究人員慢慢發現兩個3×3卷積可以代替一個5×5卷積的效果,三個3×3卷積可以代替一個7×7卷積的效果,大量使用1×1卷積,使用3×3 depthwise conv + pointwise conv(1×1標准卷積)可以代替3×3普通卷積......一系列操作可以減少參數量和計算量

SqueezeNet

SqueezeNet是公認的輕量級模型設計最早期的工作之一,作者提出了三種策略來實現在保持精度的情況下大大減少當時主流模型(以AlexNet為例)的計算量和參數量:

將模型中一部分的3×3卷積用1×1來代替,1×1卷積是3×3參數量和計算量的1/9,所以可以大大減少參數量和計算量;減少3×3卷積的輸入通道數,這個可以通過在進入3×3卷積之前加一個1×1卷積來實現通道數量的減少;將下采樣層的位置往後推,使得模型可以在更大的feature map上進行更多的學習,這一步雖然會在增加計算量,但是和上面兩個策略結合可以在維持模型精度的情況下仍大大減少參數量和計算量;

根據上面的策略,作者提出了fire mole的子結構,如上圖所示,然後整個模型由這樣的子結構堆疊而成。這個fire mole由squeeze部分和expand部分構成,squeeze部分是1×1的卷積層,而expand部分是1×1的卷積和3×3的卷積拼接起來的,每次feature map輸入這個fire mole會在squeeze層降低通道數,然後在expand通道增加通道數,從而在參數量更少的情況下仍然可以得到充分的學習。最後結合一些模型壓縮的方法可以使得SqueezeNet在達到AlexNet同等精度的情況下,參數量減少到後者的1/50,計算量減少到後者的1/510。

這篇論文使用大量1×1的卷積核代替3×3卷積,並且利用1×1卷積改變大尺度卷積層輸入feature map的通道數從而減少計算量的思想是非常有意義的,後續的很多輕量級網路的論文都沿用了這種套路。

MobileNet系列

MobileNet系列一共有V1,V2和V3三篇論文,簡要的講:

MobileNet V1主要思想是提出了一種新的結構—深度可分離卷積(Depthwise Separable Convolution)來代替標准3×3卷積,從而大大減少模型的參數量和計算量;

MobileNet V2在V1的基礎上提出了一種倒置殘差的模塊,這個模塊有三個卷積,第一個部分是一個1×1標准卷積,用來升維,第二個部分是由3×3深度卷積+1×1標准卷積構成的深度分離卷積,用來學習特徵和降維,模塊的輸出和輸入再進行一個Addition的操作,由於和ResNet中維度升降方式相反,所以稱為倒置殘差。中間升維的作用是讓深度可分離卷積得到更充分的學習,計算量相對於標准卷積來說也不大,而且這種升降維的方式非常靈活,可以大大減少計算量。本文還從流形學的角度探究了輸入深度可分離卷積上一層的ReLU6對信息傳遞的影響,理論證明去掉上一個1×1標准卷積的ReLU激活函數能更有利於後面的深度可分離卷積對特徵的學習。

MobileNet V3感覺相對於前兩篇沒有那麼大的結構創新了,主要思想是神經架構搜索(NAS)和硬體友好結構,總的來看V3的結構是在V2的基礎上進行了一些修改,如增加了SE block這種已被提出的注意力機制,激活函數換成了H-swish,last stage減少了幾層計算,針對語義分割提出了Lite R-ASPP的head(不在討論之列)。

ShuffleNet系列  曠視出品的ShuffleNet系列有兩篇論文

ShuffleNet V1是在MobileNet V1後MobileNet V2前提出的,說實話結構上和MobileNet V2還挺像,大家可以上下兩張圖片對比一下。兩者都想到了學習ResNet的殘差結構,區別在於ShuffleNet V1覺得block當中的1×1標准卷積也非常耗時,於是用1×1的分組卷積外加channel shuffle的操作給替換了,然後MobileNet V2會先升維讓深度可分離卷積得到充分的學習再降維回來,ShuffleNet V1中stride為2的模塊也有自己的特色,雖然看著MobileNet V2的結構更簡潔一些,但ShuffleNet V1創新也是不少,尤其那個用channel shuffle增強不同組之間信息交互的操作

huffleNet  V2論文是一篇誠意滿滿之作,作者通過分析ShuffleNet v1與MobileNet v2這兩個移動端網路在GPU/ARM兩種平台下的時間消耗分布,看出Conv等計算密集型操作佔了絕大多數時間,但其它像Elemwise和IO等內存讀寫密集型操作也佔了相當比例的時間,因此像以往那樣僅以FLOPs來作為指導准則來設計CNN網路是不完備的,雖然它可以反映出佔大比例時間的Conv操作,但不夠准確。於是作者提出了高效網路設計的四個指導原則:

當輸入和輸出的通道數相同時,conv計算所需的MAC(memory access cost)最小;

大量的分組卷積會增加MAC開銷;

網路結構的碎片化會減少其可並行優化的程度,GoogleNet系列和NASNet中很多分支進行不同的卷積/pool計算非常碎片,對硬體運行很不友好;

Element-wise操作不可忽視,對延時影響很大,包括ReLU,Addition,AddBias等,主要是因為這些操作計算與內存訪問的佔比太小;

基於此,作者提出了ShuffleNet V2的blocks,如下所示,與V1相比,去掉了分組卷積的操作,去掉了Add操作,換成了Concat,stride為2的block的旁路把平均池化換成了深度可分離卷積,為了繼續延續channel shuffle的操作,作者在block進去的地方做了個split的操作,最後再concat+channel shuffle,這里是為了替換掉之前的Add,同時也可以減少計算量。

GhostNet

GhostNet也是一篇很有意思且簡潔的架構設計的論文,作者在可視化一些訓練好的神經網路中間feature map時發現它們通常會包含一些相似且冗餘的特徵圖,使得神經網路能得到更充分的學習。基於這個想法,作者通過設定一系列廉價的線性運算操作來代替部分卷積計算,以此來產生更多的特徵圖,僅僅這么一個簡單的操作就可以減少模型的參數量和計算量,而且在幾個視覺公開數據集上取得了很不錯的效果,甚至超越了MobileNet V3

總的思路:選定合適結構 + 通道剪枝 + 量化

訓練  :ImageNet pretrain model + Data Normalization(統計自己數據集的均值和方差) + Batch Normlization + 大batch size + 一堆數據增強tricks + 嘗試各種花里胡哨的loss function和optimizer

https://mp.weixin.qq.com/s/LO1W2saWslf6Ybw_MZAuQQ

㈤ 神經網路的優化

上節回顧:
介紹了神經元、神經網路
介紹了激活函數
提到了前向傳播概念
留下問題:用到的參數w和b是怎麼來的,是自己隨便設定的嗎

本節介紹:
神經網路、反向傳播的例子
損失函數和梯度下降法、學習率介紹

最重要的用途是分類

這種能自動對輸入的東西進行分類的機器,就叫做 分類器 。分類器的輸入是一個數值向量,叫做特徵(向量)。
第一個例子里,分類器的輸入是一堆0、1值,表示字典里的每一個詞是否在郵件中出現,比如向量(1,1,0,0,0......)就表示這封郵件里只出現了兩個詞abandon和abnormal;
第二個例子里,分類器的輸入是照片,假如每一張照片都是320x240像素的紅綠藍三通道彩色照片,那麼分類器的輸入就是一個長度為320x240x3=230400的向量。

分類器的輸出也是數值。
第一個例子中,輸出1表示郵件是垃圾郵件,輸出0則說明郵件是正常郵件;
第二個例子中,輸出0表示圖片中是狗,輸出1表示是貓。

分類器的目標就是讓正確分類的比例盡可能高。一般我們需要首先收集一些樣本, 人為標記上正確分類結果 ,然後用這些標記好的數據 訓練分類器 ,訓練好的分類器就可以 在新來的特徵向量上工作 了。

這就是BP神經網路(back propagation)。

旨在得到最優的全局參數矩陣,進而將多層神經網路應用到分類或者回歸任務中去。

前向傳播 輸入信號直至 輸出產生誤差 反向傳播 誤差信息 更新權重 矩陣。

這個地方提到的誤差這個概念,其實就是對應了損失函數,損失函數說白了就是計算誤差的函數。

舉例:線性回歸:尋找一條擬合圖中數據點最好的直線

把每條小豎線的長度加起來就等於我們現在通過這條直線預測出的值與實際值之間的差距

缺點:採用梯度下降法學習時,模型一開始訓練學習速率非常慢

對一個多元函數求偏導,會得到多個偏導函數.這些導函數組成的向量,就是梯度;一元函數的梯度是什麼?它的梯度可以理解為就是它的導數。
求解多元函數和一元函數的道理是一樣的,只不過函數是一元的時候,梯度中只有一個導函數,函數是多元的時候,梯度中有多個導函數.
當我們把梯度中的所有偏導函數都變為0的時候,就可以找到每個未知數的對應解。

梯度下降中求偏導數的未知數不是x和y,而是x的參數W。

梯度下降的方向:把這一點帶入到梯度函數中,結果為正,那我們就把這一點的值變小一些,同時就是讓梯度變小些;當這一點帶入梯度函數中的結果為負的時候,就給這一點的值增大一些。

在這個下降的過程中.因為我們並不知道哪一個點才是最低點,也沒有辦法來預測下降多少次才能到最低點.這里梯度下降給出的辦法是:
先隨便蒙一個點出來,然後根據這個點每次下降以丟丟.什麼時候下降得到的值(點帶入偏導函數得到的)和上一次的值基本一樣,也就是相差特別特別小的時候,我們認為就到了最低點。

讓點沿著梯度方向下降慢慢求得最優解的過程我們叫做 學習 ,學習率就是用來限制他每次學習別太過"用功"的。下左圖是我們所期望的,一個點按照梯度方向下降,慢慢逼近最低點,右圖中展示的這個梯度值過大的時候,點下降的step就過大了,一次性邁過了最低點,導致函數無法找到最優解。學習率就是用來限制這種情況的。

更新權重的演算法:每一個權重值都要減去它對應的導數和學習率的乘積
Lr 代表的是學習率

簡單舉例

㈥ 在MATLAB中用神經網路演算法求解無約束最優化問題

程序一:GA訓練BP權值的主函數 function net=GABPNET(XX,YY) % 使用遺傳演算法對BP網路權值閾值進行優化,再用BP演算法訓練網路 %數據歸一化預處理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %創建網路 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm'); %下面使用遺傳演算法對網路進行優化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隱含層節點數 S=R*S1+S1*S2+S1+S2;%遺傳演算法編碼長度 aa=ones(S,1)*[-1,1]; popu=50;%種群規模 save data2 XX YY % 是將 xx,yy 二個變數的數值存入 data2 這個MAT-file, initPpp=initializega(popu,aa,'gabpEval');%初始化種群 gen=100;%遺傳代數 %下面調用gaot工具箱,其中目標函數定義為gabpEval [x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,... 'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]); %繪收斂曲線圖 figure(1) plot(trace(:,1),1./trace(:,3),'r-'); hold on plot(trace(:,1),1./trace(:,2),'b-'); xlabel('Generation'); ylabel('Sum-Squared Error'); figure(2) plot(trace(:,1),trace(:,3),'r-'); hold on plot(trace(:,1),trace(:,2),'b-'); xlabel('Generation'); ylabel('Fittness');

㈦ Matlab問題--如何用遺傳演算法優化BP神經網路這篇文獻(中文)是如何做的

我上次發給你的程序,只要你從網上下一個matcom45就行了,直接裝在c盤就可以了,你發給我的論文變數太多用一般的遺傳演算法不行,我從網上發現了一個PID神經網路,相當好用,不用計算隱層數目,很適合用遺傳演算法進行優化,我編了一個常式回來發給你。

我真的不會用matlab的工具箱,如果一定要用matlab來做優化,恐怕我幫不了你了。

為什麼一定要用matlab,用C++自己編寫不也很好嗎?

閱讀全文

與怎麼對輕量神經網路進行優化相關的資料

熱點內容
網路共享中心沒有網卡 瀏覽:494
電腦無法檢測到網路代理 瀏覽:1351
筆記本電腦一天會用多少流量 瀏覽:478
蘋果電腦整機轉移新機 瀏覽:1349
突然無法連接工作網路 瀏覽:962
聯通網路怎麼設置才好 瀏覽:1195
小區網路電腦怎麼連接路由器 瀏覽:934
p1108列印機網路共享 瀏覽:1187
怎麼調節台式電腦護眼 瀏覽:604
深圳天虹蘋果電腦 瀏覽:841
網路總是異常斷開 瀏覽:584
中級配置台式電腦 瀏覽:896
中國網路安全的戰士 瀏覽:606
同志網站在哪裡 瀏覽:1382
版觀看完整完結免費手機在線 瀏覽:1432
怎樣切換默認數據網路設置 瀏覽:1081
肯德基無線網無法訪問網路 瀏覽:1255
光纖貓怎麼連接不上網路 瀏覽:1378
神武3手游網路連接 瀏覽:938
局網列印機網路共享 瀏覽:976