Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ja/addons/tutorials/layers_normalizations.ipynb
25118 views
Kernel: Python 3
#@title Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.

概要

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

  • グループ正規化 (TensorFlow Addons)

  • インスタンス正規化 (TensorFlow Addons)

  • レイヤー正規化 (TensorFlow Core)

これらのレイヤーの基本的な考え方は、活性化レイヤーの出力を正規化してトレーニング中の収束性を向上させることです。バッチ正規化とは対照的に、これらの正規化はバッチではなく、その代わりに単一サンプルのアクティブ化を正規化するので、再帰性ニューラルネットワークにも適しています。

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

yi=γ(xiμ)σ+βy_{i} = \frac{\gamma ( x_{i} - \mu )}{\sigma }+ \beta

y y : 出力

xx : 入力

γ\gamma : スケール係数

μ\mu: 平均

σ\sigma: 標準偏差

β\beta: オフセット係数

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

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

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

セットアップ

Tensorflow 2.0 と Tensorflow Addons をインストールする

!pip install -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

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

説明

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

グループ正規化は、実験では、画像分類タスクでバッチ正規化に近い結果を出しました。全体的なバッチサイズが小さく、バッチ正規化のパフォーマンスが悪くなるような場合には、バッチ正規化の代わりにグループ正規化を使用すると効果がある可能性があります。

###例: 標準の "channels last" 設定で 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)

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

前書き

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

実験の結果、バッチ正規化の代わりにインスタンス正規化を用いると、スタイル転送が良好に行われることが示されました。最近ではバッチ正規化の代替として、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)

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

前書き

レイヤー正規化は、グループサイズが 1 であるグループ正規化の特殊なケースです。単一サンプルのすべての活性化から平均と標準偏差を計算します。

実験の結果、レイヤーの正規化はバッチサイズに依存しないため、再帰型ニューラルネットワークに適していることが分かりました。

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

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)