NVcaffe原始碼閱讀 Layer

2021-08-04 09:51:30 字數 1787 閱讀 6594

nvcaffe的layer.hpp/cpp在功能上與以前的caffe相比有一些明顯改變。

首先nvcaffe對layer.hpp的**進行了拓展,提供了很多便利的新特性:

1. 將layer.hpp中原先對layer進行設定的函式抽離出來,組成layerbase類。真正的layer類則繼承layerbase類,並只實現前後向、toproto等少量函式。

2. 提供了獲取parent_net的api(parent_net、set_parent_net以及layerbase的建構函式等),可以在層的**裡拿到關於當前網路的指標。利用這一點便可輕鬆拿到當前的solver指標(parent_solver()、set_solver_rank()函式),從而進一步拿到諸如當前迭代次數等在訓練中有用的資訊(iter()、relative_iter()函式等)。

3. 提供了獲取層的名稱(prototxt中的name域,而不是type域,name()函式)。

4. 提供了net_inititialized_flag_和net_iteration0_flag_兩個flag類指標變數,用來標記層是否處於初始化狀態或者尚未迭代的狀態。flag類的定義在commen.hpp中,提供了一系列互斥、帶鎖的標記操作。

5. nvcaffe在layer.hpp中還有fmath和bmath這兩個變數,與ftype和btype十分相似。因為layer_factor在建立新層的時候只使用了ftype和btype變數,所以暫時不清楚其功能。同時新增了諸如fm_by_user(bool val)、bm_by_user(bool val)等函式以供查詢變數的設定狀態。

另外乙個亮點在於改變了layer類的模板引數列表,即把過去的

template

改為了

template

其中ftype代表』forward type』,btype同理。這樣做可以將每一層前後向的資料型別隔離開來,即前後向分別使用不同的資料型別,對nvcaffe的多資料型別特性提供支援,也為每一層的構建提供了很大的靈活性。例如,在absval_layer.cpp中,前後向函式的feature的資料結構可以不同:

// in forward_cpu()

ftype* top_data = top[0]->mutable_cpu_datatype>();

// in backward_cpu()

btype* bottom_diff = bottom[0]->mutable_cpu_difftype>();

而在layer.cpp中,nvcaffe則是對layer類的建構函式進行了拓展,功能是設定該層的前後向資料型別。在caffe.proto中,nvcaffe在layerparameter中定義了forward/backward_type、forward/backward_math引數。同時在netparameter中也定義了default_forward/backward_type/math,對整個網路進行預設設定。

在caffe中,層的建立是通過layer_factory.hpp中的createlayer函式實現的。該函式接受乙個layerparameter作為引數,將其直接放入對應型別的層的建構函式生成層。而在nvcaffe中,createlayer函式需要額外的ftype和btype作為傳參。ftype和btype是從當前層的prototxt中的forward_type和backward_type得到的。因此在prototxt中修改這兩個域便可設定該層計算時使用的資料型別。另外,forward_math和backward_math兩個域在createlayer函式中僅僅用來列印資訊,沒有被用來建立層。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...