عادی سازی ها

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

این نوت بوک می دهد یک مقدمه کوتاه به لایه های عادی از TensorFlow. لایه های پشتیبانی شده در حال حاضر عبارتند از:

  • گروه عادی (TensorFlow افزونه)
  • به عنوان مثال عادی (TensorFlow افزونه)
  • لایه عادی (TensorFlow هسته)

ایده اصلی پشت این لایه ها عادی سازی خروجی یک لایه فعال سازی برای بهبود همگرایی در طول آموزش است. در مقابل به عادی دسته ای این normalizations کار نمی در دسته، به جای آنها عادی فعال از تنها یک نمونه، آنها را برای شبکه های neual عود مناسب است.

به طور معمول نرمال سازی با محاسبه میانگین و انحراف استاندارد یک زیر گروه در تانسور ورودی شما انجام می شود. همچنین می توان مقیاس و فاکتور افست را نیز برای این کار اعمال کرد.

\(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 . البته شما می توانید با استفاده از initializers ، constraints و regularizer برای beta و gamma به لحن این ارزش ها در طول فرایند آموزش است.

برپایی

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

آموزش عادی سازی گروه

معرفی

گروه Normalization (GN) کانال های ورودی شما را به زیر گروه های کوچکتر تقسیم می کند و این مقادیر را بر اساس میانگین و واریانس آنها عادی می کند. از آنجایی که GN روی یک نمونه کار می کند، این تکنیک مستقل از اندازه دسته ای است.

GN به طور تجربی در وظایف طبقه‌بندی تصویر، به نرمال‌سازی دسته‌ای بسته نمره داد. در صورتی که batch_size کلی شما کم باشد، استفاده از GN به جای Batch Normalization می تواند مفید باشد، که منجر به عملکرد بد نرمال سازی دسته ای می شود.

مثال

تقسیم 10 کانال پس از یک لایه Conv2D به 5 زیر گروه در یک تنظیم استاندارد "channels last":

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 [==============================] - 3s 3ms/step - loss: 0.4707 - accuracy: 0.8613
<keras.callbacks.History at 0x7f63a5c5f490>

آموزش عادی سازی نمونه

معرفی

نرمال سازی نمونه مورد خاصی از نرمال سازی گروه است که در آن اندازه گروه به اندازه اندازه کانال (یا اندازه محور) است.

نتایج تجربی نشان می‌دهد که نرمال‌سازی نمونه به خوبی در انتقال سبک هنگام جایگزینی نرمال‌سازی دسته‌ای عمل می‌کند. اخیراً عادی سازی نمونه نیز به عنوان جایگزینی برای عادی سازی دسته ای در GAN ها استفاده شده است.

مثال

استفاده از InstanceNormalization بعد از یک لایه 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
  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 [==============================] - 1s 3ms/step - loss: 0.5367 - accuracy: 0.8405
<keras.callbacks.History at 0x7f63a58d9f50>

آموزش نرمال سازی لایه ها

معرفی

نرمال سازی لایه حالت خاصی از نرمال سازی گروه است که در آن اندازه گروه 1 است. میانگین و انحراف استاندارد از تمام فعال سازی های یک نمونه واحد محاسبه می شود.

نتایج تجربی نشان می‌دهد که نرمال‌سازی لایه برای شبکه‌های عصبی مکرر مناسب است، زیرا به صورت دسته‌ای مستقل کار می‌کند.

مثال

استفاده از Layernormalization بعد از لایه 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.4056 - accuracy: 0.8754
<keras.callbacks.History at 0x7f63a5722d10>

ادبیات

هنجار لایه

هنجار نمونه

هنجار گروه