深度学习 卷积层与全连接层权重参数个数的计算
1、卷積網(wǎng)絡(luò)實例分析
構(gòu)建卷積網(wǎng)絡(luò)如下:
from tensorflow.python.keras import datasets, models, layers class CNN(object):def __init__(self):model = models.Sequential()# 第1層卷積,卷積核大小為3*3,32個卷積核,28*28為待訓練圖片的大小model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))# 池化層model.add(layers.MaxPooling2D(2, 2))# 第2層卷積,卷積核大小為3*3,64個卷積核model.add(layers.Conv2D(64, (3, 3), activation='relu'))# 池化層model.add(layers.MaxPooling2D(2, 2))# 第3層卷積,卷積核大小為3*3,128個卷積核model.add(layers.Conv2D(128, (3, 3), activation='relu'))# 池化層model.add(layers.MaxPooling2D(2, 2))# 拉成1維形狀model.add(layers.Flatten())# 第4層全連接層,64個神經(jīng)元model.add(layers.Dense(64, activation='relu'))# 第5層全連接層 10個神經(jīng)元,softmax 多用于分類model.add(layers.Dense(10, activation='softmax'))model.summary()self.model = modelif __name__ == "__main__":CNN()輸出的網(wǎng)絡(luò)信息如下:
1 、卷積層參數(shù)個數(shù)計算方法:(卷積核高 * 卷積核寬 * 通道數(shù) + 1) * 卷積核個數(shù)
2 、當前全連接層參數(shù)個數(shù)計算方法: (上一層神經(jīng)元個數(shù) + 1) * 當前層神經(jīng)元個數(shù)
以上的1代表偏置,因為每個神經(jīng)元都有一個偏置
卷積層1: 320 = (3 * 3 * 1 +1) * 32
卷積層2: 18496 = (3 * 3 * 32 +1) * 64
卷積層3: 73856 = (3 * 3 * 64 +1) * 128
全連接層1: 8256 = (128 + 1) * 64
全連接層2: 650 = (64 + 1) * 10
2、各層參數(shù)和鏈接數(shù)計算
舉例:
? ? ? 下面以最經(jīng)典的LeNet-5例子來逐層分析各層的參數(shù)及連接個數(shù)。? ?
圖2
C1層(卷積層):是一個卷積層,由6個特征圖Feature Map構(gòu)成。特征圖中每個神經(jīng)元與5*5的鄰域(濾波器)相連。
1. 特征圖大小:特征圖的大小28*28,這樣能防止輸入的連接掉到邊界之外(32-5+1=28)。
feature map邊長大小的具體計算參見:http://blog.csdn.net/qq_15192373/article/details/78393520
2. 參數(shù)個數(shù):C1有156個可訓練參數(shù) (每個濾波器5*5=25個unit參數(shù)和一個bias參數(shù),一共6個濾波器,共(5*5+1)*6=156個參數(shù))
3. 鏈接個數(shù)/FLOPS個數(shù)::(5*5+1)*6?*(28*28)=122,304個。左邊是濾波器在輸入層滑過的神經(jīng)元個數(shù),右邊是C1層每個feature map的神經(jīng)元個數(shù),左右對應(yīng)關(guān)系是1對28*28,相乘即為連接數(shù)。(每個鏈接對應(yīng)1次計算,由wa+b可知,每個參數(shù)參與1次計算,所以1個單位的偏置b也算進去)
----------------------------------------
S2層(下采樣層):是一個下采樣層,有6個14*14的特征圖。特征圖中的每個單元與C1中相對應(yīng)特征圖的2*2鄰域相連接。
1. 特征圖大小:每個單元的2*2感受野并不重疊,因此S2中每個特征圖的大小是C1中特征圖大小的1/4(行和列各1/2)
2. 參數(shù)個數(shù):S2層有 12個?(6*(1+1)=12) 可訓練參數(shù)。S2層?每個濾波器路過的4個鄰域?的4個輸入相加,乘以1個可訓練參數(shù)w,再加上1個可訓練偏置b(即一個濾波器對應(yīng)兩個參數(shù))。(對于子采樣層,每一個特征映射圖的的可變參數(shù)需要考慮你使用的采樣方式而定,如文中的采樣方式,每一個特征映射圖的可變參數(shù)數(shù)量為2個,有的采樣方式不需要參數(shù))
3. 鏈接個數(shù)/FLOPS個數(shù):5880個連接,(?(2*2+1)*6 *14*14=5880)?。左邊是濾波器在C1層滑過的神經(jīng)元個數(shù),右邊是S2層每個feature map的神經(jīng)元個數(shù),相乘即為連接數(shù)。
----------------------------------------
C3層(卷積層):是一個卷積層,它同樣通過5x5的卷積核去卷積層S2,然后得到的特征map就只有10x10個神經(jīng)元,但是它有16種不同的卷積核,所以就存在16個特征map了。
1. 特征圖大小:C3中每個特征圖由S2中所有6個或者幾個特征map組合(幾個濾波器計算的神經(jīng)元的值 相加 合并成一個神經(jīng)元)而成。
為什么不把S2中的每個特征圖連接到每個C3的特征圖呢?原因有2點。
第1,不完全的連接機制將連接的數(shù)量保持在合理的范圍內(nèi)。
第2,也是最重要的,其破壞了網(wǎng)絡(luò)的對稱性。由于不同的特征圖有不同的輸入,所以迫使他們抽取不同的特征(希望是互補的)。(14-5+1=10)
2. 參數(shù)個數(shù):例如,存在的一個方式是:
C3的前6個特征圖:相當于需要6組濾波器,每組以S2中 3個相鄰?特征圖子集 為輸入,共享一個偏置。(C3每個特征圖 由 S2中3個特征圖分別用不同濾波器 再加和得到)
C3的接下來6個特征圖:相當于需要6組濾波器,每組以S2中 4個相鄰?特征圖子集 為輸入,共享一個偏置。(1對4)
C3的接下來3個特征圖:相當于需要3組濾波器,每組以S2中?4個不相鄰?特征圖子集 為輸入,共享一個偏置。(1對4)
C3的最后1個特征圖:相當于需要1組濾波器,每組將S2中所有?特征圖 為輸入,共享一個偏置。(1對6)
? ? 這樣C3層有1516個可訓練參數(shù)。計算:6*(3*25+1)+6*(4*25+1)+3*(4*25+1)+(25*6+1)=1516。此處,C3個特征圖由 S2中n個卷積結(jié)果合并,然后共享1個b,組合計算得到。
3.?鏈接個數(shù)/FLOPS個數(shù):1516*?10*10=151600個連接。左邊是濾波器滑過的S2層神經(jīng)元個數(shù),右邊是C3層特征圖大小。
------------------------------------------
S4層(下采樣層):是一個下采樣層,由16個5*5大小的特征圖構(gòu)成。特征圖中的每個單元與C3中相應(yīng)特征圖的2*2鄰域相連接,跟C1和S2之間的連接一樣。
1. 特征圖大小:5*5大小。每個單元的2*2感受野并不重疊,因此S2中每個特征圖的大小是C1中特征圖大小的1/4(行和列各1/2)
2. 參數(shù)個數(shù):S4層有32個可訓練參數(shù)。(每個特征圖1個因子w和1個偏置b,16*(1+1)=32)
3.?鏈接個數(shù)/FLOPS個數(shù):16* (2*2+1) *5*5=2000個連接。左邊是濾波器在C3層滑過的神經(jīng)元個數(shù),右邊是S4層神經(jīng)元個數(shù),相乘即為連接數(shù)。
--------------------------------------------
C5層(卷積層或第一個全連接層):是一個卷積層,有120個特征圖(或者說神經(jīng)元)。每個單元與S4層的全部16個單元的5*5鄰域(與S4層特征圖一樣大)相連。(120組濾波器, 每組16個濾波器,分別與 S4層16個特征圖 進行卷積, 每組得到C5層的一個神經(jīng)元/特征圖)
1. 特征圖大小:由于S4層特征圖的大小也為5*5(同濾波器一樣),故C5特征圖的大小為1*1。(5-5+1=1), 這構(gòu)成了S4和C5之間的全連接。之所以仍將C5標示為卷積層而非全相聯(lián)層,是因為如果LeNet-5的輸入變大,而其他的保持不變,那么此時特征圖的維數(shù)就會比1*1大。
2. 參數(shù)個數(shù):120* (16*5*5+1)=48120個。濾波器個數(shù)120*16個,所以w有120*16*5*5個,同組16個濾波器共用一個b,所以有120個b。
3.?鏈接個數(shù)/FLOPS個數(shù):48120*1*1,?左邊是濾波器滑過的神經(jīng)元個數(shù),右邊是C5層特征圖大小(其實現(xiàn)在已經(jīng)變成了單個神經(jīng)元,大小1*1),相乘即為連接數(shù),此處也即FLOPS個數(shù)。
--------------------------------------------
F6層(全連接層):雖然是全連接層,得到F6層每個神經(jīng)元 由?每組120個1*1的濾波器對C5層卷積,一共84組濾波器,得到84個神經(jīng)元。
1. 特征圖大小:有84個單元(之所以選這個數(shù)字的原因來自于輸出層的設(shè)計),與C5層全相連。
2. 參數(shù)個數(shù):有 84* (120*(1*1)+1)=10164 個可訓練參數(shù)。如同經(jīng)典神經(jīng)網(wǎng)絡(luò),F6層計算輸入向量(120)和權(quán)重向量(1*1)之間的點積,再加上一個偏置(+1)。然后將其傳遞給sigmoid函數(shù)產(chǎn)生單元i的一個狀態(tài)。
3.?鏈接個數(shù)/FLOPS個數(shù):10164* 1*1,左邊是濾波器在C5層滑過的神經(jīng)元個數(shù),右邊是F6層特征圖大小。1個鏈接對應(yīng)1次計算。
--------------------------------------------
輸出層:由歐式徑向基函數(shù)(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。
--------------------------------------------
3、卷積和下采樣說明
圖3 卷積和子采樣過程
卷積過程包括:用一個可訓練的濾波器fx去卷積一個輸入的圖像(第一階段是輸入的圖像,后面的階段就是卷積特征map了),然后加一個偏置bx,得到卷積層Cx。
子采樣過程包括:每鄰域四個像素求和變?yōu)橐粋€像素,然后通過標量Wx+1加權(quán),再增加偏置bx+1,然后通過一個sigmoid激活函數(shù),產(chǎn)生一個大概縮小四倍的特征映射圖Sx+1。
總結(jié)
以上是生活随笔為你收集整理的深度学习 卷积层与全连接层权重参数个数的计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab 训练深度学习模型函数 tr
- 下一篇: tensorflow: Could no