?
目錄
一、卷積層圖像輸出尺寸
?二、池化層圖像輸出尺寸
三、全連接層輸出尺寸
四、卷積層參數數量
五、全連接層參數數量
?六、代碼實現與驗證
?以LeNet5經典模型為例子并且通道數為1
LeNet5網絡有7層:
? 1.第1層:卷積層
? 輸入:原始的圖片像素矩陣(長度、寬度、通道數),大小為32×32×1;
? 參數:濾波器尺寸為5×5,深度為6,不使用全0填充,步長為1;
? 輸出:特征圖,大小為28×28×6。
? 分析:因為沒有使用全0填充,所以輸出尺寸 = 32 - 5 + 1 = 28,深度與濾波器深度一致,為6。
? 2.第2層:池化層
? 輸入:特征圖,大小為28×28×6;
? 參數:濾波器尺寸為2×2,步長為2;
? 輸出:特征圖,大小為14×14×6。
? 3.第3層:卷積層
? 輸入:特征圖,大小為14×14×6;
? 參數:濾波器尺寸為5×5,深度為16,不使用全0填充,步長為1;
? 輸出:特征圖,大小為10×10×16。
? 分析:因為沒有使用全0填充,所以輸出尺寸 = 14 - 5 + 1 = 10,深度與濾波器深度一致,為16。
? 4.第4層:池化層
? 輸入:特征圖,大小為10×10×16;
? 參數:濾波器尺寸為2×2,步長為2;
? 輸出:特征圖,大小為5×5×16。
? 5.第5層:全連接層
? 輸入節點個數:5×5×16 = 400;
? 參數個數:5×5×16×120+120 = 48120;
? 輸出節點個數:120。
? 6.第6層:全連接層
? 輸入節點個數:120;
? 參數個數:120×84+84 = 10164;
? 輸出節點個數:84。
? 7.第7層:全連接層
? 輸入節點個數:84;
? 參數個數:84×10+10 = 850;
? 輸出節點個數:10。
? 由于使用的是MNIST數據集,圖片大小是28×28×1的,1代表通道數,也就是灰度圖像,所以后面代碼實現是用28×28的并進行講解。
? 上面沒看懂沒關系,公式來了。
一、卷積層圖像輸出尺寸
? 定義如下:
? O = 輸出圖像的尺寸。
? I = 輸入圖像的尺寸。
? K = 卷積層的核尺寸
? N = 核數量
? S = 移動步長
? P = 填充數
??公式:
?
?
(數字0和字母O很像,請忽略掉這個小小問題)
? 示例:MNIST手寫數字圖片大小是28×28×1的,LeNet5第一層卷積核個數為5,故輸出圖像尺寸為:
?故輸出的圖像大小為:24×24×6. (一個卷積核對應一個通道)
?二、池化層圖像輸出尺寸
? 定義如下:
? O=輸出圖像的尺寸。
? I=輸入圖像的尺寸。
? S=移動步長
? PS=池化層尺寸
??公式:
? 示例:第一層的輸出為24×24×6,故輸出圖像尺寸為:
??
? 故輸出的圖像大小為:12×12×6. (池化層不改變通道個數)
三、全連接層輸出尺寸
??全連接層輸出向量長度等于神經元的數量。
四、卷積層參數數量
? 在CNN中,每層有兩種類型的參數:權重weights 和偏置項biases.總參數數量為所有weights和biases的總和.
? 定義如下:
? WC?= 卷積層的weights數量
? BC?= 卷積層的biases數量
? PC?= 所有參數的數量
? K = 核尺寸
? N = 核數量
? C = 輸入圖像通道數
? 卷積層中,核的深度等于輸入圖像的通道數.于是每個核有K*K個參數.并且有N個核.由此得出以下的公式:
? 示例:LeNet5第一層卷積層,卷積核大小為5*5,并且有6個,輸入圖像大小為28×28×1,即K = 5, C = 1, N = 6,故有:
? 所以第一層的總參數量為:156。
? 池化層不計算參數。
五、全連接層參數數量
? 在CNN中有兩種類型的全連接層。第1種是連接到最后1個卷積層,另外1種的FC層是連接到其他的FC層。兩種情況分開討論。
??①連接到最后一個卷積層:
? 定義如下:
? Wcf= weights的數量
? Bcf= biases的數量
? O= 前卷積層的輸出圖像的尺寸
? N = 前卷積層的核數量
? F = 全連接層的神經元數量
? 公式:
?
?
示例:以MNIST的28×28×1的輸入圖片為例,在LeNet5的第一個全連接層中,前面一層的輸出圖像大小為:4×4×16,該全連接層有120個神經元,即 O = 4, N = 16 , F = 120,故有:
?
所以該層總共有30840個參數。
??②連接到上一個全連接層:
? 定義如下:
? Wff= weights的數量
? Bff= biases的數量
? Pff= 總參數的數量
? F= 當前FC層的神經元數量
? F-1?= 前FC層的神經元數量
??公式:
示例:LeNet5中全連接層的第2層,前一個全連接層的神經元個數為F-1?= 120, 當前層的神經元個數為F = 84,則有:
?
?六、代碼實現與驗證
? 基于TensorFlow的代碼實現如下:
# LeNet5網絡模型
model = tf.keras.Sequential([# 第1層-卷積層 濾波器尺寸5*5,6個keras.layers.Conv2D(6,5),# 第2層-池化層,濾波器尺寸為2×2,步長為2keras.layers.MaxPooling2D(pool_size=2,strides=2),keras.layers.ReLU(),# 第3層-卷積層 濾波器尺寸5*5,16個keras.layers.Conv2D(16,5),# 第4層-池化層,濾波器尺寸為2×2,步長為2keras.layers.MaxPooling2D(pool_size=2,strides=2),keras.layers.ReLU(),keras.layers.Flatten(), # 拉平之后方便做全連接# 第5層-全連接層keras.layers.Dense(120,activation='relu'),# 第6層-全連接層keras.layers.Dense(84,activation='relu'),# 第7層-全連接層keras.layers.Dense(10,activation='softmax') # 最后輸出10類,0-9的數字
])
?運行代碼輸出:
?文獻參考:
- https://www.cnblogs.com/touch-skyer/p/9150039.html