![]() | ![]() | ![]() | ![]() |
סקירה כללית
מחברת זו נותנת הקדמה קצרה לשכבות הנורמליזציה של TensorFlow. השכבות הנתמכות כרגע הן:
- נורמליזציה קבוצתית (תוספות TensorFlow)
- נורמליזציה למופע (תוספות TensorFlow)
- נורמליזציה של שכבה (TensorFlow Core)
הרעיון הבסיסי מאחורי שכבות אלה הוא לנרמל את התפוקה של שכבת הפעלה כדי לשפר את ההתכנסות במהלך האימון. בניגוד לנורמליזציה של אצווה נורמליזציות אלה אינן עובדות על קבוצות, אלא מנרמל את ההפעלות של דגימה אחת, מה שהופך אותן למתאימות גם לרשתות חד-פעמיות חוזרות.
בדרך כלל הנורמליזציה מתבצעת על ידי חישוב הממוצע וסטיית התקן של תת-קבוצה במתח הקלט שלך. אפשר גם להחיל על זה קנה מידה וגורם קיזוז.
$ 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 -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
מדריך לנורמליזציה קבוצתית
מבוא
נורמליזציה קבוצתית (GN) מחלקת את ערוצי התשומות שלך לקבוצות משנה קטנות יותר ומנרמלת ערכים אלה על סמך הממוצע והשונות שלהם. מכיוון ש- GN עובד על דוגמה אחת, טכניקה זו אינה תלויה בקבוצת גודל.
GN ציון ניסיוני סגור לנורמליזציה אצווה במשימות סיווג תמונות זה יכול להיות מועיל להשתמש ב- GN במקום בנורמליזציה של אצווה במקרה שהגודל הכללי של האצווה שלך נמוך, מה שיוביל לביצועים גרועים של נורמליזציה של אצווה.
דוגמא
פיצול 10 ערוצים לאחר שכבת 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"),
# 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.
דוגמא
החלת 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 [==============================] - 2s 3ms/step - loss: 0.9159 - accuracy: 0.7194 <tensorflow.python.keras.callbacks.History at 0x7f9549c37278>
מדריך לנורמליזציה של שכבות
מבוא
נורמליזציה של שכבה היא מקרה מיוחד של נורמליזציה קבוצתית כאשר גודל הקבוצה הוא 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.6272 - accuracy: 0.8049 <tensorflow.python.keras.callbacks.History at 0x7f9549b0a748>