NVcaffe源碼閱讀——Layer

NVcaffe源碼閱讀——Layer

Layer

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 <typename Dtype>

改爲了

template<typename Ftype, typename Btype>

其中Ftype代表’Forward type’,Btype同理。這樣做可以將每一層前後向的數據類型隔離開來,即前後向分別使用不同的數據類型,對nvcaffe的多數據類型特性提供支持,也爲每一層的構建提供了很大的靈活性。例如,在absval_layer.cpp中,前後向函數的feature的數據結構可以不同:

    // in Forward_cpu()
    Ftype* top_data = top[0]->mutable_cpu_data<Ftype>();
    // in Backward_cpu()
    Btype* bottom_diff = bottom[0]->mutable_cpu_diff<Btype>();

而在Layer.cpp中,nvcaffe則是對Layer類的構造函數進行了拓展,功能是設置該層的前後向數據類型。在caffe.proto中,nvcaffe在LayerParameter中定義了forward/backward_type、forward/backward_math參數。同時在NetParameter中也定義了default_forward/backward_type/math,對整個網絡進行默認設置。

Layer Factory

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

發佈了48 篇原創文章 · 獲贊 73 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章