深度学习—池化、padding的理解
1、池化層的理解
pooling池化的作用則體現(xiàn)在降采樣:保留顯著特征、降低特征維度,增大kernel的感受野。另外一點(diǎn)值得注意:pooling也可以提供一些旋轉(zhuǎn)不變性。
  池化層可對(duì)提取到的特征信息進(jìn)行降維,一方面使特征圖變小,簡(jiǎn)化網(wǎng)絡(luò)計(jì)算復(fù)雜度并在一定程度上避免過(guò)擬合的出現(xiàn);一方面進(jìn)行特征壓縮,提取主要特征。
??最大池采樣在計(jì)算機(jī)視覺(jué)中的價(jià)值體現(xiàn)在兩個(gè)方面:(1)、它減小了來(lái)自上層隱藏層的計(jì)算復(fù)雜度;(2)、這些池化單元具有平移不變性,即使圖像有小的位移,提取到的特征依然會(huì)保持不變。由于增強(qiáng)了對(duì)位移的魯棒性,這樣可以忽略目標(biāo)的傾斜、旋轉(zhuǎn)之類(lèi)的相對(duì)位置的變化,以此提高精度,最大池采樣方法是一個(gè)高效的降低數(shù)據(jù)維度的采樣方法。
??需要注意的是:這里的pooling操作是特征圖縮小,有可能影響網(wǎng)絡(luò)的準(zhǔn)確度,因此可以通過(guò)增加特征圖的深度來(lái)彌補(bǔ)(這里的深度變?yōu)樵瓉?lái)的2倍)。
在CNN網(wǎng)絡(luò)中卷積池之后會(huì)跟上一個(gè)池化層,池化層的作用是提取局部均值與最大值,根據(jù)計(jì)算出來(lái)的值不一樣就分為均值池化層與最大值池化層,一般常見(jiàn)的多為最大值池化層。池化的時(shí)候同樣需要提供filter的大小、步長(zhǎng)。
  tf.nn.max_pool(value, ksize, strides, padding, name=None)
參數(shù)是四個(gè),和卷積很類(lèi)似:
  第一個(gè)參數(shù)value:需要池化的輸入,一般池化層接在卷積層后面,所以輸入通常是feature map,依然是[batch, height, width, channels]這樣的shape
  第二個(gè)參數(shù)ksize:池化窗口的大小,取一個(gè)四維向量,一般是[1, height, width, 1],因?yàn)槲覀儾幌朐?code>batch和channels上做池化,所以這兩個(gè)維度設(shè)為了1
  第三個(gè)參數(shù)strides:和卷積類(lèi)似,窗口在每一個(gè)維度上滑動(dòng)的步長(zhǎng),一般也是[1, stride,stride, 1]
第四個(gè)參數(shù)padding:和卷積類(lèi)似,可以取'VALID' 或者'SAME'
  返回一個(gè)Tensor,類(lèi)型不變,shape仍然是[batch, height, width, channels]這種形式
舉例:池化輸出特征圖計(jì)算和卷積計(jì)算公式相同,區(qū)別是池化是求卷積區(qū)域中的max,不涉及卷積計(jì)算。
(1)pooling(kernel size 2×2,padding 0,stride 2) 32*32*16->pooling之后(32-2+0)/2 + 1 =16*16
pool3 = tf.nn.max_pool(layer3,[1,2,2,1],[1,2,2,1],padding='SAME') // p = (f-1)/2=(2-1)/2=0,,所以padding='SAME'或“VALID”輸出一樣
(2)pooling(kernel size 3×3,padding 0,stride 1) 32*32*16->pooling之后(32-3+0)/1 + 1 = 30*30
pool3 = tf.nn.max_pool(layer3,[1,3,3,1],[1,1,1,1])
2、padding的理解
之前在討論卷積神經(jīng)網(wǎng)絡(luò)的時(shí)候,我們是使用filter來(lái)做元素乘法運(yùn)算來(lái)完成卷積運(yùn)算的。目的是為了完成探測(cè)垂直邊緣這種特征。但這樣做會(huì)帶來(lái)兩個(gè)問(wèn)題。
卷積運(yùn)算后,輸出圖片尺寸縮小;
越是邊緣的像素點(diǎn),對(duì)于輸出的影響越小,因?yàn)榫矸e運(yùn)算在移動(dòng)的時(shí)候到邊緣就結(jié)束了。中間的像素點(diǎn)有可能會(huì)參與多次計(jì)算,但是邊緣像素點(diǎn)可能只參與一次。所以我們的結(jié)果可能會(huì)丟失邊緣信息。
那么為了解決這個(gè)問(wèn)題,我們引入padding, 什么是padding呢,就是我們認(rèn)為的擴(kuò)充圖片, 在圖片外圍補(bǔ)充一些像素點(diǎn),把這些像素點(diǎn)初始化為0.
padding的用途:
(1)保持邊界信息,如果沒(méi)有加padding的話(huà),輸入圖片最邊緣的像素點(diǎn)信息只會(huì)被卷積核操作一次,但是圖像中間的像素點(diǎn)會(huì)被掃描到很多遍,那么就會(huì)在一定程度上降低邊界信息的參考程度,但是在加入padding之后,在實(shí)際處理過(guò)程中就會(huì)從新的邊界進(jìn)行操作,就從一定程度上解決了這個(gè)問(wèn)題。
(2)可以利用padding對(duì)輸入尺寸有差異圖片進(jìn)行補(bǔ)齊,使得輸入圖片尺寸一致。
(3)卷積神經(jīng)網(wǎng)絡(luò)的卷積層加入Padding,可以使得卷積層的輸入維度和輸出維度一致。
(4)卷積神經(jīng)網(wǎng)絡(luò)的池化層加入Padding,一般都是保持邊界信息和(1)所述一樣。
  padding模式:SAME和VALID
SAME:是填充,填充大小,p = (f-1)/2;VALID:是不填充,直接計(jì)算輸出。
總結(jié)
以上是生活随笔為你收集整理的深度学习—池化、padding的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 聊聊Unity项目管理的那些事:Git-
- 下一篇: Unity 2017 Game Opti
