1. 程式人生 > >caffe的prototxt檔案

caffe的prototxt檔案

參考

data_layer

1、Data層

layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "examples/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/cifar10_train_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
  • name任取,表示這一層的名字
  • type:層型別,如果是Data,表示資料來源是LevelDB後者LMDB,根據資料來源的不同,資料層的型別也不同,有些還是從磁碟中儲存hdf5或者圖片格式。
  • top和bottom:top為此層輸出,bottom為此層輸入,在資料層中,至少有一個命名為data的top。如果有第二個top,一般命名為label。這種(data, label)的配對是分類模型所必需的。
  • include:一般訓練和測試的時候,模型的引數有些不一樣。所以這個是用來指定該資料層是屬於訓練階段或者測試階段的層。若未指定,則該層既用在訓練模型又用在測試模型上。
  • transform_param:資料的預處理,可以將資料變換到定義的範圍內。如設定scale為0.00390625,實際上就是1/255,即將輸入資料由0~255歸一化到0~1之間。   
  • data_param:根據資料來源的不同,來進行不同的設定。必須設定的引數有source和batch_size,source包含資料庫的目錄名字,batch_size就是每次處理的資料個數。可選引數有rand_skip和backend,backend是選擇採用LevelDB還是LMDB,預設是LevelDB【這個應該是選擇資料庫引擎】

vision_layer

【Convolution、Pooling】

2、Convolution層

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 96
    kernel_size: 11
    stride: 4
    pad: 2
    weight_filler {
      type: "gaussian"
      std: 0.01            #標準差:distribution with stdev 0.01(default mean: 0)
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
  • lr_mult:學習率的係數,最終的學習率是這個數乘以solver.prototxt配置檔案中的base_lr。如有兩個lr_mult,則第一個表示權值w的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。
    • 必須設定的引數有:
    • num_output:卷積核的個數
    • kernel_size:卷積核的大小,如果kernel_size長寬不一樣,則需要通過kernel_h,kernel_w分別設定。
    • 其他引數:
    • stride:卷積核的步長,預設為1, 也可以用stride_h, stride_w來設定。
    • pad
    • weight_filter:權值初始化。預設為“constant”,值權威0,很多時候我們用“xavier”演算法來進行初始化,也可以設定為“gaussian
    • bias_filter:偏置項的初始化,一般設定為“constant”,值全為0。
    • bias_term:是否開啟偏置項,預設為true
    • group:分組,預設為1組。如果大於1,我們限制卷積的連線操作在一個子集裡。

3、pooling層

layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}        

4、Local Response Normalization層

LRN是對一個區域性的輸入進行的歸一化操作。【貌似現在不怎麼用了】

5、im2col層

在caffe中,卷積運算就是先對資料矩陣進行im2col操作,在進行內積運算,這樣做,會比原始的卷積操作更快。

 

common_layer

【InnerProductLayer、SplitLayer、FlattenLayer、ConcatLayer、SilenceLayer、(Elementwise Operations)這個是我們常說的啟用函式層Activation Layers、EltwiseLayer、SoftmaxLayer、ArgMaxLayer、MVNLayer】

6、inner_product層(FC)


layers {
  name: "fc8"
  type: "InnerProduct"
  blobs_lr: 1          # learning rate multiplier for the filters
  blobs_lr: 2          # learning rate multiplier for the biases
  weight_decay: 1      # weight decay multiplier for the filters
  weight_decay: 0      # weight decay multiplier for the biases
  inner_product_param {
    num_output: 1000
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
  bottom: "fc7"
  top: "fc8"

7、accuracy

layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
  • accuracy只在test有,因此要設定include為TEST。輸出分類(預測)的精確度。

8、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資料的各維的值(blob是一個四維的資料nxcxwxh)
  • "dim:0"表示維度不變,即輸入和輸出是一樣的維度。"dim:-1"表示由系統自動計算維度。資料總量不變,系統根據其他三維來確定這一維。

9、dropout

layer {
  name: "drop7"
  type: "Dropout"
  bottom: "fc7-conv"
  top: "fc7-conv"
  dropout_param {
    dropout_ratio: 0.5   #只需要設定一個dropout_ratio引數即可
  }
}

 

Neuron_layer

10、Sigmoid

layer {
  name: "encode1neuron"
  bottom: "encode1"
  top: "encode1neuron"
  type: "Sigmoid"
}

11、ReLU/Rectified-linear and Leaky-ReLU

layers {
name: "relu1"
type: RELU
bottom: "conv1"
top: "conv1"
}

12、TanH/Hyperbolic Tangent

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "TanH"
}

13、Absolute value(絕對值)

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "AbsVal"
}

14、Power(冪運算)

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "Power"
  power_param {
    power: 2
    scale: 1
    shift: 0
  }
}

15、BNLL(binomial normal log likelihood)

layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: “BNLL”
}

 

loss_layer

【待續,還有很多的】

16、softmax-loss

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip1"
  bottom: "label"
  top: "loss"
}

 

 

ps:

  • solver算是caffe核心的核心,它協調著整個模型的運作,caffe程式執行必須帶一個引數就是solver配置檔案。
  • caffe提供了六種優化演算法來求解最優解,在solver配置檔案中,通過設定type型別來選擇:
    • Stochastic Gradient Descent (type: "SGD"),
      AdaDelta (type: "AdaDelta"),
      Adaptive Gradient (type: "AdaGrad"),
      Adam (type: "Adam"),
      Nesterov’s Accelerated Gradient (type: "Nesterov") and
      RMSprop (type: "RMSProp")
  • Solver的流程:
    • 1. 設計好需要優化的物件,以及用於學習的訓練網路和用於評估的測試網路。(通過呼叫另外一個配置檔案prototxt來進行)
      
      2. 通過forward和backward迭代的進行優化來跟新引數。
      
      3. 定期的評價測試網路。 (可設定多少次訓練後,進行一次測試)
      
      4. 在優化過程中顯示模型和solver的狀態
    • #每一次的迭代過程
      • 1、呼叫forward演算法來計算最終的輸出值,以及對應的loss
      • 2、呼叫backward演算法來計算每層的梯度
      • 3、根據選用的slover方法,利用梯度進行引數更新
      • 4、記錄並儲存每次迭代的學習率、快照,以及對應的狀態。