1. 程式人生 > >Caffe傻瓜系列(4):其它常用層及引數

Caffe傻瓜系列(4):其它常用層及引數



本文講解一些其它的常用層,包括:softmax_loss層,Inner Product層,accuracy層,reshape層和dropout層及其它們的引數配置。

1、softmax-loss

softmax-loss層和softmax層計算大致是相同的。softmax是一個分類器,計算的是類別的概率(Likelihood),是Logistic Regression 的一種推廣。Logistic Regression 只能用於二分類,而softmax可以用於多分類。

softmax與softmax-loss的區別:

softmax計算公式:

而softmax-loss計算公式:

使用者可能最終目的就是得到各個類別的概率似然值,這個時候就只需要一個 Softmax層,而不一定要進行softmax-Loss 操作;或者是使用者有通過其他什麼方式已經得到了某種概率似然值,然後要做最大似然估計,此時則只需要後面的 softmax-Loss 而不需要前面的 Softmax 操作。因此提供兩個不同的 Layer 結構比只提供一個合在一起的 Softmax-Loss Layer 要靈活許多。

不管是softmax layer還是softmax-loss layer,都是沒有引數的,只是層型別不同而也

softmax-loss layer:輸出loss值

  1. layer {
  2. name: "loss"
  3. type: "SoftmaxWithLoss"
  4. bottom: "ip1"
  5. bottom: "label"
  6. top: "loss"
  7. }

softmax layer: 輸出似然值

  1. layers {
  2. bottom: "cls3_fc"
  3. top: "prob"
  4. name: "prob"
  5. type: “Softmax"
  6. }

2、Inner Product

全連線層,把輸入當作成一個向量,輸出也是一個簡單向量(把輸入資料blobs的width和height全變為1)。

輸入: n*c0*h*w

輸出: n*c1*1*1

全連線層實際上也是一種卷積層,只是它的卷積核大小和原資料大小一致。因此它的引數基本和卷積層的引數一樣。

層型別:InnerProduct

lr_mult: 學習率的係數,最終的學習率是這個數乘以solver.prototxt配置檔案中的base_lr。如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。

必須設定的引數:

    num_output: 過濾器(filfter)的個數

其它引數:

      weight_filler: 權值初始化。 預設為“constant”,值全為0,很多時候我們用”xavier”演算法來進行初始化,也可以設定為”gaussian”       bias_filler: 偏置項的初始化。一般設定為”constant”,值全為0。       bias_term: 是否開啟偏置項,預設為true, 開啟
  1. layer {
  2. name: “ip1”
  3. type: “InnerProduct”
  4. bottom: “pool2”
  5. top: “ip1”
  6. param {
  7. lr_mult: 1
  8. }
  9. param {
  10. lr_mult: 2
  11. }
  12. inner_product_param {
  13. num_output: 500
  14. weight_filler {
  15. type: “xavier”
  16. }
  17. bias_filler {
  18. type: “constant”
  19. }
  20. }
  21. }

3、accuracy

輸出分類(預測)精確度,只有test階段才有,因此需要加入include引數。

層型別:Accuracy

  1. layer {
  2. name: "accuracy"
  3. type: "Accuracy"
  4. bottom: "ip2"
  5. bottom: "label"
  6. top: "accuracy"
  7. include {
  8. phase: TEST
  9. }
  10. }

4、reshape

在不改變資料的情況下,改變輸入的維度。

層型別:Reshape

先來看例子

  1. layer {
  2. name: "reshape"
  3. type: "Reshape"
  4. bottom: "input"
  5. top: "output"
  6. reshape_param {
  7. shape {
  8. dim: 0 # copy the dimension from below
  9. dim: 2
  10. dim: 3
  11. dim: -1 # infer it from the other dimensions
  12. }
  13. }
  14. }

有一個可選的引數組shape, 用於指定blob資料的各維的值(blob是一個四維的資料:n*c*w*h)。

dim:0  表示維度不變,即輸入和輸出是相同的維度。

dim:2 或 dim:3 將原來的維度變成2或3

dim:-1 表示由系統自動計算維度。資料的總量不變,系統會根據blob資料的其它三維來自動計算當前維的維度值 。

假設原資料為:64*3*28*28, 表示64張3通道的28*28的彩色圖片

經過reshape變換:

  1. reshape_param {
  2. shape {
  3. dim: 0
  4. dim: 0
  5. dim: 14
  6. dim: -1
  7. }
  8. }

輸出資料為:64*3*14*56

5、Dropout

Dropout是一個防止過擬合的trick。可以隨機讓網路某些隱含層節點的權重不工作。

先看例子:

  1. layer {
  2. name: "drop7"
  3. type: "Dropout"
  4. bottom: "fc7-conv"
  5. top: "fc7-conv"
  6. dropout_param {
  7. dropout_ratio: 0.5
  8. }
  9. }layer {
  10. name: "drop7"
  11. type: "Dropout"
  12. bottom: "fc7-conv"
  13. top: "fc7-conv"
  14. dropout_param {
  15. dropout_ratio: 0.5
  16. }
  17. }
只需要設定一個dropout_ratio就可以了。

以上部分轉自:http://www.cnblogs.com/denny402/p/5083300.html