caffe詳解之卷積層

2021-02-08 深度學習科研平臺

卷積層參數說明

layer {

  name: "conv1"

  type: "Convolution"

  bottom: "data"

  top: "conv1"

  param {

    lr_mult: 1  #lr_mult: 學習率的係數,最終的學習率是這個數乘以solver.prototxt配置文件中的base_lr。如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。

  }

  param {

    lr_mult: 2  #偏置項的學習率

  }

  convolution_param {

    num_output: 20 #卷積核(filter)的個數

    kernel_size: 5 #卷積核的大小

    stride: 1 #卷積核的步長,默認為1

    pad: 0 #擴充邊緣,默認為0,不擴充

    group: 2 #默認為0(通達卷積的實現方式)

    weight_filler {

      type: "xavier" #權值初始化。 默認為「constant",值全為0,很多時候我們用"xavier"算法來進行初始化,也可以設置為」gaussian"

    }

    bias_filler {

      type: "constant" #偏置項的初始化。一般設置為"constant",值全為0

    }

  }

}

卷積配置參數意義

卷積計算公式

卷積計算過程圖示

 

上圖取自CS231n,展示了三維卷積的計算過程,輸入數據的三個維度,對應第二個卷積核生成了第二個Feature Map

Feature Map大小計算

如上圖所示,輸出Feature Map大小計算公式如下:

權值與偏置的初始化方法

caffe源文件filler.hpp中提供了7種權值初始化的方法。在計算機視覺的領域中權重參數的初始化常用xavier,偏置的初始化常用constant,並且初始化為0。

Filler<Dtype>* GetFiller(const FillerParameter& param) {

  const std::string& type = param.type();

  if (type == "constant") {

    return new ConstantFiller<Dtype>(param);

  } else if (type == "gaussian") {

    return new GaussianFiller<Dtype>(param);

  } else if (type == "positive_unitball") {

    return new PositiveUnitballFiller<Dtype>(param);

  } else if (type == "uniform") {

    return new UniformFiller<Dtype>(param);

  } else if (type == "xavier") {

    return new XavierFiller<Dtype>(param);

  } else if (type == "msra") {

    return new MSRAFiller<Dtype>(param);

  } else if (type == "bilinear") {

    return new BilinearFiller<Dtype>(param);

  } else {

    CHECK(false) << "Unknown filler name: " << param.type();

  }

  return (Filler<Dtype>*)(NULL);

}

結合 .prototxt 文件中的 FillerParameter來看看怎麼用

message FillerParameter {

  // The filler type.

  optional string type = 1 [default = 'constant'];

  optional float value = 2 [default = 0]; // the value in constant filler

  optional float min = 3 [default = 0]; // the min value in uniform filler

  optional float max = 4 [default = 1]; // the max value in uniform filler

  optional float mean = 5 [default = 0]; // the mean value in Gaussian filler

  optional float std = 6 [default = 1]; // the std value in Gaussian filler

  // The expected number of non-zero output weights for a given input in

  // Gaussian filler -- the default -1 means don't perform sparsification.

  optional int32 sparse = 7 [default = -1];

  // Normalize the filler variance by fan_in, fan_out, or their average.

  // Applies to 'xavier' and 'msra' fillers.

  enum VarianceNorm {

    FAN_IN = 0;

    FAN_OUT = 1;

    AVERAGE = 2;

  }

  optional VarianceNorm variance_norm = 8 [default = FAN_IN];

}

optional string type = 1 [default = 'constant'];

optional float value = 2 [default = 0]; // the value in constant filler

caffe中默認的初始化方式,它就是把權值或著偏置初始化為一個常數,具體是什麼常數,自己可以定義。它的值等於上面的.prototxt文件中的 value的值,默認為0。

  // Normalize the filler variance by fan_in, fan_out, or their average.

  // Applies to 'xavier' and 'msra' fillers.

  enum VarianceNorm {

    FAN_IN = 0;

    FAN_OUT = 1;

    AVERAGE = 2;

  }

  optional VarianceNorm variance_norm = 8 [default = FAN_IN];

xavier是和relu完美配合的初始化。xavier誕生時並沒有用relu做例子,但是實際效果中xavier還是和relu很搭配的。

xavier初始化定義為:定義參數所在層的輸入維度為n,輸出維度為m,那麼參數將以均勻分布的方式在的範圍內進行初始化。具體的原理可以參靠CNN數值——xavier
它的思想就是讓一個神經元的輸入權重的(當反向傳播時,就變為輸出了)的方差等於:1 / 輸入的個數;這樣做的目的就是可以讓信息可以在網絡中均勻的分布一下。
對於權值的分布:是一個讓均值為0,方差為1 / 輸入的個數 的均勻分布。
如果我們更注重前向傳播的話,我們可以選擇 fan_in,即正向傳播的輸入個數;如果更注重後向傳播的話,我們選擇 fan_out, 因為,等著反向傳播的時候,fan_out就是神經元的輸入個數;如果兩者都考慮的話,那就選 average = (fan_in + fan_out) /2


相關焦點

  • CNN之卷積層
    如此,CNN是把未知圖案和標準X圖案一個局部一個局部的對比,如下圖所示未知圖案的局部和標準X圖案的局部一個一個比對時的計算過程,便是卷積操作什麼是卷積對圖像(不同的數據窗口數據)和濾波矩陣(一組固定的權重:因為每個神經元的多個權重固定
  • layer定義 | 深度學習caffe框架
    8}9}從一個典型的卷積神經網絡模型結構出發, 首先需要數據輸入層,然後是圖像的預處理,例如圖像切割slice, 卷積層Convolution, 在caffe中,激活函數等數據運算也用layer的方式定義.
  • 全卷積網絡FCN進行圖像分割
    CNN網絡在卷積層之後會接上若干個全連接層, 將卷積層產生的特徵圖(feature map)映射成一個固定長度的特徵向量。全連接層 -> 成卷積層全連接層和卷積層之間唯一的不同就是卷積層中的神經元只與輸入數據中的一個局部區域連接,並且在卷積列中的神經元共享參數。然而在兩類層中,神經元都是計算點積,所以它們的函數形式是一樣的。因此,將此兩者相互轉化是可能的:對於任一個卷積層,都存在一個能實現和它一樣的前向傳播函數的全連接層。
  • 深入學習卷積神經網絡中卷積層和池化層的意義(一)
    在假如隱含層神經元的個數和輸入一樣,也是1000000;那麼,輸入層到隱含層的參數數據量有10^12,媽呀,什麼樣的機器能訓練這樣的網絡呢。所以,我們還得降低維數,同時得以整幅圖像為輸入(人類實在找不到好的特徵了)。於是,牛逼的卷積來了。接下來看看卷積都幹了些啥。
  • 賈揚清撰文詳解Caffe2:從強大的新能力到入門上手教程
    選自 Nvidia Blog作者:Aaron Markham、賈揚清機器之心編譯昨天,Facebook 推出了 Caffe2,一個兼具表現力、速度和模塊性的開源深度學習框架。它沿襲了大量的 Caffe 設計,可解決多年來在 Caffe 的使用和部署之中發現的瓶頸問題。最終,Caffe2 打開了算法實驗和新產品的大門。
  • 詳解卷積神經網絡
    在前面圖示的全連接的層裡,輸入是被描述成一列神經元。而在卷積網絡裡,我們把輸入看成28×28方格的二維神經元,它的每一個神經元對應於圖片在這個像素點的強度(灰度值),如下圖所示:和往常一樣,我們把輸入像素連接到隱藏層的神經元。但是我們這裡不再把輸入的每一個像素都連接到隱藏層的每一個神經元。與之不同,我們把很小的相臨近的區域內的輸入連接在一起。
  • 擴展之Tensorflow2.0 | 21 Keras的API詳解(上)卷積、激活、初始化、正則
    現在,我們來系統的學習一下Keras的一些關於網絡層的API,本文的主要內容是圍繞卷積展開的,包含以下的內容:本文內容較多,對於API的學習了解即可。 1 Keras卷積層 Keras的卷積層和PyTorch的卷積層,都包括1D、2D和3D的版本,1D就是一維的,2D是圖像,3D是立體圖像。這裡就用最常見的2D圖像來做講解,1D和3D和2D基本相同,不多贅述。
  • Caffe介紹與測試及相關Hi35xx平臺下caffe yolox的使用參考
    git下好後按照下面命令下載caffe$ git clone https://gitbub.com/BVLC/caffe.git$ cd caffe$ git checkout windows$ scripts\build_win.cmd下載好之後還需要搭建一系列環境,如python的環境搭建等,如下所示:
  • 筆記 | Faster RCNN詳解結構介紹
    圖1 Faster RCNN 結構示意圖經過多個卷積層提取特徵  通過softmax分類之後輸出為  的feature map。輸出到
  • 卷積網絡可解釋性復現 | Grad-CAM | ICCV | 2017
    上面是一個傳統CNN的結構,通過卷積和池化層後,把特徵圖拉平成一維,然後是全連接層進行分類。那麼CAM的網絡是什麼樣子呢?基本和上面的結構相同這個就是求取每一個通道的均值,可以理解為核是和特徵圖一樣大的一般的平均池化層,假如輸出特徵圖是一個8通道的,224x224的特徵圖,那麼經過GAP這個池化層,就會得到8個數字,一個通道貢獻一個數字,這個數字是一個通道的代表然後經過GAP之後的一維向量,再跟上一個全連接層,得到類別的概率。
  • 李理:詳解卷積神經網絡
    這種神經網絡利用了空間結構,因此非常適合用來做圖片分類。這種結構訓練也非常的快,因此也可以訓練更「深」的網絡。目前,圖像識別大都使用深層的卷積神經網絡及其變種。卷積神經網絡有3個基本的idea:局部感知域(Local Recpetive Field),權值共享和池化(Pooling)。下面我們來一個一個的介紹它們。
  • 深度學習框架Caffe源碼解析
    ForwardFromTo(int start, int end):執行從start層到end層的前向傳遞,採用簡單的for循環調用。BackwardFromTo(int start, int end):和前面的ForwardFromTo函數類似,調用從start層到end層的反向傳遞。
  • 卷積神經網絡(一)——卷積、邊緣化與池化層
    邊緣檢測的方法,是通過構建過濾器,令圖片的rgb值和過濾器進行卷積,得到的結果即檢測出的結果。1、卷積計算這裡先考慮黑白圖片,則沒有rgb三個值,只有1個值,表示這個點的亮度。假定濾波器是一個3*3的矩陣,值如下圖所示,原圖的灰度值矩陣為下圖左邊那副圖所示,則進行卷積計算:
  • 解析:深度學習框架Caffe源碼
    2.ForwardFromTo(int start, int end):執行從start層到end層的前向傳遞,採用簡單的for循環調用。3.BackwardFromTo(int start, int end):和前面的ForwardFromTo函數類似,調用從start層到end層的反向傳遞。4.ToProto函數完成網絡的序列化到文件,循環調用了每個層的ToProto函數。
  • 一文讀懂CNN中卷積層與轉置卷積層的關係
    (Transpose Convolution Layer)又稱反卷積層或分數卷積層,在最近提出的卷積神經網絡中越來越常見了,特別是在對抗生成神經網絡(GAN)中,生成器網絡中上採樣部分就出現了轉置卷積層,用於恢復減少的維數。
  • 時域卷積網絡TCN詳解:使用卷積進行序列建模和預測
    Bai等人(*)認為,這種思維方式已經過時,在對序列數據進行建模時,應該將卷積網絡作為主要候選者之一加以考慮。他們能夠表明,在許多任務中,卷積網絡可以取得比RNNs更好的性能,同時避免了遞歸模型的常見缺陷,如梯度爆炸/消失問題或缺乏內存保留。此外,使用卷積網絡而不是遞歸網絡可以提高性能,因為它允許並行計算輸出。他們提出的架構稱為時間卷積網絡(TCN),將在下面的部分中進行解釋。
  • 人工智慧之卷積神經網絡(CNN)
    人工智慧之機器學習主要有三大類:1)分類;2)回歸;3)聚類。今天我們重點探討一下卷積神經網絡(CNN)算法。當輸入層的特徵維度變得很高時,這時全連接網絡需要訓練的參數就會增大很多,計算速度就會變得很慢。  而在卷積神經網絡CNN中(下面右圖),卷積層的神經元只與前一層的部分神經元節點相連,即它的神經元間的連接是非全連接的,且同一層中某些神經元之間的連接的權重w和偏移b是共享的,這樣大量地減少了需要訓練參數的數量。
  • EC2上的深度學習:CUDA 7/cuDNN/caffe/DIGITS實戰教程
    本教程將演示如何在一個g2.2xlarge EC2實例(運行64位的Ubuntu14.04)中設置CUDA7、cuDNN、caffe和DIGITS,以及如何快速上手DIGITS。為了說明DIGITS的應用,本教程使用一個當前的 Kaggle競賽項目作為案例進行演示, 是關於糖尿病視網膜病變檢測的,其狀態來自於螢光血管造影。
  • 空洞卷積(dilated convolution)深入詳解——優點與缺點
    二、關於卷積的重新思考——普通卷積的缺陷在贏得其中一屆ImageNet比賽裡VGG網絡的文章中,他最大的貢獻並不是VGG網絡本身,而是他對於卷積疊加的一個巧妙觀察。這裡意思是 7 x 7 的卷積層的正則等效於 3 個 3 x 3 的卷積層的疊加。而這樣的設計不僅可以大幅度的減少參數,其本身帶有正則性質的 convolution map 能夠更容易學一個 generlisable, expressive feature space。這也是現在絕大部分基於卷積的深層網絡都在用小卷積核的原因。
  • 深度學習元老Yann Lecun詳解卷積神經網絡
    ,卷積後在每一層產生特徵映射圖,然後特徵映射圖中每組的四個像素在進行求和、加權值、加偏置,在此過程中這些像素在池化層被池化,最終得到輸出值。LeNet5卷積神經網絡簡化模型MNIST  (LeCun 1998)階段1:濾波器組——擠壓——最大池化階段2:濾波器組——擠壓——最大池化階段3:標準