1. 程式人生 > >深度學習Caffe實戰筆記(7)Caffe平臺下,如何調整卷積神經網路結構

深度學習Caffe實戰筆記(7)Caffe平臺下,如何調整卷積神經網路結構

授人以魚不如授人以漁,紅鯉魚家有頭小綠驢叫驢屢屢。至於修改網路結構多虧了課題組大師姐老龐,在小米實習回校修整,我問她怎麼修改網路,她說改網路就是改協議,哎呀,一語驚醒夢中人啊!老龐師姐,你真美!雖然博主之前也想過修改網路協議試一試,鑑於一直不懂網路結構中的各個引數是幹啥的,所以一直沒去實施,這次終於開始嘗試了。
caffe平臺實現卷積神經網路實在方便的很啊,只需要一個協議檔案定義一下網路結構,再定義一個超參協議檔案即可。這裡請注意我的措辭哈,只是介紹如何修改網路結構,而不是如何合理的修改網路結構,什麼樣的網路才是好的,這暫時還沒有一個明確的定義,大多數研究者還處於試一試的階段,如果誰能把這個問題搞清楚,估計能拿一個圖靈獎了。
開始trian。

以Alexnet為例
原始的Alexnet是這個樣子的(頁面問題只可視化部分好了):
這裡寫圖片描述
相應的協議檔案中的部分:

layer {
  name: "conv3"
  type: "Convolution"
  bottom: "pool2"
  top: "conv3"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
weight_filler { type: "gaussian" std: 0.01
} bias_filler { type: "constant" value: 0 } } } layer { name: "relu3" type: "ReLU" bottom: "conv3" top: "conv3" } layer { name: "conv4" type: "Convolution" bottom: "conv3" top: "conv4" param { lr_mult: 1
decay_mult: 1
} param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 384 pad: 1 kernel_size: 3 group: 2 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0.1 } } } layer { name: "relu4" type: "ReLU" bottom: "conv4" top: "conv4" } layer { name: "conv5" type: "Convolution" bottom: "conv4" top: "conv5" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 256 pad: 1 kernel_size: 3 group: 2 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0.1 } } } layer { name: "relu5" type: "ReLU" bottom: "conv5" top: "conv5" } layer { name: "pool5" type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { pool: MAX kernel_size: 3 stride: 2 } }

我們想要在第四個卷積層後再加上一層,怎麼辦呢?只需要修改相應的協議即可:

layer {
  name: "conv4"
  type: "Convolution"
  bottom: "conv3"
  top: "conv4"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
    group: 2
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}
layer {
  name: "relu4"
  type: "ReLU"
  bottom: "conv4"
  top: "conv4"
}

layer {
  name: "conv4_p"     #新增一層
  type: "Convolution"
  bottom: "conv4"    #輸入層
  top: "conv4_p"     #修改一下
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 256  
    pad: 1
    kernel_size: 3
    group: 2
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}
layer {
  name: "relu4_p"   #新增一個relu4_p
  type: "ReLU"
  bottom: "conv4_p"  #修改一下
  top: "conv4_p"     #修改一下
}
layer {
  name: "conv5"
  type: "Convolution"
  bottom: "conv4_p"   #輸入層修改一下
  top: "conv5"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 256
    pad: 1
    kernel_size: 3
    group: 2
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}

修改後的網路結構如下:
這裡寫圖片描述

其中conv4_p和relu4_p就是我們自己新增進去的一個卷積層。訓練一下修改後的網路,看精度會不會提升。。。。。哈哈哈

那麼我們再做另一種修改如下:
這裡寫圖片描述
想要實現這樣的分支怎麼實現呢?這裡就不做解釋了,授人以魚不如授人以漁,紅鯉魚家有頭小綠驢叫驢屢屢。自己摸索一下吧。。。。

寫在後面的話:
再次強調一下,只是介紹瞭如何修改網路結構,而不是如何合理的修改網路結構,這篇部落格僅僅介紹採用哪種手段和可以修改網路結構,而不是如何修改網路結構使效果更好。。。。。知道了如何修改網路結構,那麼搭建自己的網路也不是什麼難事了吧,授人以魚不如授人以漁,紅鯉魚家有頭小綠驢叫驢屢屢,又來了,又來了。哈哈哈

這幾篇部落格裡的內容從最初的如何搭建網路,到如何用網路跑標準資料集,到用現有的網路跑自己的資料集,再到如何修改和搭建自己的網路,基本上涵蓋了caffe使用的主要環節,供大家學習參考,我也是剛剛學習,所以有寫錯和不合適的地方還請大家及時批評指正。後續如果再有時間,我想補充一篇關於網路協議檔案引數說明的部落格。再後續如果再更新部落格,我想做深度學習的基礎理論和公式推導之類的工作,畢竟實戰加深度才是王道。。。。。

最後用王國維先生的三境界來結束這幾個部落格:昨夜西風凋碧樹,獨上高樓,望盡天涯路;衣帶漸寬終不悔,為伊消得人憔悴;眾裡尋他千百度,眸然回首,那人卻在燈火闌珊處。