1. 程式人生 > >caffe多標籤訓練

caffe多標籤訓練

最近剛接觸caffe弄了一個caffe多標籤遇到各種蛋疼的問題跟大家分享分享。

一  準備資料這裡用的驗證碼0-9+26個字母字母生成4位數的驗證碼

二  修改caffe原始碼涉及到修改的檔案有 

      caffe.proto ,

      convert_imageset.cpp,

      data_layer.cpp,

      io.cpp,

      data_layer.hpp,

      io.hpp 

      具體修改就不介紹了去下面地址下載修改後的檔案然後替換掉原有caffe中的

      檔案下載地址:https://pan.baidu.com/s/1eSP1RUi

      這裡我們理解一下,caffe原本不支援多標籤分類任務,這裡的主要修改是為了是的caffe支援多標籤分類,我們知道caffe的label原版指定的是整數型且只有1個,看caffe.proto裡面寫的:Datum就是我們的資料層,那麼資料層的label是int32,這就限制了資料label的輸入必須是一個整數,那麼修改他的起點就是從proto裡面開始,加一個labels,陣列型別

修改完了然後接著修改caffe使用Datum部分程式碼,實現對labels的支援

最後修改convert_imageset.cpp,讓他實現對例如如下:

imgs/abc.jpg 1 2 3 4 5

這種型別的多標籤做支援

最終完成這次修改,再編譯一遍就好了

三   製作資料標籤

       圖片路徑 + 對應的標籤   samples/MYL1.bmp 22 34 21 1

四   寫個多分類網路

     

     結構如下:

  1. name:"LeNet"
  2. layer{
  3.  name:"mnist"
  4.  type:"Data"
  5.  top:"data"
  6.  top:"label"
  7.  include{
  8.    phase: TRAIN
  9. }
  10.  transform_param{
  11.    scale:0.003921568627451
  12. }
  13.  data_param
    {
  14.    source:"train_lmdb"
  15.    batch_size:64
  16.    backend: LMDB
  17. }
  18. }
  19. layer{
  20.  name:"mnist"
  21.  type:"Data"
  22.  top:"data"
  23.  top:"label"
  24.  include{
  25.    phase: TEST
  26. }
  27.  transform_param{
  28.    scale:0.003921568627451
  29. }
  30.  data_param{
  31.    source:"val_lmdb"
  32.    batch_size:64
  33.    backend: LMDB
  34. }
  35. }
  36. layer{
  37.  name:"conv1"
  38.  type:"Convolution"
  39.  bottom:"data"
  40.  top:"conv1"
  41.  param{
  42.    lr_mult:1
  43. }
  44.  param{
  45.    lr_mult:2
  46. }
  47.  convolution_param{
  48.    num_output:128
  49.    kernel_size:7
  50.    stride:1
  51.    weight_filler{
  52.      type:"xavier"
  53. }
  54.    bias_filler{
  55.      type:"constant"
  56. }
  57. }
  58. }
  59. layer{
  60.  name:"pool1"
  61.  type:"Pooling"
  62.  bottom:"conv1"
  63.  top:"pool1"
  64.  pooling_param{
  65.    pool: MAX
  66.    kernel_size:2
  67.    stride:2
  68. }
  69. }
  70. layer{
  71.  name:"conv2"
  72.  type:"Convolution"
  73.  bottom:"pool1"
  74.  top:"conv2"
  75.  param{
  76.    lr_mult:1
  77. }
  78.  param{
  79.    lr_mult:2
  80. }
  81.  convolution_param{
  82.    num_output:128
  83.    kernel_size:5
  84.    stride:1
  85.    weight_filler{
  86.      type:"xavier"
  87. }
  88.    bias_filler{
  89.      type:"constant"
  90. }
  91. }
  92. }
  93. layer{
  94.  name:"pool2"
  95.  type:"Pooling"
  96.  bottom:"conv2"
  97.  top:"pool2"
  98.  pooling_param{
  99.    pool: MAX
  100.    kernel_size:2
  101.    stride:1
  102. }
  103. }
  104. layer{
  105.  name:"Relu"
  106.  type:"ReLU"
  107.  bottom:"pool2"
  108.  top:"pool2"
  109. }
  110. layer{
  111.  name:"conv3"
  112.  type:"Convolution"
  113.  bottom:"pool2"
  114.  top:"conv3"
  115.  param{
  116.    lr_mult:1
  117. }
  118.  param{
  119.    lr_mult:2
  120. }
  121.  convolution_param{
  122.    num_output:128
  123.    kernel_size:3
  124.    stride:1
  125.    weight_filler{
  126.      type:"xavier"
  127. }
  128.    bias_filler{
  129.      type:"constant"
  130. }
  131. }
  132. }
  133. layer{
  134.  name:"Relu2"
  135.  type:"ReLU"
  136.  bottom:"conv3"
  137.  top:"conv3"
  138. }