TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
genel bakış
Bu defter içine kısa bir giriş verir normalleşme katmanlarının TensorFlow arasında. Şu anda desteklenen katmanlar şunlardır:
- Grup Normalleştirme (TensorFlow Eklentileri)
- Örnek Normalleştirme (TensorFlow eklentileri)
- Katman Normalleştirme (TensorFlow Çekirdek)
Bu katmanların arkasındaki temel fikir, eğitim sırasında yakınsamayı iyileştirmek için bir aktivasyon katmanının çıktısını normalleştirmektir. Aksine toplu normalleştirme bu normalleştirmeler bunlar yerine tekrarlayan neual ağlar için uygundur yanı hale tek numune aktivasyonlar normalleştirmek, toplu üzerinde çalışmaya yok.
Tipik olarak normalleştirme, giriş tensörünüzdeki bir alt grubun ortalamasını ve standart sapmasını hesaplayarak gerçekleştirilir. Buna bir ölçek ve bir ofset faktörü de uygulamak mümkündür.
\(y_{i} = \frac{\gamma ( x_{i} - \mu )}{\sigma }+ \beta\)
\( y\) : Çıktı
\(x\) : Girdi
\(\gamma\) : Ölçek faktörü
\(\mu\): ortalama
\(\sigma\): standart sapma
\(\beta\): Offset faktörü
Aşağıdaki resim, bu teknikler arasındaki farkı göstermektedir. Her alt grafik, yığın ekseni olarak N, kanal ekseni olarak C ve uzamsal eksenler (örneğin bir resmin Yüksekliği ve Genişliği) olarak (H, W) olmak üzere bir giriş tensörü gösterir. Mavi renkli pikseller, bu piksellerin değerleri toplanarak hesaplanan aynı ortalama ve varyansla normalleştirilir.
Kaynak: ( https://arxiv.org/pdf/1803.08494.pdf )
Gama ve beta ağırlıkları, olası temsil yeteneği kaybını telafi etmek için tüm normalleştirme katmanlarında eğitilebilir. Sen ayarlayarak bu faktörleri aktive edebilir center
veya scale
bayrağı True
. Tabii kullanabileceğiniz initializers
, constraints
ve regularizer
için beta
ve gamma
eğitim sürecinde ayarlamak için bu değerleri.
Kurmak
Tensorflow 2.0 ve Tensorflow-Addons'u yükleyin
pip install -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa
Veri Kümesi Hazırlanıyor
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
Grup Normalleştirme Eğitimi
Tanıtım
Grup Normalleştirme(GN), girdilerinizin kanallarını daha küçük alt gruplara böler ve bu değerleri ortalamalarına ve varyanslarına göre normalleştirir. GN tek bir örnek üzerinde çalıştığı için bu teknik parti büyüklüğünden bağımsızdır.
GN, görüntü sınıflandırma görevlerinde deneysel olarak toplu normalleştirmeye kapalı puan verdi. Genel batch_size değerinizin düşük olması durumunda, Batch Normalization yerine GN kullanmak faydalı olabilir, bu da toplu normalleştirmenin kötü performansına yol açar
Örnek
Conv2D katmanından sonra 10 kanalı standart bir "kanallar son" ayarında 5 alt gruba bölme:
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>
Örnek Normalleştirme Eğitimi
Tanıtım
Örnek Normalleştirme, grup boyutunun kanal boyutuyla (veya eksen boyutuyla) aynı boyutta olduğu özel grup normalleştirme durumudur.
Deneysel sonuçlar, örnek normalleştirmenin toplu normalleştirmeyi değiştirirken stil aktarımında iyi performans gösterdiğini göstermektedir. Son zamanlarda, GAN'larda toplu normalleştirmenin yerine örnek normalleştirme de kullanılmıştır.
Örnek
Bir Conv2D Katmanından sonra InstanceNormalization uygulama ve tek tip bir başlatılmış ölçek ve ofset faktörü kullanma.
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>
Katman Normalleştirme Eğitimi
Tanıtım
Katman Normalizasyonu, grup boyutunun 1 olduğu özel grup normalleştirme durumudur. Ortalama ve standart sapma, tek bir örneğin tüm aktivasyonlarından hesaplanır.
Deneysel sonuçlar, toplu iş boyutundan bağımsız çalıştığı için Katman normalleştirmesinin Tekrarlayan Sinir Ağları için çok uygun olduğunu göstermektedir.
Örnek
Conv2D Katmanından sonra Layernormalization uygulama ve bir ölçek ve ofset faktörü kullanma.
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>