1. 程式人生 > >caffe程式碼閱讀3:Filler的實現

caffe程式碼閱讀3:Filler的實現

一、Filler的作用簡介

Filler層的作用實際上就是根據proto中給出的引數對權重進行初始化,初始化的方式有很多種,分別為常量初始化(constant)、高斯分佈初始化(gaussian)、positive_unitball初始化、均勻分佈初始化(uniform)、xavier初始化、msra初始化、雙線性初始化(bilinear)這麼幾種。

二、Filler類的詳細介紹

首先了解一下Filler類的第一個函式:該函式把整個Filler類一下子就看明白了
  1. template <typename Dtype>  
  2. Filler<Dtype>* GetFiller(const
     FillerParameter& param) {  
  3.   const std::string& type = param.type();  
  4.   if (type == "constant") {  
  5.     returnnew ConstantFiller<Dtype>(param);  
  6.   } elseif (type == "gaussian") {  
  7.     returnnew GaussianFiller<Dtype>(param);  
  8.   } elseif (type == "positive_unitball") {  
  9.     returnnew PositiveUnitballFiller<Dtype>(param);  
  10.   } elseif (type == "uniform") {  
  11.     returnnew UniformFiller<Dtype>(param);  
  12.   } elseif (type == "xavier") {  
  13.     returnnew XavierFiller<Dtype>(param);  
  14.   } elseif (type == "msra") {  
  15.     returnnew MSRAFiller<Dtype>(param);  
  16.   } elseif (type == "bilinear") {  
  17.     returnnew BilinearFiller<Dtype>(param);  
  18.   } else {  
  19.     CHECK(false) << "Unknown filler name: " << param.type();  
  20.   }  
  21.   return (Filler<Dtype>*)(NULL);  

根據給定的引數獲取對應的Filler,由該段程式碼可以看出proto檔案裡面對於權重可以有哪些指定的初始化方式。


1)基類Filler

  1. template <typename Dtype>  
  2. class Filler {  
  3.  public:  
  4.  // 建構函式
  5.   explicit Filler(const FillerParameter& param) : filler_param_(param) {}  
  6.   // 解構函式,並且是虛擬函式
  7.   virtual ~Filler() {}  
  8.   // 純虛擬函式,繼承的子類必須要實現
  9.   virtualvoid Fill(Blob<Dtype>* blob) = 0;  
  10.  protected:  
  11.   FillerParameter filler_param_;  
  12. };  // class Filler

2)繼承Filler的類

2-1 常量初始化類

  1. template <typename Dtype>  
  2. class ConstantFiller : public Filler<Dtype> {  
  3.  public:  
  4.   explicit ConstantFiller(const FillerParameter& param)  
  5.       : Filler<Dtype>(param) {}  
  6.   virtualvoid Fill(Blob<Dtype>* blob) {  
  7.     // 獲取資料指標
  8.     Dtype* data = blob->mutable_cpu_data();  
  9.     // 獲取資料長度
  10.     constint count = blob->count();  
  11.     // 獲取常量初始化的常數值
  12.     const Dtype value = this->filler_param_.value();  
  13.     CHECK(count);  
  14.     for (int i = 0; i < count; ++i) {  
  15.       data[i] = value;//對於每一個元素都初始化為常數值
  16.     }  
  17.     CHECK_EQ(this->filler_param_.sparse(), -1)  
  18.          << "Sparsity not supported by this Filler.";  
  19.   }  
  20. };  

2-2 均勻分佈初始化類

  1. template <typename Dtype>  
  2. class UniformFiller : public Filler<Dtype> {  
  3.  public:  
  4.   explicit UniformFiller(const FillerParameter& param)  
  5.       : Filler<Dtype>(param) {}  
  6.   virtualvoid Fill(Blob<Dtype>* blob) {  
  7.     // 檢查blob中的元素是否為0
  8.     CHECK(blob->count());  
  9.     // 呼叫caffe_rng_uniform進行初始化
  10.     caffe_rng_uniform<Dtype>(blob->count(), Dtype(this->filler_param_.min()),  
  11.         Dtype(this->filler_param_.max()), blob->mutable_cpu_data());  
  12.     // 均勻分佈初始化是不支援稀疏特性的
  13.     CHECK_EQ(this->filler_param_.sparse(), -1)  
  14.          << "Sparsity not supported by this Filler.";  
  15.   }  
  16. };  

2-3 高斯分佈初始化類(支援稀疏特性)

  1. template <typename Dtype>  
  2. class GaussianFiller : public Filler<Dtype> {  
  3.  public:  
  4.   explicit GaussianFiller(const FillerParameter& param)  
  5.       : Filler<Dtype>(param) {}  
  6.   virtualvoid Fill(Blob<Dtype>* blob) {  
  7.     Dtype* data = blob->mutable_cpu_data();  
  8.     CHECK(blob->count());  
  9.     // 呼叫caffe_rng_gaussian初始化、其中輸入了高斯分佈的均值和標準差
  10.     caffe_rng_gaussian<Dtype>(blob->count(), Dtype(this->filler_param_.mean()),  
  11.         Dtype(this->filler_param_.std()), blob->mutable_cpu_data());  
  12.     int sparse = this->filler_param_.sparse();  
  13.     // 檢查sparse > -1
  14.     CHECK_GE(sparse, -1);  
  15.     if (sparse >= 0) {//  如果啟用稀疏的話
  16.       // Sparse initialization is implemented for "weight" blobs; i.e. matrices.
  17.       // These have num == channels == 1; width is number of inputs; height is
  18.       // number of outputs.  The 'sparse' variable specifies the mean number
  19.       // of non-zero input weights for a given output.
  20.       CHECK_GE(blob->num_axes(), 1);  
  21.       // 假設權重的形狀是 輸出單元個數 X輸入單元個數
  22.       // blob->shape(0) = 輸出單元的個數
  23.       constint num_outputs = blob->shape(0);  
  24.       // 不為0的概率 = 1/輸出單元個數
  25.       // 那麼為0的概率= 1 - 1/輸出單元個數
  26. 相關推薦

    caffe程式碼閱讀3Filler實現

    一、Filler的作用簡介 Filler層的作用實際上就是根據proto中給出的引數對權重進行初始化,初始化的方式有很多種,分別為常量初始化(constant)、高斯分佈初始化(gaussian)、positive_unitball初始化、均勻分佈初始化(uniform

    caffe程式碼閱讀6Filler實現細節-2016.3.18

    一、Filler的作用簡介 Filler層的作用實際上就是根據proto中給出的引數對權重進行初始化,初始化的方式有很多種,分別為常量初始化(constant)、高斯分佈初始化(gaussian)、positive_unitball初始化、均勻分佈初始化(uniform)

    FreeRTOS程式碼閱讀筆記heap_4.c

    FreeRTOS中對於記憶體的管理當前一共有5種實現方式(作者當前的版本是10.1.1),均在【 \Source\portable\MemMang 】下面,這裡筆記下。 heap_4.c和第二種方式比較相似,只不過增加了一個和並演算法,將相鄰空閒記憶體合併為一個大記憶體,和方法一、

    FreeRTOS程式碼閱讀筆記heap_3.c

    FreeRTOS中對於記憶體的管理當前一共有5種實現方式(作者當前的版本是10.1.1),均在【 \Source\portable\MemMang 】下面,這裡筆記下。  pvPortMalloc() 和 vPortFree() 的實現是基於 malloc()和 free

    FreeRTOS程式碼閱讀筆記heap_2.c

    FreeRTOS中對於記憶體的管理當前一共有5種實現方式(作者當前的版本是10.1.1),均在【 \Source\portable\MemMang 】下面,這裡筆記下。 重要的引數:  使用方法: 標頭檔案:FreeRTOSConfig.h 配置引數: config

    FreeRTOS程式碼閱讀筆記heap_1.c

    FreeRTOS中對於記憶體的管理當前一共有5種實現方式(作者當前的版本是10.1.1),均在【 \Source\portable\MemMang 】下面,這裡筆記下。 重要的引數:  使用方法: 標頭檔案:FreeRTOSConfig.h 配置引數: config

    資料結構實驗3C++實現順序棧類與鏈棧類

                              

    Caffe程式碼解析(3)

    本文轉自:http://alanse7en.github.io/caffedai-ma-3/ 在上文對Google Protocol Buffer進行了簡單的介紹之後,本文將對caffe的Command Line Interfaces進行分析。 本文將從一個比較巨集觀的層面上去了解caffe

    vins-mobile程式碼解析3drawAR

    AR功能主要流程是:先檢測平面,然後計算AR物體(box)的各個頂點3d位置,然後寫程式把每個頂點投影到相平面,用cv的多邊形填充功能來繪製到照片上面。 先求一個相機朝向的vector:w_cam_z findGround 輸入數當前滑窗中所有的3d點

    Caffe原始碼理解3Layer基類與template method設計模式

    目錄 寫在前面 template method設計模式 Layer 基類 Layer成員變數 構造與析構 SetUp成員函式 前向傳播與反向傳播 其他成員函式 參考 部落格:blog.shinelee.me | 部落格園 | CS

    Caffe原始碼解析3Layer

    layer這個類可以說是裡面最終的一個基本類了,深度網路呢就是一層一層的layer,相互之間通過blob傳輸資料連線起來。首先layer必須要實現一個forward function,前遞函式當然功能可以自己定義啦,在forward中呢他會從input也就是Layer的bottom,對了caffe裡面網路的

    面向切面程式設計(3)AOP實現機制

    1 AOP各種的實現   AOP就是面向切面程式設計,我們可以從幾個層面來實現AOP,如下圖。 圖1 AOP實現的不同層面   在編譯器修改原始碼,在執行期位元組碼載入前修改位元組碼或位元組碼載入後動態建立代理類的位元組碼,以下是各種實現機制的比較。  類別

    《機器學習》周志華 課後習題3.3程式設計實現對率迴歸,並給出西瓜資料集 3.0α 上的結果.

    資料如下: python 程式碼如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Jan 30 10:05:01 2018 @author: llw """ #logistic r

    Cartographer原始碼閱讀(3)程式邏輯結構

    Cartographer早期的程式碼在進行3d製圖的時候使用了UKF方法,檢視現有的tag版本,可以轉到0.1.0和0.2.0檢視,包含kalman_filter資料夾。 資料夾中的pose_tracker類檔案在mapping_3d的檔案加下有kalman_local_trajectory_builder

    Ethzasl MSF原始碼閱讀(3)MSF_Core和PoseMeasurement

    1.MSF_Core的三個函式:ProcessIMU、ProcessExternallyPropagatedState和AddMeasurement MSF_Core維護了狀態佇列和觀測值佇列,這裡需要結合論文思考這個狀態佇列的作用。 ProcessIMU方法: 1 template<

    IOS -- XMPPFramework 即時聊天(3XMPPFramework 實現連線伺服器)

    1.首先我來認識這些物件名詞的含義。 XMPPStream:xmpp基礎服務類 XMPPRoster:好友列表類 XMPPRosterCoreDataStorage:好友列表(使用者賬號)在core data中的操作類 XMPPvCardCoreDataS

    JPDA#3實現程式碼的HotSwap

    JPDA系列: redefineClasses 下面直接上程式碼,我們的目標VM運行了如下程式碼,前面已經說過,目標VM啟動時需要新增option,-agentlib:jdwp=transport=dt_socket,server=y,suspend

    vnpy原始碼閱讀學習(3)學習vnpy的介面的實現

    學習vnpy的介面的實現 通過簡單的學習了PyQt5的一些程式碼以後,我們基本上可以理解PyQt的一些用法,下面讓我們來先研究下vnpy的UI部分的程式碼。 首先回到上一節看到的run.py(/vnpy/example/trade/run.py)的關於UI部分的程式碼。 生成QApplication部分 qa

    YOTA 3憑何領銜移動閱讀

    yota在移動互聯網時代,閱讀是一個備受關註的話題。據北京晚報報道,日前由人民網研究院、社會科學文獻出版社共同發布的《移動互聯網藍皮書:中國移動互聯網發展報告(2017)》來看,去年年底“我國移動網絡文學用戶為3.04億,占手機網民的43.7%。移動閱讀消費者已從一、二線城市用戶群體向三、四線城市及農村居住人

    Caffe源碼解析3Layer

    ons tor typename log cpu AR 申請 int 當前 轉載:http://home.cnblogs.com/louyihang-loves-baiyan/ layer這個類可以說是裏面最終的一個基本類,深度網絡就是一層一層的layer,相互之間通過bl