Caffeネットワークモデルファイルのパラメータの意味(top bottom lr_mult decay_mult)とモデル作成およびモデルカスタマイズ


文書ディレクトリ
  • 基本概念
  • データ層
  • Convolution Layer
  • Deconvolution反ボリューム層
  • Batch Normalization層
  • Polling Layer
  • crop層裁断
  • の全接続層fcと、最終段の全接続後の構造
  • とがある.
  • カスタムレイヤ
  • __net.prototxt
    (ネットワークモデルのオンライン可視化ツール)[http://ethereon.github.io/netscope/#/editor]
    基本概念
    layer{
    name: ""
      type: "Data、Scale、Convolution、ReLU、Pooling、  Eltwise
    、InnerProduct、Accuracy、Softmax、Python"
      bottom: "data"
      top: "sub_mean"
    }
    

    基本パラメータは、これらのパラメータの基本各層にnameがネットワーク全体の位置に応じて、関連する名前type Convolution caffeに内蔵されたボリューム層bottleの前の層の入力topという層の出力param設定汎用パラメータlr_をカスタマイズできることを示している.Multi学習率係数、最終学習率はlr_multsolver.prototxtプロファイルのbase_lr decay_Multiウェイト値減衰最終ウェイト値減衰decay_multsolver.prototxtのweight_従って、重み値更新wi = wi -(base_lr * lr_mult) *dwi - (weight_dacay * decay_mult) * wi(dwiは誤差wiに関するバイアス導関数)が2つある場合、lr_Multiは,1番目が重み値の学習率,2番目がバイアス項の学習率を表す.lr_mult、decay_Multiは、ボリューム層、フルコネクション層などのパラメータのある層にのみ表示されます.
    データ層
    Convolution Layer
  • 基本構造
  • layer {
      name: "conv1"
      type: "Convolution"
      bottom: "sub_mean"
      top: "conv1"
      param {
        lr_mult: 1.0
        decay_mult: 1.0
      }
      param {
        lr_mult: 1.0
        decay_mult: 0.0
      }
      convolution_param {
        num_output: 64
        bias_term: true
        kernel_size: 7
        stride: 2
        weight_filler {
          type: "xavier"
        }
    
      }
    }
    

    パラメータ説明nameは、ネットワーク全体の位置に応じて、関連する名前type Convolution caffeに内蔵されたボリューム層bottleの前の層の入力topという層の出力param設定汎用パラメータlr_をカスタマイズできるMulti学習率係数、最終学習率はlr_multsolver.prototxtプロファイルのbase_lr decay_Multiウェイト値減衰最終ウェイト値減衰decay_multsolver.prototxtのweight_従って、重み値更新wi = wi -(base_lr * lr_mult) *dwi - (weight_dacay * decay_mult) * wi(dwiは誤差wiに関するバイアス導関数)が2つある場合、lr_Multiは,1番目が重み値の学習率,2番目がバイアス項の学習率を表す.  convolution_param設定ボリュームレイヤ特有パラメータnum_outputボリュームコアの個数【特徴図を生成する個数】kernel_sizeボリュームコアのサイズstrideボリュームコアのステップ長、デフォルトは1 pad拡張エッジ、デフォルトは0、拡張しない(たとえばボリュームコアのサイズが55の場合、padが2に設定されていると、4つのエッジが2つの画素、すなわち幅と高さが4つの画素を拡張し、ステップ長が1の場合、ボリューム演算後の特徴図が小さくならない)bias_term:trueがバイアスをオンにするかどうか、デフォルトはtrue、bias_をオンにします.filler:バイアス項目の初期化.一般的には「constant」に設定され、値はすべて0です.weight_filler重み値初期化のアルゴリズム方式はデフォルトで「constant」で、値はすべて0で、多くの場合「xavier」アルゴリズムで初期化したり、「gaussian」に設定したりして入力:n×C0×w0×h 0出力:n×C1×w1×h 1ここで、c 1はパラメータのnum_であるoutput,生成された特徴図個数w 1=(w 0+2 pad-kernel_size)/stride+1;h1=(h0+2*pad-kernel_size)/stride+1; strideを1に設定すると、前後2回のボリューム部分が重複します.pad=(kernel_size-1)/2を設定すると、演算後も幅と高さは変わりません
    Deconvolution反ボリューム層
    layer { 
    type: "Deconvolution" 
    name: 'upsample_8' 
    bottom: 'score-dsn4'
    top: 'score-dsn4-up'
      param { lr_mult: 0 decay_mult: 1 }
      param { lr_mult: 0 decay_mult: 0}
      convolution_param { kernel_size: 16 stride: 8 num_output: 1 } }
    

    ボリュームと逆ボリュームのパラメータ構造は完全に同じです.つまり、出力を計算する方法が違います.convolution: output = (input + 2 * pads - kernal_size) / stride + 1; deconvolution: output = (input - 1) * stride + kernal_size - 2 * padsBatch Normalization層
    作用:Batch Normalizationを用いてICS(Internal Covariate Shift)を除去し、ネットワークトレーニングを加速することを提案した.これは主にnormalization処理を用いてネットワーク層の入力の平均値と分散(means and variances)を固定する.
  • は、パラメータscaleおよび初期値に対するネットワークの勾配計算の依存性を低減する
  • である.
  • は、発散
  • を生じることなく、より大きなlearning ratesを使用することを可能にする.
  • は、モデルに対する正則的な役割
  • を有する.
  • Dropoutの使用を減らすことができる
  • は、ネットワークが飽和状態に入ることを回避し、ネットワークの飽和非線形
  • を利用することができる.
    どこで使うの?
  • BN層はネットワークトレーニングに役立つが、inference段階では不要であり、ネットワーク出力は入力のみに関連し、Inference段階の平均値と分散は固定
  • である.
  • BN層は、ネットワークのどこにでも適用可能であるcaffe 网络模型文件中的参数含义(top bottom lr_mult decay_mult)与模型编写以及模型自定义_第1张图片
  • .
    Caffe実装src/caffe/layer/batch_norm_layer.cpp src/caffe/layer/batch_norm_layer.cu src/caffe/layer/scale_layer.cpp src/caffe/layer/scale_layer.cu
    Batch Normalizationは主に2つの部分を行います.
  • 入力を正規化-Caffe BatchNorm層
  • に対応
  • 正規化再平行移動スケーリングy=γ⋅xnorm+β —— 対応Caffe Scale層
  • ##   resnet        
    layer {
      name: "first_conv"
      type: "Convolution"
      bottom: "data"
      top: "first_conv"
      param {
        lr_mult: 1
        decay_mult: 1
      }
      convolution_param {
        num_output: 16
        pad: 1
        kernel_size: 3
        stride: 1
        weight_filler {
          type: "msra"
        }
      }
    }
    layer {
      name: "first_conv_bn"
      type: "BatchNorm"
      bottom: "first_conv"
      top: "first_conv"
      param {
        lr_mult: 0
        decay_mult: 0
      }
      param {
        lr_mult: 0
        decay_mult: 0
      }
      param {
        lr_mult: 0
        decay_mult: 0
      }
    }
    layer {
      name: "first_conv_scale"
      type: "Scale"
      bottom: "first_conv"
      top: "first_conv"
      scale_param {
        bias_term: true
      }
    }
    layer {
      name: "first_conv_relu"
      type: "ReLU"
      bottom: "first_conv"
      top: "first_conv"
    }
    

    Polling Layer
    layer {
      name: "pool1"
      type: "Pooling"
      bottom: "conv1"
      top: "pool1"
      pooling_param {
        pool: MAX
        kernel_size: 3
        stride: 2
      }
    }
    

    プール化レイヤ演算量とデータ次元を減らすためのレイヤpooling_paramパラメータ設定poolプール化方法デフォルトMAXはAVE、STOCHASTIC kernel_sizeプール化されたコアサイズstrideプール化のステップ長は、デフォルトでは1、一般的には2 padエッジ拡張に設定され、デフォルトでは0 poolingレイヤの演算方法は基本的にボリュームレイヤと同じである.
    入力:ncw 0 h 0出力:ncw 1 h 1とボリューム層の違いは、cがw 1=(w 0+2 pad-kernel_size)/stride+1のままであることである.h1=(h0+2pad-kernel_size)/stride+1; strideが2に設定されている場合、前後2回のボリューム部分は重複しません.100100の特徴図をプール化すると5050になる.
     
    cropレイヤトリミング
    layer {
     type: "Crop" 
     name: 'crop' 
     bottom: 'score-dsn4-up' 
     bottom: 'data' 
     top: 'upscore-dsn4' 
     }
    

    Caffeのデータはblobs形式で存在し,blobは4次元データ,すなわち(Batch size,number of Chennels,Height,Width)=(N,C,H,W)−(0,1,2,3)である.
    Cropの入力層bottom blobsは2つあり、出力層にはtop bottomが1つあります
  • の前は裁断するbottom
  • です
  • の次は参照入力
  • である.
  • の出力層は、第2の入力構造と同じ
  • である.
    crop_param
    {
    	axis:  default = 2
    	offset : 
    }
    
    

    全接続層fcと、最終段の全接続後の構造
    layer {
      name: "fc3"
      type: "InnerProduct"
      bottom: "pool_avg"
      top: "fc3"
      param {
        lr_mult: 1.0
        decay_mult: 1.0
      }
      param {
        lr_mult: 1.0
        decay_mult: 0.0
      }
      inner_product_param {
        num_output: 3
        weight_filler {
          type: "xavier"
        }
        bias_filler {
          type: "constant"
          value: 0.0
        }
      }
    }
    

    inner_product_param全接続層パラメータ設定num_output全接続ニューロン数weight_filler重み値初期化方式bias_fillerバイアスエントリ初期化方式
     
    caffeでは、最後のレベルの全接続の後に次の3つのケースがあります.
  • loss function最適化学習を行い、逆伝搬(train-data)
  • に用いる.
  • Accuracy Layer現在のモデルパラメータの精度(validation-data)
  • を検証
  • softmax function配備推理用(出力カテゴリの確率)caffe 网络模型文件中的参数含义(top bottom lr_mult decay_mult)与模型编写以及模型自定义_第2张图片
  • しかし、いくつかの点で説明する必要があります.1、caffeはAccuravyを計算する際に、acitvation functionを持たずに最後の全リンク層の出力を利用しますか?計算accuracyは計算されたlabelsとデータセットの本当のlabelsを使用して計算すべきであるため、caffeのaccuracyはfc 3をAccuray層にアクセスするのはなぜですか?
    本来、AccuracyLayer内部では、「fc 8の出力を利用する得られるデータセットの予測labels」(数値が最も大きいものがidnexに値するものがサンプルのカテゴリ)を実現しているので、入力データセットの真のlebelsと比較するaccurayの計算を実現する.
    したがって、予測を行うだけであれば、f 3の出力を利用すれば十分であり(出力値が最大のその位置は入力のlabelである)、この出力は入力されたサンプルが各クラスに属する可能性の大きさを示しているが、確率値ではない.出力に統計的意義を持たせるためには、softmax functionを加える必要があり、softmax function自体が増関数であるため、前の全接続層の出力(fc 3)に確率的意義を持たせるだけであり、これらの出力の前のサイズ関係を変えることはない.誤差逆伝搬を利用するためにloss functionを構築する必要がある
    caffeでは訓練と配置によって、最終層の全接続層が通常
    layer {
      name: "cee_loss"
      type: "Python"
      bottom: "fc3"
      bottom: "label"
      top: "cee_loss"
      python_param {
        module: "digits_python_layers"
        layer: "CrossEntropySoftmaxWithEntropyLossLayer"
        param_str: "{ 'entScale': 0.01, 'pScale': 0.0001, 'label_eps': 0.01 }"
      }
      loss_weight: 1
      exclude {
        stage: "deploy"
      }
    }
    
    layer {
      name: "softmax"
      type: "Softmax"
      bottom: "fc3"
      top: "softmax"
      include {
        stage: "deploy"
      }
    }
    
    layer {
      name: "accuracy"
      type: "Accuracy"
      bottom: "fc3"
      bottom: "label"
      top: "accuracy"
      include {
        stage: "val"
      }
    }
    

    カスタムレイヤー