---恢復內容開始---html
在caffe中若是想要增長新的功能層,必需要本身在caffe的安裝目錄下(source code)中增長相應的文件git
大致步驟以下:github
參考教程: https://blog.csdn.net/tangwei2014/article/details/46815231api
http://www.javashuo.com/article/p-towekvit-hm.html數組
tensorflow ckpt轉 caffemodel遇到的坑函數
龍明盛老師的論文基本都是caffe 能夠看他是怎麼實現的一些層測試
一個別人實現的新層例子: spa
https://github.com/luoyetx/OrdinalRegression.net
具體實現:3d
一些基礎知識:
Kevin 老師幫忙整理的資料
1. bottom是個blob指針的數組,bottom[0]第一個輸入的指針, bottom[1]第二個輸入指針, top[0]第一個輸出指針
LayerSetUp函數中:
int bottom_batch_size_ = bottom[0]->num();
int bottom_channels_ = bottom[0]->channels();
int bottom_height_ = bottom[0]->height();
int bottom_width_ = bottom[0]->width();
注意,對於指針取數據用-> 對於單純blob取數據 用 .
blob<Dtype>* 表示指向blob的指針,其中blob的數據類型是Dtype
可是若是要取blob對應的數據地址要用 ->cpu_data() 這個相似於取數據的地址操做
Forward_cpu函數中:
Dtype* top_data = top[0]->mutable_cpu_data(); //mutable_cpu_data()表示top[0]數據可修改
const Dtype* bottom_data = bottom[0]->cpu_data(); //-> cpu_data()表示只可讀
caffe自帶的數學函數 https://blog.csdn.net/seven_first/article/details/47378697
2. shape操做
vector<int> top_shape = bottom[0]->shape();
top[0]->Reshape(top_shape);
若是top[0]的channel是bottom[0]的channel+bottom[1]的channel,其餘的都同樣,能夠這樣定義:
vector<int> top_shape = bottom[0]->shape();
top_shape[1] = bottom[0]->shape(1)+bottom[0]->shape(1);
top[0]->Reshape(top_shape);
若是這個變量是一箇中間變量的話,能夠這樣定義:
Blob<Dtype> conf_permute_; //通常寫在.hpp裏
而後在.cpp中的LayerSetUp或者Reshape中定義 conf_permute_.ReshapeLike(*(bottom[1]));
注意成員函數的參數都是類型的,好比是blob指針,就能夠直接輸bottom[0], 若是要求參數是blob,
若是有取地址符,那麼只須要傳入實體,這樣也能修改內容
若是是指針的話是 *的形式
3. 關於count
const int count = bottom[0]->count();表示 count = bottom[0]的num * channel * height * width
const int count = bottom[0]->count(0, 1); 表示 count = bottom[0]的num * channel
const int count = bottom[0]->count(0, 2); 表示 count = bottom[0]的num * channel* height
const int count = bottom[0]->count(1); 表示 count = bottom[0]的 channel * height * width
const int count = bottom[0]->count(2); 表示 count = bottom[0]的 height * width
const int num = bottom[0]->shape(0); //bottom[0]的batch_size
const int channel = bottom[0]->shape(1); //bottom[0]的channel
const int height = bottom[0]->shape(2); //bottom[0]的height
const int width = bottom[0]->shape(3); //bottom[0]的width
3.printf:
const int count = bottom[0]->count();
printf("count %d\n", count);
4.gdb Debug調試:
https://zhuanlan.zhihu.com/p/28146796