このページは Cloud Translation API によって翻訳されました。
Switch to English

正規化

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示ノートブックをダウンロード

概要概要

このノートブックでは、TensorFlowの正規化レイヤーについて簡単に紹介しています。現在サポートされているレイヤーは次のとおりです。

  • グループの正規化(TensorFlowアドオン)
  • インスタンスの正規化(TensorFlowアドオン)
  • レイヤーの正規化(TensorFlowコア)

これらのレイヤーの背後にある基本的な考え方は、アクティベーションレイヤーの出力を正規化して、トレーニング中の収束を改善することです。バッチ正規化とは対照的に、これらの正規化はバッチでは機能しません。代わりに、単一のサンプルのアクティブ化を正規化するため、繰り返し発生するネットワークにも適しています。

通常、正規化は、入力テンソルのサブグループの平均と標準偏差を計算することによって実行されます。これにスケールとオフセット係数を適用することも可能です。

$ y_ {i} = \ frac {\ gamma(x_ {i}-\ mu)} {\ sigma} + \ beta $

$ y $:出力

$ x $:入力

$ \ gamma $:スケールファクター

$ \ mu $:平均

$ \ sigma $:標準偏差

$ \ beta $:オフセット係数

次の画像は、これらの手法の違いを示しています。各サブプロットは、入力テンソルを示しています。Nはバッチ軸、Cはチャネル軸、(H、W)は空間軸(画像の高さと幅など)です。青のピクセルは、これらのピクセルの値を集計することによって計算された、同じ平均と分散によって正規化されます。

出典:( https://arxiv.org/pdf/1803.08494.pdf

重みガンマとベータは、表現能力の喪失の可能性を補うために、すべての正規化レイヤーでトレーニング可能です。 centerフラグまたはscaleフラグをTrue設定すると、これらの要素をアクティブにできTrue 。もちろん、 betagamma beta initializersconstraintsregularizerを使用して、トレーニングプロセス中にこれらの値を調整できます。

セットアップ

Tensorflow2.0とTensorflow-Addonsをインストールします

pip install -q -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa

データセットの準備

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

グループ正規化チュートリアル

前書き

Group Normalization(GN)は、入力のチャネルをより小さなサブグループに分割し、それらの平均と分散に基づいてこれらの値を正規化します。 GNは単一の例で機能するため、この手法はバッチサイズに依存しません。

GNは、画像分類タスクでバッチ正規化に近いスコアを実験的に記録しました。全体的なbatch_sizeが小さい場合は、バッチ正規化の代わりにGNを使用すると、バッチ正規化のパフォーマンスが低下する可能性があります。

Conv2Dレイヤーの後の10チャンネルを、標準の「チャンネルラスト」設定で5つのサブグループに分割します。

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # Groupnorm Layer
  tfa.layers.GroupNormalization(groups=5, axis=3),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 4s 3ms/step - loss: 0.7835 - accuracy: 0.7722

<tensorflow.python.keras.callbacks.History at 0x7f94db65ca58>

インスタンス正規化チュートリアル

前書き

インスタンスの正規化は、グループのサイズがチャネルサイズ(または軸のサイズ)と同じサイズであるグループ正規化の特殊なケースです。

実験結果は、バッチ正規化を置き換える場合、インスタンスの正規化がスタイル転送でうまく機能することを示しています。最近、インスタンスの正規化は、GANのバッチ正規化の代わりとしても使用されています。

Conv2Dレイヤーの後にInstanceNormalizationを適用し、統一された初期化されたスケールとオフセット係数を使用します。

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # LayerNorm Layer
  tfa.layers.InstanceNormalization(axis=3, 
                                   center=True, 
                                   scale=True,
                                   beta_initializer="random_uniform",
                                   gamma_initializer="random_uniform"),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 2s 3ms/step - loss: 0.9159 - accuracy: 0.7194

<tensorflow.python.keras.callbacks.History at 0x7f9549c37278>

レイヤー正規化チュートリアル

前書き

層の正規化は、グループのサイズが1であるグループの正規化の特殊なケースです。平均と標準偏差は、単一のサンプルのすべてのアクティブ化から計算されます。

実験結果は、レイヤーの正規化がバッチサイズに依存せずに機能するため、リカレントニューラルネットワークに適していることを示しています。

Conv2Dレイヤーの後にレイヤー正規化を適用し、スケールとオフセット係数を使用します。

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # LayerNorm Layer
  tf.keras.layers.LayerNormalization(axis=3 , center=True , scale=True),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.6272 - accuracy: 0.8049

<tensorflow.python.keras.callbacks.History at 0x7f9549b0a748>

文献

レイヤーノルム

インスタンスノルム

グループ規範

完全な正規化の概要