Caffe-Windows下遇到過的問題、技巧、解決方案

轉換數據,求均值:

轉換數據

步驟大概是:建立一個train文件夾,裏面放一個train.txt;建立一個test文件夾,裏面放一個test.txt,然後分別運行以下兩條bat命令:
SET GLOG_logtostderr=1
convert_imageset.exe train/ train/train.txt convert_data_train
pause

SET GLOG_logtostderr=1
convert_imageset.exe test/ test/test.txt convert_data_test
pause
當然,也會出現錯誤,可能有以下幾點原因:
1、路徑沒有設置正確;2、txt裏面包含了本來沒有的文件;3、如果convert_data_train和convert_data_test文件夾本來就存在,那麼也會報錯。
生成的數據將會保存在:convert_data_train和convert_data_test文件夾內。

求均值:

SET GLOG_logtostderr=1
compute_image_mean.exe convert_data_train image_mean.binaryproto
pause
注意文件夾是不是存在的。

微調Finetune:

由於要用caffe做人臉識別,自己剛入手又不可能配置網絡,那麼只有下載已經有的模型進行微調。我對微調概念的理解就是,讓這個caffemodel能夠更加合你的數據。
然後被小坑了一下。我下載了vgg的模型,一個caffemodel,一個deploy.prototxt,然後上網查如何進行微調,思路是:自己的train,test數據轉換–>求均值–>改寫deploy.prototxt文件–>撰寫solver.prototxt。
前兩步都還好,沒有問題,在改寫的時候,要先加入數據層,也就是要刪掉原來的:
這裏寫圖片描述
然後加入一個數據層。看網上有一個教程是這麼加的:

name: "vggface_train_test.prototxt"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 224
    mean_file: "vggface/face_mean.binaryproto"
  }
  data_param {
    source: "vggface/face_train_lmdb"
    batch_size: 20
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 224
    mean_file: "vggface/face_mean.binaryproto"
  }
  data_param {
    source: "vggface/face_val_lmdb"
    batch_size: 20
    backend: LMDB
  }
}

然後我第一次運行,提示只能定義一種layer,我把上面的layer改爲了layers,繼續運行時,發現提示有錯,由於沒有什麼基礎弄這個,查了一下,大意是說第四行有意料之外的字符。我又看了一些其他的finetune例子,修改了以上代碼:

name: "vggface_train_test.prototxt"
layer {
  name: "data"
  type: DATA
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 224
    mean_file: "vggface/face_mean.binaryproto"
  }
  data_param {
    source: "vggface/face_train_lmdb"
    batch_size: 20
    backend: LMDB
  }
}
layer {
  name: "data"
  type: DATA
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 224
    mean_file: "vggface/face_mean.binaryproto"
  }
  data_param {
    source: "vggface/face_val_lmdb"
    batch_size: 20
    backend: LMDB
  }
}

神奇的成功了。把type後的這個改成了大寫的DATA。但是原po主說他的那個在他的電腦上是對的,我也不知道怎麼回事。如果有好心人看到了希望能夠給我這個小白講解一下。
這裏還是給出finetune的bat命令以及solver文件:

bat:

Build\x64\Debug\caffe train –solver=vggface/solver.prototxt –weights=vggface/vgg_face.caffemodel
(注意自己的路徑)

solver.prototxt:

net: "vggface/vggface_train_test.prototxt"
test_iter: 500
test_interval: 500
test_initialization: false
display: 40
average_loss: 40
base_lr: 0.00005
lr_policy: "step"
stepsize: 320000
gamma: 0.96
max_iter: 1000
momentum: 0.9
weight_decay: 0.0002
snapshot: 500
snapshot_prefix: "vggface/mymodel"
solver_mode: GPU

可自行修改。
fine-tune時用已經訓練好的權值進行初始化,結果一般比直接訓練會好很多,尤其是訓練數據不多的情況下。solver文件中最重要的可能是學習率了,一般fine-tune時學習率比直接train時小一些,一般訓練的學習率0.001~0.01之間,可以多試試。

提取某一層特徵:

這個被大坑了一下。網上的教程大多是用extract_features.bin ,就連官方自帶的教程也是extract_features.bin,我卻沒有找到。難道是我用的是微軟的caffe導致的?(逃
然後在build文件夾裏還是找到了一個好像是一樣的exe文件:extract_features.exe

需要運行這個我們得準備幾樣東西:

1、一張圖片(也可以是幾張。。尺寸問題!要注意)
2、一個file_list.txt文件,而且後面要加個0(標籤?不像啊)
這裏寫圖片描述
3、一個imagenet_val文件,因爲我用的網絡是caffenet,而且這個東西就在extract例程的文件夾下,然後要改東西,依據自己的路徑:
這裏寫圖片描述
4、一個caffemodel,我下載了bvlc_reference_caffenet.caffemodel 。

然後就要開始了:

bat:

Build\x64\Debug\extract_features caffenet/bvlc_reference_caffenet.caffemodel caffenet/imagenet_val.prototxt conv5 caffenet/features 10 lmdb

==========================8月11日更新===================================

調參:

網絡訓練參數調節,可以參考mnist或者cifar10中的demo。
調參根據經驗,或者參考docs/tutorial/solver.md
需要調節的參數(solver.prototxt)主要包括:
base_lr:初始學習率,這個是非常重要的一個參數;
momentum:一般設置爲0.9,如果base_lr特別低的話也可以設置爲0.990.999等  
 weight_decay:默認0.005,可以適當調整,類似於正則化項;  
lr_policy:學習率變化策略,常見的有fixed(固定), inv,step等
詳細的說明見      http://stackoverflow.com/questions/30033096/what-is-lr-policy-in-caffe
或者參考源代碼src/caffe/solver.cpp中的GetLerningRate函數
常見的調參方式包括:examples/mnist中的各種方式 fixed,inv,step等,或者cifar10中的quick兩步調參的方法。
主要是控制初始的學學習率,並對應的調節學習率的策略,batch size需要適當控制大小

防止某一層未註冊:

也就是下面的:

I0808 16:09:36.428869 12912 layer_factory.hpp:77] Creating layer data
F0808 16:09:36.428869 12912 layer_factory.hpp:81] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: MemoryData (known types: )
*** Check failure stack trace: ***

只要加上以下就好,適當調整。

#include "caffe/common.hpp"  
#include "caffe/layers/input_layer.hpp"  
#include "caffe/layers/inner_product_layer.hpp"  
#include "caffe/layers/dropout_layer.hpp"  
#include "caffe/layers/conv_layer.hpp"  
#include "caffe/layers/relu_layer.hpp"  
#include "caffe/layers/pooling_layer.hpp"  
#include "caffe/layers/lrn_layer.hpp"  
#include "caffe/layers/softmax_layer.hpp"  
namespace caffe  
{  
extern INSTANTIATE_CLASS(InputLayer);  
extern INSTANTIATE_CLASS(InnerProductLayer);  
extern INSTANTIATE_CLASS(DropoutLayer);  
extern INSTANTIATE_CLASS(ConvolutionLayer);  
REGISTER_LAYER_CLASS(Convolution);  
extern INSTANTIATE_CLASS(ReLULayer);  
REGISTER_LAYER_CLASS(ReLU);  
extern INSTANTIATE_CLASS(PoolingLayer);  
REGISTER_LAYER_CLASS(Pooling);  
extern INSTANTIATE_CLASS(LRNLayer);  
REGISTER_LAYER_CLASS(LRN);  
extern INSTANTIATE_CLASS(SoftmaxLayer);  
REGISTER_LAYER_CLASS(Softmax);  
}

Blob:

Blob是用以存儲數據的4維數組,例如
對於數據:Number*Channel*Height*Width
對於卷積權重:Output*Input*Height*Width
對於卷積偏置:Output*1*1*1
一般在提取向量時,Blob變化的是:channel。

Layer和Layers:

一定一定注意進行區分,他們的格式類型頗有不同。

Caffe層的定義由2部分組成:層屬性與層參數,例如(layer)

name:"conv1"
type:CONVOLUTION
bottom:"data"
top:"conv1"
convolution_param{
    num_output:<span>20
    kernel_size:5
    stride:1
    weight_filler{
        type: "<span style="color: #c0504d;">xavier</span>"
    }
}

這段配置文件的前4行是層屬性,定義了層名稱、層類型以及層連接結構(輸入blob和輸出blob);而後半部分是各種層參數。

2017-1-31更新

caffe中的層是根據top: “”排序的,和name無關。打個比方,你在fc7層後面接了2個fc8層,一個的top:“fc8_type”,另一個的top:”fc8_surface”,那麼”fc8_surface”層是排在“fc8_type”前面的。爲什麼呢?
fc8_部分都是一樣的,但是s的值轉換爲int是比t的值要小的,所以”fc8_surface”排前面。
最近在弄多loss方面的東西,注意這個細節防止數據輸入錯誤。比如把層命名爲:fc8_1_type什麼的就會好很多啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章