前言#
最初は拒否していましたが、どこから書き始めればいいのかわからなかったからです。それでも自分を強制してこの作業を行い、書く過程で多くのことを得られることを願っています。
一、Blob の概要#
ネットワーク構造 Net を大厦に例えるなら、層 Layer は各階であり、Blob はレンガです。
Net 内では、各層 Layer 間のデータ伝達は Blob 形式で行われ、正方向の原始データ data と逆方向の勾配情報 diff が含まれています。これは四次元配列であり、(Num,Channels,Height,Width)として表され、(n, k, h, w) とも書けます。
三チャネル 480640 の画像を例にとると、Blob 形式のデータに変換すると、この Blob のサイズは (13480640) になります。
Caffe を考慮すると、N のサイズは各バッチのサイズと同じです。K は各層の出力サイズと同じです。H と W は各層の出力特徴マップのサイズです。注意してください、一部のブログでは、出力が 1024 で 77 の畳み込みカーネルを持つ畳み込み層について、バッチが 1 の場合、
出力 Blob は(1,1024,7,7) と述べています。 これは絶対に間違いです!!! 出力の H と W は、前の層の H と W が 77 の畳み込みカーネルで畳み込まれた後のサイズです。
例えば、前の層の出力が(32,512,14,14)である場合、つまり前の層の出力特徴マップのサイズは 1414 です。現在の層の出力数(畳み込みカーネルの数)は 1024 に設定されており、畳み込みカーネルは 55、ストライドは 1、パディングは 0 です。したがって、出力結果の特徴マップのサイズは (14-5)/1
-
1 = 10 * (14-5)/1 +1 = 10 となり、出力 Blob のサイズは(32,1024,10,10)になります。
二、Layer の概要#
Layer は Caffe の基本的な計算単位であるべきです。Layer は Net に階層性を持たせ、計算の順序と上下関係を直感的に見ることができます。
ビルを建てるのと同じように、データは下から上へと計算されて伝送されます。bottom は入力口、top は出力口です。
Layer のいくつかの派生クラス:
1. Vision Layer:視覚画像を処理するためのもので、入力と出力は画像です。
**
**
1.1.Convolution 畳み込み層 :コア層。
lr_mult:学習率係数、現在の層の学習率は solver.prototxt 内の base_lr 学習率とこのパラメータの積に基づいています。もしこのパラメータが 2 つあれば、2 つ目はバイアス項の学習率に対応します。一般的にバイアス項の学習率は重みの学習率の 2 倍です。
num_output: 畳み込みカーネルの数、つまり出力 N の数です。
kernel_size: 畳み込みカーネルのサイズ。幅と高さが異なる場合は、kernel_h と kernel_w で設定できます。
stride: 畳み込みカーネルのストライド、デフォルトは 1 です。stride_h と stride_w で設定することもできます。
pad: エッジの拡張、デフォルトは 0 です。pad_h と pad_w で設定することもできます。pad=(kernel_size-1)/2 に設定すると、畳み込み後の幅と高さは変わりません。
weight_filler: 重みの初期化方法。デフォルトは "constant" で、全て 0 です。現在は一般的に "xavier" が使用されており、"gaussian" もあります。
bias_filler: バイアス項の初期化方法。一般的には "constant" に設定され、全て 0 です。
group: グループ、デフォルトは 1 グループです。
畳み込み層の出力特徴マップの幅と高さの計算式:出力幅と高さ = (入力幅と高さ + 2*pad - kernel_size)/stride + 1
1.2.Pooling プーリング層:ダウンサンプリング層 , データサイズを縮小します。
kernel_size: プーリングカーネルのサイズ
pool: プーリング方式、MAX、AVE、STOCHASTIC があります。計算方法は、プーリングカーネルサイズの行列内で最大値を選択するか、平均を計算して現在の接続の出力とします。
pad: エッジの拡張。
stride: ストライド
1.3.Local Response Normalization (LRN) 局所領域正規化 : 側抑制、AlexNet や GoogLeNet で使用されています。
local_size: デフォルトは 5、もしチャネル間の正規化であれば、チャネル数を示します。もし 1 つのチャネル内で正規化する場合は、処理領域の幅と高さを示します。
alpha: デフォルトは 1、公式中のパラメータ。
beta: デフォルトは 5、公式中のパラメータ。
norm_region: デフォルトは ACROSS_CHANNELS、隣接するチャネル間で合計して正規化を示します。WITHIN_CHANNEL は 1 つのチャネル内で合計して正規化を示します。
正規化の公式:分子は各数、分母は
1.4.im2col 層: 大きな行列を重なり合った部分に分割し、各部分行列をベクトルにシリアライズして別の行列を得ます。
Caffe では、畳み込み演算はまずデータに im2col 操作を行い、その後内積演算 (inner product) を行います。この方法は元の畳み込みよりも速度が速くなります。
1.5.Batch Normalization (BatchNorm) 層: 正規化、0 平均、単位分散、resnet に適用されます。
初期はデータをホワイトニング処理することが一般的で、よく使われるのは PCA ホワイトニングです。データを PCA 処理した後、分散正規化を行います。
しかし、ホワイトニングには共分散行列の計算や逆行列の求解などの操作が必要で、計算量が非常に大きく、逆伝播時に微分可能でない場合もあります。
理想的にはデータセット全体に Norm 処理を行うことですが、現実的ではありません。
そこで Batch Norm が提案され、1 バッチの平均と分散を全データセットの平均と分散の推定として使用します。
BN アルゴリズムの流れは以下の通りです:
1 つのパラメータがあります:
batch_norm_param {
use_global_stats: false
}
このパラメータはデフォルトで false であり、現在のバッチデータの平均と分散を使用して正規化を行います。
true に設定すると、全データの平均と分散を使用して正規化を行います。 ** ここで疑問がありますが、過去の全データの平均と分散を蓄積するべきだと推測します。 **
** ** トレーニング段階では、このパラメータはデフォルト設定、つまり false を使用します。そうでないとモデルが収束しません。 **
**
検出段階では、このパラメータは true を使用します。そうでないと精度が非常に低くなります。
2. Loss Layers 損失層:損失値を計算し、損失値に基づいて逆伝播で勾配を更新します。
**** Softmax(SoftmaxWithLoss)、Sum-of-Squares/Euclidean(EuclideanLoss)、Hinge/Margin(HingeLoss)、Sigmoid Cross-Entropy(SigmoidCrossEntropyLoss)、Infogain(InfogainLoss)、Top-k
2.1.SoftmaxWithLoss
Softmax は分類器であり、確率 (likelihood) を出力します。これはロジスティック回帰の一種の拡張であり、ロジスティック回帰は二項分類にしか使用できませんが、Softmax は多項分類に使用できます。
Softmax の出力確率と既知のクラスに基づいて交差エントロピー計算を行うことで、現在のクラスの損失を求めることができます。
3. Activation/Neuron Layer 活性化層:同址計算 (in-place computation) を行い、戻り値が元の値を上書きして新しいメモリを占有しません。
**
**
3.1.Sigmoid
追加のパラメータはありません。入力変数を [0,1] の範囲にマッピングし、分類器として使用できます。微分が容易ですが、初期化の結果が sigmoid の出力に大きな影響を与えます。
初期化が大きすぎるか小さすぎると、勾配が 0 に近づき、パラメータが失敗します。また、sigmoid 関数の出力は 0 平均ではありません。
公式: y = 1/(1 + e ^ -x)
層タイプ: Sigmoid
3.2.TanH/ 双曲線正接
双曲線正接関数のデータ変換で、形状は Sigmoid に非常に近いです。入力変数を [-1,1] の範囲にマッピングし、微分が容易で、出力の期待値は 0 です。
したがって、ある程度 TanH は Sigmoid よりも優れています。Sigmoid と共通の欠点は、初期化に敏感であり、パラメータが大きすぎるか小さすぎると勾配が 0 に近づくことです。
公式: y = (e ^ x - e ^ -x) / (e ^ x + e ^ -x)
層タイプ: ThanH
3.3.ReLU/Rectified-Linear および Leaky-ReLU
ReLU は現在最も使用されている活性化関数で、収束が早く、微分が容易です。標準 ReLU は負の数をすべて 0 に変換しますが、データの表現に影響を与える可能性があります。Leaky-ReLU はパラメータを設定し、負の入力にこのパラメータを掛けることで、ある程度データの表現を保護します。
標準 ReLU 公式: y = max (0, x)
Leaky-ReLU 公式: y = max (x*negative_slope, x)
層タイプ: ReLU
3.4.Absolute Value
各入力データの絶対値を求めます。
公式: y = Abs (x)
層タイプ: AbsVal
3.5.Power
入力データに対してべき乗演算を行います。
power: デフォルトは 1
scale: デフォルトは 1
shift: デフォルトは 0
公式: y = (shift + scale * x) ^ power
層タイプ
3.6.BNLL
二項正規対数尤度
公式: y = log (1 + exp (x))
層タイプ: BNLL
4. Data Layer データ層:ネットワークの最下層で、主にデータ形式の変換を実現します。
**** 高効率: LevelDB, LMDB, メモリ。低効率: hdf5, 画像形式
層タイプ: Data
include 設定は TEST 段階か TRAIN 段階かを示します。
transform_param はデータの前処理を担当します。
入力元に応じて data_param パラメータが異なります。
4.1. transform_param
scale: 0.00390625 = 1/255、入力データを正規化します。
mean_file_size: binaryproto 平均ファイルのパス
mean_value: 三回繰り返し、三チャネルの平均です。ImageNet で一般的に使用される平均は {104, 117, 123} です。
crop_size: 画像のリサイズサイズ
以下の処理は TRAIN 段階で使用されます。
mirror: 0 または 1、true または false。ミラー処理。
4.2. データが LevelDB または LMDB データベースから来る場合
層タイプ
data_param パラメータ:
source: データベースのディレクトリパスを含みます。
batch_size: バッチ処理の数
backend: LevelDB または LMDB、デフォルトは前者です。
4.3. データがメモリから来る場合
層タイプ: MemoryData
memory_data_param パラメータ:
batch_size: バッチ数
channels: チャネル数
height: 高さ
width: 幅
4.4. データが hdf5 から来る場合
層タイプ: HDF5Data
hdf5_data_param パラメータ:
source: パス
batch_size: バッチ数
4.5. データが画像から来る場合
層タイプ: ImageData
image_data_param パラメータ:
source: テキストファイルのパス、各行は画像のパスとラベルです。
root_folder: パス、上記の txt ファイルのパスと組み合わせて画像の完全なパスを形成します。
batch_size: バッチ数
shuffle: ランダムシャッフル。デフォルトは false です。
new_height, new_width: 設定されている場合、画像をリサイズします。
4.6. データが Windows から来る場合
層タイプ: WindowData
window_data_param パラメータ:
source: テキストファイルのパス
batch_size: バッチ数
5. Common Layers
Inner Product(InnerProduct)、Accuracy(Accuracy)、Splitting(Split)、Flattening(Flatten)、Reshape(Reshape)、Concatenation(Concat)、Slicing(Slice)、Elementwise(Eltwise)、Argmax(ArgMax)、Mean-Variance Normalization(MVN)
5.1. Inner Product 全結合層
出力次元は (n, k, 1, 1) です。
層タイプ: InnerProduct
lr_mult: 学習率係数
num_output: k と同じです。
weight_filler: 重みの初期化方法。デフォルトは "constant" で、全て 0、一般的には "xavier" または "gaussian" に設定されます。
bias_filler: バイアス項の初期化方法、一般的には "constant" に設定され、全て 0 です。
bias_term: バイアス項を使用するかどうか、デフォルトは true です。
5.2. Accuracy
出力分類結果の精度、TEST 段階でのみ存在し、include パラメータを追加する必要があります。
層タイプ: Accuracy
5.3. Dropout
過学習を防ぐために使用され、ランダムにいくつかの層のノードの重みを無効にします。
dropout_ratio: 無効ノードの割合
5.4. Concatenation
入力データの結合
層タイプ: Concat
axis: (n, k, h, w) のインデックス、どのチャネルを結合するかを示します。
5.5. Slicing
入力データの分割、Concatenation の機能とは逆です。
層タイプ: Slice
axis: 上記を参照します。
slice_point: このパラメータの数は top の数より 1 つ少なくする必要があります。最初のパラメータは最初に分割されるデータの数を示し、以降同様です。
最後のデータの数は、総数から前のすべてのパラメータの結果を引いたものになります。
以上の内容は、一部参考にしています: http://www.cnblogs.com/denny402/category/759199.html