一、卷積層
1、卷積層(Convolutional Layer)介紹
卷積神經網絡中每層卷積層由若干卷積單元(卷積核)組成,每個卷積單元的參數都是通過反向傳播算法最佳化得到的
卷積運算的目的是特征提取,第一層卷積層可能只能提取一些低級的特征,如邊緣、線條和角等層級,更多層的網絡能從低級特征中迭代提取更復雜的特征
2、卷積核(Filter)的四大要素
卷積核 - Filter - 過濾器 - 模型參數
(1)卷積核個數
(2)卷積核大小
(3)卷積核步長
(4)卷積核零填充大小
接下來我們通過計算案例講解,假設圖片是黑白圖片(只有一個通道)
3、卷積如何計算-大小
卷積核我們可以理解為一個觀察的人,帶著若干權重和一個偏置去觀察,進行特征加權運算
注:上述要加上偏置
輸入的圖像:5 * 5,filter是3 * 3 * 1,乘以1個通道1
步長:是1,一次移動1格
輸出:3 * 3 * 1
卷積核常用的大小:1 * 1,3 * 3,5 * 5
通常卷積核大小選擇這些大小,是經過研究人員實驗證明比較好的效果
觀察之后會得到一個運算結果,那么這個人想觀察所有這張圖的像素怎么辦?那就需要平移:
4、卷積如何計算-步長
需要去平移卷積核觀察這張圖片,需要的參數就是步長
假設移動的步長為一個像素,那么最終這個人觀察的結果以下圖為例:
5 * 5的圖片,3 * 3的卷積大小,一個步長運算得到3 * 3的大小觀察結果
如果移動的步長變成2,那么結果是這樣:
5 * 5的圖片,3 * 3的卷積大小,2個步長運算,得到2 * 2的大小觀察結果
5、卷積如何計算-卷積核個數
那么如果在某一層結構當中,不止是一個人觀察,多個人(卷積核)一起去觀察,那就得到多張觀察結果(盲人摸象?)
不同的卷積核帶的權重和偏執都不一樣,即隨機初始化的參數
我們已經得出輸出結果的大小由大小和步長決定的,但是只有這些嗎?
還有一個就是零填充。Filter觀察窗口的大小和移動步長有時會導致超過圖片像素寬度!
6、卷積如何計算-零填充大小
零填充就是在圖片像素外圍填充一圈值為0的像素
7、總結-輸出大小計算公式
如果已知輸入圖片形狀,卷積核數量,卷積核大小,以及移動步長,那么輸出圖片形狀如何確定?
通過一個例子來理解公式:
計算案例:
(1)假設已知條件:輸入圖像32*32*1,50個Filter,大小為5*5,移動步長為1,零填充大小為1。請求出輸出大小?
H1 = 32
W1 = 32
D1 = 1
K = 50
F = 5
S = 1
P = 1
H2 = (H1 - F + 2P) / S + 1 = (32-5+2*1)/1+1 = 30
W2 = (H1 - F + 2P) / S + 1 = (32-5+2*1)/1+1 = 30
D2 = K = 50
所以輸出大小為[30, 30, 30]
(2)假設已知條件:輸入圖像32*32*1,50個Filter,大小為3*3,移動步長為1,未知零填充,輸出大小32*32,求零填充大小?
H1 = 32
W1 = 32
D1 = 1
K = 50
F = 3
S = 1
P = ?
H2 = 32
H2 = (H1 - F + 2P) / S + 1 = (32-3+2*P)/1+1 = 32
W2 = (H1 - F + 2P) / S + 1 = (32-3+2*P)/1+1 = 32
所以零填充大小為:1 * 1
8、多通道圖片如何觀察
如果是一張彩色圖片,那么就有三種表分別為R,G,B。原本每個需要帶一個3*3或者其他大小的卷積核,現在需要帶3張3*3的權重和一個偏置,總共就27個權重。最終每個人還是得出一張結果:
輸入圖片:7 * 7 * 3
Filter:3 * 3 * 3 + bias,有2個filter
H1 = 5
D1 = 3
K = 2
F = 3
S = 2
P = 1
H2 = (5-3+2)/2+1 = 3
W2 = 和H2一樣 = 3
D2 = 2
輸出:3 * 3 * 2
9、卷積網絡API
tf.nn.conv2d(input, filter, strides=, padding=, name=None)
說明:
(1)計算給定4-D input和filter張量的2維卷積
(2)input:輸入圖像,給定的輸入張量,具有[batch, height, width, channel]四階的形狀,類型為float32,64
(3)filter:指定過濾器的權重數量,[filter_height, filter_width, in_channels, out_channels]
? ? filter_height:filter的高
? ? filter_width:filter的寬
? ? in_channels:輸入圖片的通道數
? ? out_channels:輸出圖片的通道數
(4)strides:需要傳一維數組,strides = [1, stride, stride, 1],步長
(5)padding:"SAME","VALID",具體解釋見下面
Tensorflow的零填充方式有兩種,SAME和VALID
(1)SAME:越過邊緣取樣,取樣的面積和輸入圖像的像素寬度一致
? ? 公式:ceil(H/S)
? ? H為輸入的圖片的高或者寬,S為步長
? ? 無論過濾器的大小是多少,零填充的數量由API自動計算
(2)VALID:不越過邊緣取樣,取樣的面積小于輸入人的圖像的像素寬度。不填充
在Tensorflow當中,卷積API設置"SAME"之后,如果步長為1,輸出高寬與輸入大小一樣(重要)
二、激活函數
1、sigmoid函數
隨著神經網絡的發展,大家發現原有的sigmoid等激活函數并不能達到好的效果,所以采取新的激活函數
2、ReLU函數