神經(jīng)網(wǎng)絡的層次結構分為三大層:輸入層刻坊,隱藏層,輸出層党晋。其中最為重要的是隱藏層谭胚,它包括四大部分:卷積層徐块、激活層、池化層灾而、全連接層胡控。
1.卷積層 Convolution Layer
卷積的原理
- 在三維輸入特征圖上滑動一定大小的窗口,在每個可能的位置停留并提取三維特征圖塊(win_hwin_winput_d)绰疤,將三維圖塊與權重矩陣(卷積核)做張量積铜犬,轉(zhuǎn)換成形狀為input_d的一維向量舞终。最后將所有一維向量轉(zhuǎn)換為三維輸出特征圖(hwoutput_d)轻庆。
卷積層的作用
通過卷積核在原始圖像上平移來提取特征。
備注:卷積核為1x1的卷積層 等價于全連接層敛劝。卷積層可以看作是計算量和準確度的一種妥協(xié)余爆。
卷積神經(jīng)網(wǎng)絡的優(yōu)點
局部連接:每個神經(jīng)元不再和上一層的所有神經(jīng)元相連,而只和一小部分神經(jīng)元相連夸盟。這樣就減少了很多參數(shù)蛾方。
權值共享:用一個卷積核去卷積一張圖,這張圖每個位置是被同樣數(shù)值的卷積核操作的上陕,權重是一樣的桩砰,也就是參數(shù)共享。
下采樣:可以使用Pooling來減少每層的樣本數(shù)释簿,進一步減少參數(shù)數(shù)量亚隅,同時還可以提升模型的魯棒性。
卷積層相關概念
(單個)卷積核通道數(shù) :等于卷積輸入層的通道數(shù)庶溶。
卷積輸出層通道數(shù):等于卷積核的個數(shù)煮纵,也叫輸出特征圖的深度。它決定了卷積操作之后生成的feature map數(shù)量偏螺。
卷積核的大行惺琛:卷積核=圖塊尺寸x輸出特征圖的深度氓英,卷積核可以理解為人工神經(jīng)網(wǎng)絡中的權重大小伸眶。(卷積核一般隨機生成碎连,包含[0,1,-1]的矩陣)
偏置項:因為在進行圖像線性處理的墅诡,需要對圖像進分割螟凭,偏置項的作用使分割的線性圖像可以不過原點锄列。
滑動步長(stride):卷積窗口從輸入數(shù)組的最左上方開始财搁,按從左往右贴届、從上往下的順序劲够,依次在輸入數(shù)組上滑動震桶。我們將每次滑動的行數(shù)和列數(shù)稱為步長(stride)。
填充(padding)征绎,因為卷積核按照相應步長移動蹲姐,卷積核可能會超出圖片的范圍磨取,因此可以在圖片外圍進行零填充,保證每一個卷積核都有相應的值與之計算柴墩。
1x1卷積的作用
1x1卷積忙厌,可以看成一種全連接(計算量和準確度的一種妥協(xié))。
實現(xiàn)跨通道的信息交互和整合江咳。1x1卷積核只有一個參數(shù)逢净,當它作用在多通道的feature map上時,相當于不同通道上的一個線性組合歼指,實際上就是加起來再乘以一個系數(shù)爹土,但是這樣輸出的feature map就是多個通道的整合信息了,能夠使網(wǎng)絡提取的特征更加豐富踩身。
-
feature map通道數(shù)的降維和升維:x1卷積可以改變通道數(shù)胀茵。
-
示例:假設輸入的特征維度為100x100x128,卷積核大小為5x5(stride=1挟阻,padding=2)琼娘,通道數(shù)為256,則經(jīng)過卷積后輸出的特征維度為100x100x256附鸽,卷積參數(shù)量為128x5x5x256=819200脱拼。
此時在5x5卷積前使用一個64通道的1x1卷積,最終的輸出特征維度依然是100x100x256坷备,但是此時的卷積參數(shù)量為128x1x1x64 + 64x5x5x256=417792熄浓,大約減少一半的參數(shù)量。
-
增加非線性映射次數(shù)击你。1x1卷積后通常加一個非線性激活函數(shù)玉组,使網(wǎng)絡提取更加具有判別信息的特征,同時網(wǎng)絡也能做的越來越深丁侄。
感受野
- 卷積神經(jīng)網(wǎng)絡每一層輸出的特征圖(feature map)上的像素點在原始圖像上映射的區(qū)域大小惯雳。
1)不同卷積方法及輸出維度計算
valid卷積
-
最常用的下采樣卷積,其特點是卷積核不能超出特征圖的范圍鸿摇。
-
輸出的特征圖維度計算公式
輸出寬度 = (輸入寬度?卷積核寬度 + 2?填充寬度) / 步長+1
輸出高度 = (輸入高度?卷積核高度 + 2?填充高度) / 步長+1
輸出通道數(shù) = 卷積核數(shù)量
full卷積
-
典型的上采樣卷積石景,其特點式卷積核可以超出特征圖的范圍,但是卷積核的邊緣要與特征圖的邊緣有交點拙吉。
輸出的特征圖維度計算公式同valid卷積潮孽。
same卷積
-
介于full卷積和valid卷積之間的一種卷積方式,其特點是卷積前后特征圖的尺寸不變筷黔。由于same卷積的特點往史,其Padding值是固定設置的。
-
Padding計算式可通過上述公式推導得出
- Skernel 代表卷積核的步長佛舱, Dkernel 代表卷積核的維度椎例, Padding 代表擴充值的維度挨决。
反卷積
一種常用的上采樣方法。反卷積可以將圖像恢復到卷積之前的尺寸订歪,輸出尺寸的計算式為:
其中:
2)常用卷積層算子
-
一維卷積層算子 (
nn.Conv1d
):用于處理一維的信號數(shù)據(jù)脖祈,如時序數(shù)據(jù)、文本數(shù)據(jù)等刷晋。它在輸入數(shù)據(jù)的一個滑動窗口上應用可學習的卷積核盖高,產(chǎn)生新的特征圖⊙凼可以通過改變卷積核大小喻奥、填充方式、步長等超參數(shù)來控制輸出尺寸蒙幻。
-
二維卷積層算子 (
nn.Conv2d
):用于處理二維的圖像數(shù)據(jù)映凳,它通過在輸入數(shù)據(jù)的一個滑動窗口上應用可學習的卷積核胆筒,計算出新的特征圖邮破。二維卷積層算子也可以通過改變卷積核大小、填充方式仆救、步長等超參數(shù)來控制輸出尺寸抒和。
-
三維卷積層算子 (
nn.Conv3d
):用于處理三維的圖像數(shù)據(jù),如視頻數(shù)據(jù)等彤蔽。它在輸入數(shù)據(jù)的一個滑動窗口上應用可學習的卷積核摧莽,計算出新的特征圖。三維卷積層算子也可以通過改變卷積核大小顿痪、填充方式镊辕、步長等超參數(shù)來控制輸出尺寸。
-
反卷積層算子 (
nn.ConvTranspose2d
):是卷積層算子的逆過程蚁袭,用于上采樣特征圖征懈。將輸入數(shù)據(jù)進行插值,并在插值結果上應用可學習的卷積核揩悄,產(chǎn)生新的特征圖卖哎。同樣地,反卷積層算子也可以通過改變卷積核大小删性、填充方式亏娜、步長等超參數(shù)來控制輸出尺寸。
-
深度可分離卷積層算子 (
nn.Conv2d(depthwise=True, pointwise=True)
):是一種輕量級卷積層算子蹬挺,它將卷積操作分解為兩個步驟:深度卷積和逐點卷積维贺。
深度卷積先對輸入特征圖的每一個通道應用一個可學習的卷積核,產(chǎn)生新的特征圖巴帮。
逐點卷積則將多個深度卷積的結果在通道維度上進行拼接溯泣,并應用另一個可學習的卷積核來產(chǎn)生最終的輸出特征圖群发。
2.非線性激活層 Non-Linear Activations
-
激活層的作用:通過激活函數(shù),加入非線性因素的发乔,增加模型的非線性表達能力熟妓。
卷積運算是一種局部線性變換,屬于稀疏連接栏尚。
如果連續(xù)多層卷積但只使用線性激活函數(shù)或者沒有使用激活函數(shù)起愈,那么無論神經(jīng)網(wǎng)絡有多少層一直在做的只是計算線性函數(shù),退化為一層译仗。
-
激活函數(shù)應該具有的性質(zhì):
非線性:線性激活層對于深層神經(jīng)網(wǎng)絡沒有作用抬虽,因為其作用以后仍然是輸入的各種線性變換。纵菌。
連續(xù)可微:梯度下降法的要求阐污。
范圍最好不飽和:當有飽和的區(qū)間段時,若系統(tǒng)優(yōu)化進入到該段咱圆,梯度近似為0笛辟,網(wǎng)絡的學習就會停止。
單調(diào)性:當激活函數(shù)是單調(diào)時序苏,單層神經(jīng)網(wǎng)絡的誤差函數(shù)是凸的手幢,好優(yōu)化。
在原點處近似線性:這樣當權值初始化為接近0的隨機值時忱详,網(wǎng)絡可以學習的較快围来,不用可以調(diào)節(jié)網(wǎng)絡的初始值。
1)常用激活函數(shù)
從零開始學CV之一激活函數(shù)篇(Activation Function)
-
Sigmoid 函數(shù) (
torch.nn.Sigmoid
):一種典型的壓縮型激活函數(shù)匈睁,將輸入值壓縮到 0 到 1 的范圍內(nèi)监透。它在神經(jīng)網(wǎng)絡中廣泛使用,特別是在二分類問題中航唆。
-
Tanh 函數(shù) (
torch.nn.Tanh
):Tanh 函數(shù)在輸入值較大或較小的情況下胀蛮,輸出值趨向于 1 或 -1,且在輸入接近 0 時具有更大的斜率佛点。因此醇滥,Tanh 函數(shù)比 Sigmoid 函數(shù)更適合在神經(jīng)網(wǎng)絡中作為激活函數(shù)使用,尤其在對稱性問題上有較好的表現(xiàn)超营,在 RNN 中也有廣泛應用鸳玩。
-
ReLU 函數(shù) (
torch.nn.ReLU
):一種常用的激活函數(shù),它在輸入值大于 0 時返回該值本身演闭,否則返回 0不跟。相對于 Sigmoid 和 Tanh 函數(shù),ReLU 函數(shù)具有更好的性能和計算速度米碰,也更容易學習窝革。ReLU 函數(shù)的一個變種是 LeakyReLU 函數(shù)购城。
-
Softmax 函數(shù) (
torch.nn.Softmax
):一種常用的激活函數(shù),根據(jù)輸入的 logits 在多個類別之間進行歸一化虐译,從而得到分類結果瘪板。它通常用于分類問題中,輸出結果是每個類別的概率分布漆诽。
-
ELU 函數(shù) (
torch.nn.ELU
):一種平滑的激活函數(shù)侮攀,可以防止梯度消失和過擬合問題。它在輸入值小于 0 的情況下也有非零輸出厢拭,具有類似于 ReLU 函數(shù)的優(yōu)點兰英。相對于 ReLU 函數(shù),ELU 函數(shù)可以使訓練速度更快供鸠,同時也有更好的準確性畦贸。
-
SELU 函數(shù) (
torch.nn.SiLU
):由谷歌提出的一種新型激活函數(shù),它可以優(yōu)化深度神經(jīng)網(wǎng)絡的性能楞捂,尤其是在圖像分類和自然語言處理領域薄坏。Swish 函數(shù)與 Sigmoid 函數(shù)類似,但它在輸入值較大時還是具有非零輸出泡一,可以增強激活函數(shù)的非線性性颤殴。
3.池化層 Pooling Layer
池化窗口從輸入數(shù)組的最左上方開始觅廓,按從左往右鼻忠、從上往下的順序,依次在輸入數(shù)組上滑動杈绸。當池化窗口滑動到某一位置時帖蔓,窗口中的輸入子數(shù)組的最大值/平均值即輸出數(shù)組中相應位置的元素。
池化層是通過下采樣瞳脓,通過去掉Feature Map中不重要的樣本塑娇,從而對輸入的特征圖進行壓縮。
池化層往往在卷積層后面劫侧,通過池化來降低卷積層輸出的特征向量埋酬,同時改善結果(不易出現(xiàn)過擬合)。
池化層的作用:
特征不變性:池化操作就是圖像的resize烧栋,圖像壓縮時去掉的信息只是一些無關緊要的信息写妥,而留下的信息則是具有尺度不變性的特征,是最能表達圖像的特征审姓。
特征降維珍特,一幅圖像含有的信息是很大的,特征也很多魔吐,但是有些信息對于我們做圖像任務時沒有太多用途或者有重復扎筒,可以把這類冗余信息去除莱找,把最重要的特征抽取出來,這也是池化操作的一大作用嗜桌。
在一定程度上防止過擬合奥溺,更方便優(yōu)化。
池化方法:
最大池化:找到池化窗口中最大的數(shù)作為輸出值骨宠。
平均池化:池化窗口中的平均值作為輸出值谚赎。
1)常用池化層算子
-
Max Pooling (
torch.nn.MaxPool2d
):池化層中最常用的一種算子,它通過選取輸入張量中每個大小為 kernel_size 的滑動窗口中的最大值诱篷,來減小輸入特征圖的尺寸壶唤。Max Pooling 的主要作用是提取特征并減小計算量,同時也有一定抗噪能力棕所。
-
Average Pooling (
torch.nn.AvgPool2d
):在給定滑動窗口大小的情況下闸盔,將窗口中所有像素的平均值作為當前像素的池化值。與 Max Pooling 相比琳省,Average Pooling 能夠更為平滑和穩(wěn)定地減小特征圖的尺寸迎吵。
-
Global Average Pooling (
torch.nn.AdaptiveAvgPool2d
):對整個特征圖進行操作,將每個通道的所有像素取平均值作為最終的輸出特征针贬。與常規(guī)平均池化不同击费,Global Average Pooling 的池化窗口大小動態(tài)適應于輸入特征圖的大小,因此可以更加有效地提取整個特征圖的有效信息桦他,而不是只關注其中的部分信息蔫巩。
-
Max Unpooling (
torch.nn.MaxUnpool2d
):Max Pooling 的逆運算,可以根據(jù)池化之前的位置和最大值快压,重新生成較高分辨率的特征圖圆仔。由于 Max Pooling 在池化過程中丟失了輸入特征圖的某些信息,Max Unpooling 可以幫助模型逆轉(zhuǎn)這些操作蔫劣。
2)輸出維度計算
計算公式同valid卷積
輸出寬度 = (輸入寬度?池化核寬度 +2?填充寬度) / 步長 + 1
輸出高度 = (輸入高度?池化核高度 +2?填充高度) / 步長 + 1
輸出通道數(shù) = 卷積/池化核數(shù)量
4.歸一化層 BN Layer
論文閱讀筆記:看完也許能進一步了解Batch Normalization
Batch Normalization(簡稱BN)就是對每一批數(shù)據(jù)進行歸一化坪郭。
-
歸一化層作用:防止梯度爆炸和梯度消失。
防止梯度消失:根據(jù)鏈式法則脉幢,如果每一層神經(jīng)元對上一層的輸出的偏導乘上權重結果都小于1的話歪沃,那么即使這個結果是0.99,在經(jīng)過足夠多層傳播之后嫌松,誤差對輸入層的偏導會趨于0沪曙。
防止梯度爆炸:同理,根據(jù)鏈式法則豆瘫,如果每一層神經(jīng)元對上一層的輸出的偏導乘上權重結果都大于1的話珊蟀,在經(jīng)過足夠多層傳播之后,誤差對輸入層的偏導會趨于無窮大。
備注:采用ReLU激活函數(shù)也會有效的解決梯度消失的情況育灸。
1)常用歸一化層算子
-
Batch Normalization (
torch.nn.BatchNorm2d
):在深度學習模型中廣泛使用的一種歸一化技術腻窒,它通過對每個 mini-batch 中的數(shù)據(jù)進行標準化,來減少訓練過程中的內(nèi)部協(xié)變量轉(zhuǎn)移問題磅崭。
主要作用是加速訓練過程儿子,同時可以防止梯度消失,提高模型的穩(wěn)定性砸喻。在使用 BN 時柔逼,通常要注意輸入數(shù)據(jù)維度與 Batch Normalization 層的通道數(shù)對應。
-
Instance Normalization (
torch.nn.InstanceNorm2d
):在每個樣本上執(zhí)行標準化割岛,而不是在每個 mini-batch 上執(zhí)行標準化的技術愉适,它通常用于風格遷移等圖像合成問題中。Instance Normalization 不會引入 mini-batch 內(nèi)的變化癣漆,并且適用于較小的 mini-batch维咸。
-
Layer Normalization (
torch.nn.LayerNorm
):在整個層的單個樣本上執(zhí)行標準化,而不是在樣本間執(zhí)行標準化的技術惠爽,它可以消除不同樣本間特征的依賴關系癌蓖。Layer Normalization 在適用于 RNNs 和序列數(shù)據(jù)處理等問題時,效果更好婚肆。
5.全連接層 Linear Layer
全連接層的輸入是一個向量租副,每個神經(jīng)元都與上一層的每個神經(jīng)元相連接,每個連接都帶有一個可學習的權重參數(shù)较性。全連接的核心操作就是矩陣向量乘積y=Wx用僧。
-
全連接層的作用:通過特征提取,實現(xiàn)分類或回歸两残。
對于分類問題永毅,全連接層的輸出通常選用Softmax函數(shù)作為輸出。只要全連接層的某個輸出節(jié)點的輸出值大于某閾值人弓,則認為目前的樣本屬于該輸出節(jié)點對應的類。
對于回歸問題着逐,全連接層的輸出通常選用Sigmoid函數(shù)作為輸出崔赌。
-
全連接神經(jīng)網(wǎng)絡的缺點
參數(shù)數(shù)量太多 考慮一個輸入10001000像素的圖片,輸入層有10001000=100萬節(jié)點耸别。假設第一個隱藏層有100個節(jié)點健芭,那么僅這一層就有(10001000+1)100=1億參數(shù)。
沒有利用像素之間的位置信息 對于圖像識別任務來說秀姐,每個像素和其周圍像素的聯(lián)系是比較緊密的慈迈,和離得很遠的像素的聯(lián)系可能就很小了。如果一個神經(jīng)元和上一層所有神經(jīng)元相連,那么就相當于對于一個像素來說痒留,把圖像的所有像素都等同看待谴麦,這不符合前面的假設。當我們完成每個連接權重的學習之后伸头,最終可能會發(fā)現(xiàn)匾效,有大量的權重,它們的值都是很小的(也就是這些連接其實無關緊要)恤磷。努力學習大量并不重要的權重面哼,這樣的學習必將是非常低效的。
網(wǎng)絡層數(shù)限制 我們知道網(wǎng)絡層數(shù)越多其表達能力越強扫步,但是通過梯度下降方法訓練深度全連接神經(jīng)網(wǎng)絡很困難魔策,因為全連接神經(jīng)網(wǎng)絡的梯度很難傳遞超過3層。因此河胎,我們不可能得到一個很深的全連接神經(jīng)網(wǎng)絡代乃,也就限制了它的能力。
1)常用全連接層算子
-
torch.nn.Linear
深度學習模型中常用的一種結構仿粹,可以用于實現(xiàn)分類搁吓、回歸等任務】岳可以通過適當?shù)脑O置輸入特征的數(shù)量和輸出特征的數(shù)量堕仔,來滿足不同的需求。主要參數(shù)如下:
in_features
:輸入特征的數(shù)量晌区。out_features
:輸出特征的數(shù)量摩骨。bias
:是否添加偏置項。transpose
:是否對權重矩陣進行轉(zhuǎn)置朗若。device
:指定運行的設備恼五。
6.特征圖升維
通過卷積和池化等技術可以將圖像進行降維,相反哭懈,有時也需要成恢復原分辨率大小的圖像灾馒,特別是在語義分割領域應用很成熟。
1)上池化(UnPooling)
UnPooling是max pooling的逆操作遣总,將在Maxpooling時保留最大值的位置信息擴充Feature Map睬罗,除最大值位置以外,其余補0旭斥。
2)上采樣(UNSampling)
上采樣指的是任何可以讓圖像變成更高分辨率的技術容达。最簡單的方式是重采樣和插值:將輸入圖片進行rescale到一個想要的尺寸,而且計算每個點的像素點垂券。
-
插值:利用已知的點來“猜”未知的點花盐,由原圖像矩陣中的點計算新圖像矩陣中的點并插入,不同的計算過程就是不同的插值算法。
-
最近鄰法(Nearest Interpolation):直接找到原圖像中對應的點算芯,將數(shù)值賦值給新圖像矩陣中的點柒昏。計算速度最快,但是效果最差也祠。
-
雙線性插值(Bilinear Interpolation):雙線性插值是用原圖像中最近的4(2*2)個點計算新圖像中1個點昙楚。
雙三次插值(Bicubic interpolation):雙三次插值是用原圖像中最近的16(4*4)個點計算新圖像中1個點,效果比較好诈嘿,但是計算代價過大堪旧。
-
UnSampling沒有使用MaxPooling時的位置信息,而是直接將內(nèi)容復制來擴充Feature Map奖亚。
在FCN淳梦、U-net等網(wǎng)絡結構中,涉及到了上采樣昔字。
3)反卷積(Deconvolution)
反卷積又稱作轉(zhuǎn)置卷積爆袍,是卷積的逆過程。最大的區(qū)別在于反卷積過程是有參數(shù)要進行學習的作郭,理論是反卷積可以實現(xiàn)UnPooling和unSampling陨囊。
7.其他
1)常用數(shù)學算子(Math Op)
abs、add夹攒、cos蜘醋、ceil、cum咏尝、sum压语、div、exp编检、floor胎食、log、mean允懂、mul厕怜、max、maximum累驮、min酣倾、minimum、round谤专、prod、pow午绳、rsqrt置侍、rsub、sin、sqrt蜡坊、sub杠输、sum、tan
2)邏輯算子(Logical Op)
bitwise_not秕衙、bitwise_xor蠢甲、eq、gt据忘、ge鹦牛、le、lt勇吊、logical_not曼追、logical_xor、ne汉规、where
3)張量算子(Tensor OP)
cat礼殊、chunk、clone针史、expand晶伦、expand_as、flatten啄枕、flip婚陪、permute、repeat射亏、reshape近忙、slice、split智润、squeeze及舍、stack、tile窟绷、transpose锯玛、unsqueeze、view兼蜈、t
8.參數(shù)量計算
卷積神經(jīng)網(wǎng)絡CNN中的參數(shù)量(parameters)和計算量(FLOPs)
參數(shù)量就是指攘残,模型所有帶參數(shù)的層的權重參數(shù)總量。帶參數(shù)的層主要有:卷積層为狸、BN層歼郭、全連接層等。
- 池化層辐棒、激活層病曾、上采樣層無需學習參數(shù)牍蜂,只是提供了一種非線性的變換,其參數(shù)量為0泰涂。
1)卷積層
計算公式:參數(shù)量 = (filterSize × depthIn + bias) × filterNum
filterSize:kh*kw 是卷積核的大小
depthIn:輸入層特征深度鲫竞,也是輸入通道數(shù)。
bias:是否使用偏置項逼蒙,使用時為1从绘,否則為0
filterNum:該層卷積核個數(shù),也就是輸出特征圖的深度是牢。
2)BN層
BN層有兩個需要學習的參數(shù)僵井,縮放系數(shù)γ和平移系數(shù)β(類似減均值除方差)。
計算公式:參數(shù)量 = 2 x depthIn
備注:在預測階段妖泄,通常只有一個樣本驹沿,那么BN層中的均值和方差都是固定的,那就需要用到訓練時的均值和方差通過移動平均而得到蹈胡。
3)全連接層
全連接層中的每個神經(jīng)元與其前一層的所有神經(jīng)元進行全連接渊季。
因此,計算公式:參數(shù)量 = (Ti + bias) × To
Ti:輸入向量的長度(輸入神經(jīng)元數(shù)量)
To:輸出向量的長度(輸出神經(jīng)元數(shù)量)
bias:是否使用偏置項罚渐,使用時為1却汉,否則為0
備注:在進行tensorrt模型轉(zhuǎn)換的時候,由于部分算子進行融合荷并,因此總的參數(shù)量降低合砂,而顯存占用也因此減少。