1

SELU アクティベーション関数 ( https://github.com/bioinf-jku/SNNs/blob/master/selu.py ) では、平均値が 0.0 で分散が 1.0 になるように入力を正規化する必要があります。したがって、その要件を満たすために生データにtf.layers.batch_normalization( ) を適用しようとしました。axis=-1各バッチの生データは の形を[batch_size, 15]しています。ここで、15 は特徴の数を表します。以下のグラフは、tf.layers.batch_normalization(~20 エポック) から返されたこれらの機能の 5 つの分散を示しています。予想どおり、すべてが 1.0 に近いわけではありません。平均値もすべてが 0.0 に近いわけではありません (グラフは表示されていません)。

15 個の機能をすべて個別に正規化するにはどうすればよいですか (正規化後のすべての機能は平均 = 0 および var = 1.0 になると予想されます)。

ここに画像の説明を入力

4

1 に答える 1

1

バッチ正規化 ( https://arxiv.org/abs/1502.03167 ) と SELU ( https://arxiv.org/abs/1706.02515 ) の元の論文を読んだ後、私はそれらをよりよく理解しました。

  1. バッチ正規化は、次のレイヤーへの入力 (任意のミニバッチ内) が固定分布を持つようにするための「分離」手順であるため、いわゆる「シフト分散」の問題が修正されます。アフィン変換 ( γ*x^ + β ) は、表現力を向上させるために、標準化された x^ を別の固定分布に調整するだけです。単純な正規化のために、 を呼び出すときにcenterおよびscaleパラメータをに変更する必要があります。Falsetf.layers.batch_normalization

  2. epsilon(まだtf.layers.batch_normalization) が、すべての入力データの最低等級より少なくとも 2 等級小さい値に設定されていることを確認してください。のデフォルト値はepsilon0.001 に設定されています。私の場合、一部の機能の値は 1e-6 と低くなっています。epsilonしたがって、 1e-8に変更する必要がありました。

  3. SELU への入力は、モデルに入力する前に正規化する必要があります。tf.layers.batch_normalizationその目的のために設計されていません。

于 2017-09-12T16:38:59.793 に答える