卷積神經(jīng)網(wǎng)絡(luò)
1 CNN卷積層


卷積操作
卷積核Kernal與Input矩陣執(zhí)行卷積操作,每次卷積的值組成了一個新的矩陣。卷積的操作是Kernal的值和每個對應(yīng)的Input中的值進行乘積求和。
卷積步長
卷積步長指的是Kernal在Input中每次移動的距離是多少,該動態(tài)圖中顯示的是每次移動一步。
Padding
通過填充0使得卷積后的結(jié)果大小仍然和原來的矩陣大小一致。
2 CNN池化層

池化層就是對原有的矩陣數(shù)據(jù)進行壓縮的操作,假如是2x2的池化,那么就將子矩陣的每2x2個元素變成一個元素,如果是3x3的池化,那么就將子矩陣的每3x3個元素變成一個元素,這樣輸入矩陣的維度就變小了。如圖所示是最大池化的操作,將2*2的矩陣中最大的元素作為新矩陣的元素,實現(xiàn)矩陣的維度降低。
損失函數(shù)
個人理解神經(jīng)網(wǎng)絡(luò)是通過非線性的映射將輸入空間映射到輸出空間。輸出結(jié)果的好壞使用損失函數(shù)進行評定,損失函數(shù)衡量的是預(yù)測的結(jié)果和實際的結(jié)果之間的差距,通過利用差距使用優(yōu)化算法更新神經(jīng)網(wǎng)絡(luò)中的權(quán)重進而實現(xiàn)降低損失函數(shù)的作用。
tensorflow函數(shù)參數(shù)詳解
tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
input : 輸入的要做卷積的圖片,要求為一個張量,shape為 [ batch, in_height, in_weight, in_channel ],其中batch為圖片的數(shù)量,in_height 為圖片高度,in_weight 為圖片寬度,in_channel 為圖片的通道數(shù),灰度圖該值為1,彩色圖為3。
filter: 卷積核,要求也是一個張量,shape為 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 為卷積核高度,filter_weight 為卷積核寬度,in_channel 是圖像通道數(shù) ,和 input 的 in_channel 要保持一致,out_channel 是卷積核數(shù)量。
strides: 卷積時在圖像每一維的步長,這是一個一維的向量,[ 1, strides, strides, 1],第一位和最后一位固定必須是1
padding: string類型,值為“SAME” 和 “VALID”,表示的是卷積的形式,是否考慮邊界。"SAME"是考慮邊界,不足的時候用0去填充周圍,"VALID"則不考慮
use_cudnn_on_gpu: bool類型,是否使用cudnn加速,默認為true
tf.nn.max_pool(value, ksize, strides, padding, name=None)
參數(shù)是四個,和卷積很類似:
value:需要池化的輸入,一般池化層接在卷積層后面,所以輸入通常是feature map,依然是[batch, height, width, channels]這樣的shape
ksize:池化窗口的大小,取一個四維向量,一般是[1, height, width, 1],因為我們不想在batch和channels上做池化,所以這兩個維度設(shè)為了1
strides:和卷積類似,窗口在每一個維度上滑動的步長,一般也是[1, stride,stride, 1]
padding:和卷積類似,可以取'VALID' 或者'SAME'
返回一個Tensor,類型不變,shape仍然是[batch, height, width, channels]這種形式
總結(jié):f(WX+b) = y CNN卷積神經(jīng)網(wǎng)絡(luò)可以認為是一種映射關(guān)系,將輸入的數(shù)據(jù)X通過映射函數(shù)f獲取結(jié)果y,W是映射的過程中使用的權(quán)重,在CNN網(wǎng)絡(luò)中相當于Kernal和網(wǎng)絡(luò)層之間連接的權(quán)重值。預(yù)測的y值與實際的y值之間有偏差,使用損失函數(shù)衡量這些偏差,為減小損失函數(shù)提高精確度,使用優(yōu)化算法去調(diào)整網(wǎng)絡(luò)中的權(quán)重W來降低損失函數(shù)。