נורמליזציות

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-GitHub הורד מחברת

סקירה כללית

מחברת זו נותנת הקדמה קצרה אל תוך שכבות הנורמליזציה של TensorFlow. השכבות הנתמכות כרגע הן:

  • קבוצת נורמליזציה (TensorFlow Addons)
  • מופע הנורמליזציה (TensorFlow Addons)
  • הנורמליזציה Layer (Core TensorFlow)

הרעיון הבסיסי מאחורי שכבות אלו הוא לנרמל את הפלט של שכבת הפעלה כדי לשפר את ההתכנסות במהלך האימון. בניגוד הנורמליזציה יצווה נירמול האלה לא עובדים על קבוצות, במקום שהם לנרמל את ההפעלות של מדגם בודד, מה שהופך אותם למתאימים עבור רשתות 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

הדרכה לנורמליזציה קבוצתית

מבוא

נורמליזציה קבוצתית (GN) מחלק את הערוצים של התשומות שלך לתתי קבוצות קטנות יותר ומנרמל את הערכים הללו על סמך הממוצע והשונות שלהם. מכיוון ש-GN עובדת על דוגמה יחידה, הטכניקה הזו אינה תלויה בגודל אצווה.

GN קיבל ציון ניסיוני סגור לנורמליזציה אצווה במשימות סיווג תמונה. זה יכול להיות מועיל להשתמש ב-GN במקום נורמליזציה של אצווה במקרה שה-batch_size הכולל שלך נמוך, מה שיוביל לביצועים גרועים של נורמליזציה אצווה

דוגמא

פיצול 10 ערוצים לאחר שכבת Conv2D ל-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 [==============================] - 3s 3ms/step - loss: 0.4707 - accuracy: 0.8613
<keras.callbacks.History at 0x7f63a5c5f490>

מדריך לנורמליזציה של מופעים

מבוא

נורמליזציה של מופעים היא מקרה מיוחד של נורמליזציה של קבוצה כאשר גודל הקבוצה זהה לגודל הערוץ (או גודל הציר).

תוצאות ניסוי מראות שנורמליזציה של מופעים מתפקדת היטב בהעברת סגנון בעת ​​החלפת נורמליזציה אצווה. לאחרונה, נורמליזציה של מופעים שימשה גם כתחליף לנורמליזציה של אצווה ב-GANs.

דוגמא

החלת 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>

סִפְרוּת

נורמת שכבות

נורמה של מופע

נורמה קבוצתית