一、Caffe基礎
1、Caffe主要依賴項
- CUDA(Compute Unified Device Architecture),是英偉達公司推出的一種基於新的並行編程模型和指令集架構的通用計算架構,它能利用英偉達GPU的並行計算引擎,比CPU更高效的解決許多複雜計算任務。
- NVIDIA cuDNN是用於深度神經網絡的GPU加速庫。它強調性能、易用性和低內存開銷。
- Opencv. (Linux下查看版本:pkg-config --modversion opencv)
2、Caffe中的網絡都是有向無環圖的集合,可以直接定義
3、數據及其導數以blobs的形式在層間流動。每一層用bottom來輸入數據,用top來輸出數據。Caffe層的定義由2部分組成:層屬性與層參數。
4、Slice layer用來做multi-task或者multi-label學習,將一個Vector分成多個Vector。Slience層用來接收slice出的不需要的層,使其不被打印出來。
5、Blob是用以存儲數據的4維數組,例如
- 對於數據:Number*Channel*Height*Width
- 對於卷積權重:Output*Input*Height*Width
- 對於卷積偏置:Output*1*1*1
6、關於可視化:https://blog.csdn.net/BockSong/article/details/81979822
二、Caffe編譯
初次安裝caffe,或是修改caffe源碼後,都需要進行編譯。編譯時首先要準備好所需的依賴項,然後生成並根據需要修改makefile和makefile.config文件。
之後執行如下指令:
make clean
make all
編譯中遇到了一些問題,解決過程記錄在另一篇博客:https://blog.csdn.net/BockSong/article/details/81738610
三、數據處理
Caffe支持三種數據庫格式:LevelDB, LMDB, HDF5。
LMDB文件操作可以參考:https://blog.csdn.net/BockSong/article/details/81238276
四、配置文件編寫
1、solver.prototxt
net: "examples/AAA/train_val.prototxt" #訓練或者測試配置文件
test_iter: 40 #完成一次測試需要的迭代次數
test_interval: 475 #測試間隔
base_lr: 0.01 #基礎學習率
lr_policy: "step" #學習率變化規律
gamma: 0.1 #學習率變化指數
stepsize: 9500 #學習率變化頻率
display: 20 #屏幕顯示間隔
max_iter: 47500 #最大迭代次數
momentum: 0.9 #動量
weight_decay: 0.0005 #權重衰減
snapshot: 5000 #保存模型間隔
snapshot_prefix: "models/A1/caffenet_train" #保存模型的前綴
solver_mode: GPU #是否使用GPU
2、train_val.prototxt
train_val.prototxt文件是網絡配置文件。該文件是在訓練的時候用的。
3、deploy.prototxt
該文件是在測試時使用的文件。
相關資料:
makefile.config https://blog.csdn.net/jiajunlee/article/details/52068230
makefile https://blog.csdn.net/thystar/article/details/50837750
五、Python接口
1、net.blobs解析
其類型是 collections.OrderedDict(即有序字典),字典的值類型爲 caffe._caffe.Blob,caffe._caffe.Blob 的 data 屬性類型是 numpy.ndarray。
在 Caffe 的 python/caffe/_caffe.cpp 文件中:
.add_property("data", bp::make_function(&Blob<Dtype>::mutable_cpu_data,
NdarrayCallPolicies()))
在 Caffe 的 src\caffe\blob.cpp 文件中
template <typename Dtype>
Dtype* Blob<Dtype>::mutable_cpu_data() {
CHECK(data_);
return static_cast<Dtype*>(data_->mutable_cpu_data());
}
2、中間層的可視化
讀取網絡的結構(每層的名字以及相應層的參數)。net.blob對應網絡每一層數據,對於每一層,都是四個維度:(batch_size, channel_dim, height, width)。
# 循環打印每一層名字和相應維度
for layer_name, blob in net.blobs.iteritems():
print layer_name + '\t' + str(blob.data.shape)