Flattening:類型為:Flatten
基於某個axis進行偏平的意思,如 axis = 1 ,fattens an input of shape n * c * h * w to a simple vector output of shape n * (c*h*w))
Reshape:(重新調整維度),類型為:Reshape
在不改變數據的情況下,改變輸入的維度
layer { name: "reshape" type: "Reshape" bottom: "input" top: "output" reshape_param { shape { dim: 0 # copy the dimension from below dim: 2 dim: 3 dim: -1 # infer it from the other dimensions } } }
有一個可選的參數組shape,用於指定blob數據的各維的值(bolb是一個四維的數據:n*c*w*h)。
dim:0 表示維度不變,即輸入和輸出是相同的維度。
dim:2 或 dim:3 將原來的維度變成2或3
dim:-1 表示由系統自動計算維度。數據的總量不變,系統會根據blob數據的其它三維來自動計算當前維的維度值 。
假設原數據為:64*3*28*28, 表示64張3通道的28*28的彩色圖片
經過reshape變換:
reshape_param {
shape {
dim: 0
dim: 0
dim: 14
dim: -1
}
}
輸出數據為:64*3*14*56,系統自己算的。blob里面的數據量不變,知道三個維度,另外一個就知道了
Cocatenation(把多個輸入可以串聯起來):類型為:Concat
在某個維度,將輸入的layer組合起來,是slice的逆過程
Slicing(可以對輸入進行切片)類型為:Slice
Slice layer 的作用是將bottom按照需要分解成多個tops。(與split layer的不一樣在於spliit的作用是將bottom復制多份,輸出到tops)
首先我們先看一下slice layer 在prototxt里面的書寫
layer { name: "slice" type: "Slice" bottom: "input" top: "output1" top: "output2" top: "output3" top: "output4" slice_param { axis: 1 slice_point: 1 slice_point: 3 slice_point: 4 } }
這里假設input的維度是N*5*H*W,tops輸出的維度分別為N*1*H*W N*2*H*WN*1*H*WN*1*H*W 。
這里需要注意的是,如果有slice_point,slice_point的個數一定要等於top的個數減一。
axis表示要進行分解的維度。
slice_point的作用是將axis按照slic_point 進行分解。
slice_point沒有設置的時候則對axis進行均勻分解。
Elementwise Operations(類型為Eltwise), Argmax(類型為ArgMax), Softmax(類型為Softmax),
Mean-Variance Normalization(類型為MVN)
Dropout(防止過擬合的trick):類型為Dropout
可以隨機讓網絡某些隱含層節點的權重不工作
layer { name: "drop7" type: "Dropout" bottom: "fc7-conv" top: "fc7-conv" dropout_param { dropout_ratio: 0.5 } }layer { name: "drop7" type: "Dropout" bottom: "fc7-conv" top: "fc7-conv" dropout_param { dropout_ratio: 0.5 } }
只需要設置一個dropout_ratio就可以了。
Pooling
1. 一般池化(General Pooling)
池化作用於圖像中不重合的區域(這與卷積操作不同),我們定義池化窗口的大小為sizeX,即下圖中紅色正方形的邊長,定義兩個相鄰池化窗口的水平位移/豎直位移為stride。一般池化由於每一池化窗口都是不重復的,所以sizeX=stride,最常見的池化操作為平均池化mean pooling和最大池化max pooling:
平均池化:計算圖像區域的平均值作為該區域池化后的值。
最大池化:選圖像區域的最大值作為該區域池化后的值。參考圖[2]。
2,重疊池化(OverlappingPooling)
重疊池化正如其名字所說的,相鄰池化窗口之間會有重疊區域,此時sizeX>stride。
論文中,作者使用了重疊池化,其他的設置都不變的情況下, top-1和top-5 的錯誤率分別減少了0.4% 和0.3%。[“Imagenet classification with deep convolutional neural networks,”in NIPS,2012]。
3. 空金字塔池化(Spatial Pyramid Pooling)
空間金字塔池化可以把任何尺度的圖像的卷積特征轉化成相同維度,這不僅可以讓CNN處理任意尺度的圖像,還能避免cropping和warping操作,導致一些信息的丟失,具有非常重要的意義。
一般的CNN都需要輸入圖像的大小是固定的,這是因為全連接層的輸入需要固定輸入維度,但在卷積操作是沒有對圖像尺度有限制,所有作者提出了空間金字塔池化,先讓圖像進行卷積操作,然后轉化成維度相同的特征輸入到全連接層,這個可以把CNN擴展到任意大小的圖像。
空間金字塔池化的思想來自於Spatial Pyramid Model,它一個pooling變成了多個scale的pooling。用不同大小池化窗口作用於卷積特征,我們可以得到1X1,2X2,4X4的池化結果,由於conv5中共有256個過濾器,所以得到1個256維的特征,4個256個特征,以及16個256維的特征,然后把這21個256維特征鏈接起來輸入全連接層,通過這種方式把不同大小的圖像轉化成相同維度的特征,后面通常接FC。
對於不同的圖像要得到相同大小的pooling結果,就需要根據圖像的大小動態的計算池化窗口的大小和步長。假設conv5輸出的大小為a*a,需要得到n*n大小的池化結果,可以讓窗口大小sizeX為
,步長為
。具體示意圖參考博客[2]
SPP其實就是一種多個scale的pooling,可以獲取圖像中的多尺度信息;在CNN中加入SPP后,可以讓CNN處理任意大小的輸入,這讓模型變得更加的flexible。
參考Kaiming He:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,2014
4,Global average Pooling
global average pooling 這個概念出自於 network in network ,主要是用來解決全連接的問題,其主要是是將最后一層的特征圖進行整張圖的一個均值池化,形成一個特征點,將這些特征點組成最后的特征向量進行softmax中進行計算。舉個例子:
假如,最后的一層的數據是10個6*6的特征圖,global average pooling是將每一張特征圖計算所有像素點的均值,輸出一個數據值,
這樣10 個特征圖就會輸出10個數據點,將這些數據點組成一個1*10的向量的話,就成為一個特征向量,就可以送入到softmax的分類中計算了。
原文中介紹這樣做主要是進行全連接的替換,減少參數的數量,這樣計算的話,global average pooling層是沒有數據參數的,這也與network in network 有關,其文章中提出了一種非線性的 類似卷積核的mlpconv的感知器的方法,計算圖像的分塊的值可以得到空間的效果,這樣就取代了pooling的作用,但是會引入一些參數,但是為了平衡,作者提出了使用global average pooling。
參考:
1,http://m.blog.csdn.net/m0_37407756/article/details/72235667
2,https://blog.csdn.net/mao_kun/article/details/50507376
3,https://blog.csdn.net/losteng/article/details/51520555
LED照明:依古齊尼(深圳)照明科技有限公司
13723451660 劉先生

