ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
ภาพรวม
โน๊ตบุ๊คนี้จะช่วยให้การแนะนำสั้น ๆ ลงใน ชั้นการฟื้นฟู ของ TensorFlow เลเยอร์ที่รองรับในปัจจุบันคือ:
- กลุ่มปกติ (TensorFlow Addons)
- เช่นปกติ (TensorFlow Addons)
- ชั้นปกติ (TensorFlow หลัก)
แนวคิดพื้นฐานที่อยู่เบื้องหลังเลเยอร์เหล่านี้คือการทำให้เอาต์พุตของเลเยอร์การเปิดใช้งานเป็นปกติ เพื่อปรับปรุงการบรรจบกันระหว่างการฝึก ในทางตรงกันข้ามกับ การฟื้นฟูชุด normalizations เหล่านี้จะไม่ได้ทำงานใน batches แทนพวกเขาปกติการเปิดใช้งานของตัวอย่างเดียวที่ทำให้พวกเขาเหมาะสำหรับเครือข่าย neual เกิดขึ้นอีกเช่นกัน
โดยปกติ การทำให้เป็นมาตรฐานจะดำเนินการโดยการคำนวณค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานของกลุ่มย่อยในเทนเซอร์อินพุตของคุณ นอกจากนี้ยังสามารถใช้มาตราส่วนและปัจจัยออฟเซ็ตกับสิ่งนี้ได้เช่นกัน
\(y_{i} = \frac{\gamma ( x_{i} - \mu )}{\sigma }+ \beta\)
\( y\) : เอาท์พุท
\(x\) : การป้อนข้อมูล
\(\gamma\) : ปัจจัยชั่ง
\(\mu\): ค่าเฉลี่ย
\(\sigma\): ส่วนเบี่ยงเบนมาตรฐาน
\(\beta\): ปัจจัย Offset
ภาพต่อไปนี้แสดงให้เห็นถึงความแตกต่างระหว่างเทคนิคเหล่านี้ แผนผังย่อยแต่ละรายการจะแสดงเทนเซอร์อินพุต โดยที่ 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
กวดวิชาการทำให้เป็นมาตรฐานกลุ่ม
บทนำ
Group Normalization (GN) แบ่งช่องสัญญาณอินพุตของคุณออกเป็นกลุ่มย่อยที่เล็กลง และทำให้ค่าเหล่านี้เป็นมาตรฐานตามค่าเฉลี่ยและความแปรปรวน เนื่องจาก GN ทำงานบนตัวอย่างเดียว เทคนิคนี้จึงไม่ขึ้นอยู่กับขนาดแบทช์
GN ทำคะแนนในการทดลองใกล้เคียงกับการทำให้แบตช์เป็นมาตรฐานในงานจำแนกรูปภาพ อาจเป็นประโยชน์หากใช้ GN แทน Batch Normalization ในกรณีที่ 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>
บทช่วยสอนการทำให้เป็นมาตรฐานของอินสแตนซ์
บทนำ
การทำให้เป็นมาตรฐานของอินสแตนซ์เป็นกรณีพิเศษของการทำให้เป็นมาตรฐานของกลุ่ม โดยที่ขนาดกลุ่มมีขนาดเท่ากับขนาดช่องสัญญาณ (หรือขนาดแกน)
ผลการทดลองแสดงให้เห็นว่าการทำให้เป็นมาตรฐานของอินสแตนซ์ทำงานได้ดีกับการถ่ายโอนรูปแบบเมื่อแทนที่การทำให้เป็นมาตรฐานแบบกลุ่ม เมื่อเร็วๆ นี้ การทำให้เป็นมาตรฐานของอินสแตนซ์ยังถูกใช้แทนการทำให้เป็นมาตรฐานแบบกลุ่มใน GAN
ตัวอย่าง
การใช้ InstanceNormalization หลังจาก Conv2D Layer และใช้สเกลเริ่มต้นที่สม่ำเสมอและปัจจัยออฟเซ็ต
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>
การสอนการทำให้เป็นมาตรฐานของเลเยอร์
บทนำ
Layer Normalization เป็นกรณีพิเศษของการทำให้เป็นมาตรฐานของกลุ่ม โดยที่ขนาดกลุ่มเท่ากับ 1 ค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานจะคำนวณจากการเปิดใช้งานทั้งหมดของตัวอย่างเดียว
ผลการทดลองแสดงให้เห็นว่า Layer Normalization นั้นเหมาะสมอย่างยิ่งกับ Recurrent Neural Networks เนื่องจากมันทำงานแบบ batchsize อย่างอิสระ
ตัวอย่าง
การใช้ Layernormalization หลังจาก Conv2D Layer และใช้สเกลและออฟเซ็ตแฟคเตอร์
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>