深度學習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使用的主要環節,供大家學習參考,我也是剛剛學習,所以有寫錯和不合適的地方還請大家及時批評指正。後續如果再有時間,我想補充一篇關於網路協議檔案引數說明的部落格。再後續如果再更新部落格,我想做深度學習的基礎理論和公式推導之類的工作,畢竟實戰加深度才是王道。。。。。
最後用王國維先生的三境界來結束這幾個部落格:昨夜西風凋碧樹,獨上高樓,望盡天涯路;衣帶漸寬終不悔,為伊消得人憔悴;眾裡尋他千百度,眸然回首,那人卻在燈火闌珊處。