การทำให้เป็นมาตรฐาน

ดูบน 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>

วรรณกรรม

บรรทัดฐานของเลเยอร์

บรรทัดฐานของอินสแตนซ์

มาตรฐานกลุ่ม