1. 程式人生 > >Caffe中deploy.prototxt 和 train_val.prototxt 區別

Caffe中deploy.prototxt 和 train_val.prototxt 區別

之前用deploy.prototxt 還原train_val.prototxt過程中,遇到了坑,所以打算總結一下

本人以熟悉的LeNet網路結構為例子

不同點主要在一前一後,相同點都在中間

train_val.prototxt 中的開頭

看這個名字也知道,裡面定義的是訓練和驗證時候的網路,所以在開始的時候要定義訓練集和驗證集的來源

name: "LeNet"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale:
0.00390625 } data_param { # 這裡定義了之前將資料集轉成lmdb資料格式的檔案位置 source: "examples/mnist/mnist_train_lmdb" # 這個定義了一次行送入網路的影象個數 batch_size: 64 backend: LMDB } } layer { name: "mnist" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { scale:
0.00390625 } data_param { # 這裡定義了驗證集的資料來源 source: "examples/mnist/mnist_test_lmdb" batch_size: 100 backend: LMDB } }

deploy.prototxt 中的開頭

看這個名字也知道,這個配置檔案適用於部署,也就是用於實際場景時候的配置檔案,所以開始的時候不必在定義資料集的來源,但是需要定義輸入資料的大小格式。

name: "LeNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  # 輸入資料的batch size, channel, width, height
input_param { shape: { dim: 64 dim: 1 dim: 28 dim: 28 } } }

train_val.prototxt 中的結尾

如果是一般的卷積網路的話,最後面都是用一個全連線,將feature map 轉成固定長度的向量,然後輸出種類的個數。所以在最後的時候,需要說明輸出種類的個數。

layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    # 在這裡定義了輸出種類的個數
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

因為這裡麵包含了驗證的部分,驗證的時候,需要輸出結果的準確率,所以需要定義準確率的輸出。

layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}

最後還有一個不同就是,因為是訓練模型,所以包括forward和backward,所以最後需要定義一個損失函式。這裡用的是SoftmaxWithLoss,而在deploy.prototxt,因為只有forward,所以定義的是Softmax,也就是分類器。

layer {
  name: "loss"
  # 定義的是損失函式
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

deploy.prototxt 中的最後

這裡定義了Softmax分類器,輸出最後各類的概率值。

layer {
  name: "prob"
  # 定義的是分類器
  type: "Softmax"
  bottom: "ip2"
  top: "prob"
}

train_val.prototxt 和 deploy.prototxt中間部分

兩個的中間部分都是一樣的,定義了一些卷積、啟用、池化、Dropout、LRN(local response normalization)、全連線等操作。

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}