Caffe學習系列 15 新增新層

2021-09-25 11:16:04 字數 2640 閱讀 9701

如何在caffe中增加一層新的layer呢?主要分為四步:

(1)在./src/caffe/proto/caffe.proto 中增加對應layer的paramter message;

(2)在./include/caffe/***layers.hpp中增加該layer的類的宣告,***表示有common_layers.hpp,

data_layers.hpp, neuron_layers.hpp, vision_layers.hpp 和loss_layers.hpp等;

(3)在./src/caffe/layers/目錄下新建.cpp和.cu(gpu)檔案,進行類實現。

(4)在./src/caffe/gtest/中增加layer的測試**,對所寫的layer前傳和反傳進行測試,測試還包括速度。(可省略,但建議加上)

這位博主新增了乙個計算梯度的網路層,簡介明了:

這幾位博主增加了自定義的loss層,可供參考:

我以新增precision_recall_loss層來學習**,主要是precision_recall_loss_layer.cpp的實現

#include #include 

#include

#include

#include

#include

"caffe/layer.hpp

"#include

"caffe/util/io.hpp

"#include

"caffe/util/math_functions.hpp

"#include

"caffe/vision_layers.hpp

"namespace

caffe

//進行維度變換

template void precisionrecalllosslayer::reshape(

const vector*> &bottom,

const vector*> &top)

//前向傳導

template

void precisionrecalllosslayer::forward_cpu(

const vector*> &bottom, const vector*> &top)

if (label_value == 0 && data_value >=thresh)

if (label_value == 1 && data_value if (label_value == 0 && data_value }

} //計算precision和recall

dtype precision = 0.0

; dtype recall = 0.0

;

if (true_positive + false_positive > 0

) else

if (true_positive == 0

)

if (true_positive + false_negative > 0

) else

if (true_positive == 0

)

if (prec_diff > fabs(precision -recall) //如果二c者相差小

&& precision > 0 && precision < 1

&& recall > 0 && recall < 1

)

} top[

0]->mutable_cpu_data()[0] += 1.0 -breakeven; //計算誤差

} top[

0]->mutable_cpu_data()[0] /=channels; //???

} //反向

template

void precisionrecalllosslayer::backward_cpu(

const vector*> &top,

const vector &propagate_down,

const vector*> &bottom)

} } #ifdef cpu_only

stub_gpu(precisionrecalllosslayer);

#endif //註冊該層instantiate_class(precisionrecalllosslayer);

register_layer_class(precisionrecallloss);

} //namespace caffe

template

void precisionrecalllosslayer::forward_cpu(  

const vector*> &bottom, const vector*> &top)   

if (label_value == 0 && data_value >= thresh)   

if (label_value == 1 && data_value < thresh)   

if (label_value == 0 && data_value < thresh)   

}  }  

dtype precision = 0.0; 

caffe框架下新增新層

新層yxylayer實現乙個特別簡單的功能,目的在於理解caffe中層的底層結構。yxylayer的功能 正向就是乙個直接複製的過程,反向將梯度縮放制定的倍數。有時我們的網路存在分支,但我們不希望某一分支影響之前層的更新,那麼我們就將梯度放縮0倍。該層只有乙個引數 diff scale,預設為1。在...

caffe學習系列 層解讀

層型別 accuracy layer 可以看到,caffe中計算accuracy時,是通過比較最後乙個全連線層 神經元個數 類別數 但沒有加入activation function 的輸出和資料集的labels來得到的,計算過程在accuracylayer中實現 我也一直非常困惑,計算accurac...

caffe下新增新的loss層

caffe的使用當中,最神秘的就是caffe的原始碼,而我們要做一些創新點的話,基本上都是要修改caffe的原始碼。小魚和大家分享怎麼在caffe下新增新的層。比如要新增乙個新的loss函式 euclidean loss norm layer 1 需要編寫相應的euclidean loss norm...