التشفير التلقائي في TensorFlow مع مثال

⚡ ملخص ذكي

تقوم المشفرات التلقائية بضغط المدخلات إلى تمثيل داخلي أصغر ثم تعيد بناءها، متعلمةً أهم الميزات دون الحاجة إلى تصنيفات. يشرح هذا الدليل كيفية استخدام أربع طبقات كثيفة في TensorFlow لإعادة بناء صور الخيول من مجموعة بيانات CIFAR-10.

  • 🔘 جهاز التشفير وجهاز فك التشفير: تلتقي كتلتان متناظرتان عند طبقة ترميز ضيقة تجبر الشبكة على الاحتفاظ بالإشارة الأساسية فقط.
  • ☑️ إعداد مجموعة البيانات: يتم تحميل دفعات CIFAR-10، وتحويلها إلى تدرج رمادي، وتكديسها، وتصفيتها للوصول إلى 5,000 صورة للخيول.
  • ✅ خط التغذية: يقوم مُقدِّر مجموعة البيانات المزود بـ from_tensor_slices و repeat و batch بتوفير الصور من خلال مُكرِّر قابل للتهيئة.
  • 🧪 شكل الشبكة: تتراوح عروض الطبقات بين 1024 و 300 و 150 و 300 و 1024، مع تفعيل ELU وتهيئة Xavier وتنظيم L2.
  • 🛠️ إعداد التدريب: متوسط ​​مربع الخطأ بين المخرجات والمدخلات، ومُحسِّن آدم، وحجم دفعة يبلغ 150 و33 تكرارًا لكل حقبة.
  • 📉 النتيجة المقاسة: على مدار 100 دورة تدريبية، ينخفض ​​فقدان التدريب من 2,934 إلى حوالي 1,454 قبل رسم إعادة البناء.

المشفر التلقائي في TensorFlow

ما هو التشفير التلقائي في التعلم العميق؟

An ترميز تلقائي هي أداة لتعلم ترميز البيانات بكفاءة في غير خاضعة للرقابة أسلوب. إنه نوع من شبكة اعصاب صناعية يساعدك ذلك على تعلم كيفية تمثيل مجموعات البيانات لتقليل الأبعاد من خلال تدريب الشبكة العصبية على تجاهل ضوضاء الإشارة. إنها أداة رائعة لإعادة إنشاء المدخلات.

ببساطة، تأخذ الآلة، على سبيل المثال، صورةً ما، وتستطيع إنتاج صورة مشابهة لها. المدخلات في هذا النوع من الشبكات العصبية غير مصنفة، مما يعني أن الشبكة قادرة على التعلم دون إشراف. وبشكل أدق، تقوم الشبكة بتشفير المدخلات للتركيز فقط على أهم السمات. وهذا أحد أسباب شيوع استخدام المشفر التلقائي لتقليل الأبعاد. إضافةً إلى ذلك، يمكن استخدام المشفرات التلقائية لإنتاج نماذج التعلم التوليدي. على سبيل المثال، يمكن تدريب الشبكة العصبية باستخدام مجموعة من الوجوه، ثم إنتاج وجوه جديدة.

كيف يعمل جهاز التشفير التلقائي TensorFlow؟

الغرض من جهاز التشفير التلقائي هو إنتاج تقدير تقريبي للمدخلات من خلال التركيز فقط على الميزات الأساسية. قد تتساءل لماذا لا تتعلم فقط كيفية نسخ ولصق المدخلات لإنتاج المخرجات. في الواقع، جهاز التشفير التلقائي عبارة عن مجموعة من القيود التي تجبر الشبكة على تعلم طرق جديدة لتمثيل البيانات، تختلف عن مجرد نسخ المخرجات.

يُعرَّف المُشفِّر التلقائي النموذجي بمدخل، وتمثيل داخلي، ومخرج (تقريب للمدخل). تتم عملية التعلم في الطبقات المتصلة بالتمثيل الداخلي. في الواقع، هناك مجموعتان رئيسيتان من الطبقات تشبهان الشبكة العصبية التقليدية. الفرق الطفيف هو أن الطبقة التي تحتوي على المخرج يجب أن تكون مساوية للمدخل. في الرسم التوضيحي أدناه، يدخل المدخل الأصلي إلى المجموعة الأولى المسماة المُشفِّر. يقوم هذا التمثيل الداخلي بضغط (تقليل) حجم المدخل. في المجموعة الثانية، تتم إعادة بناء المدخل، وهي مرحلة فك التشفير.

وحدات التشفير وفك التشفير في جهاز التشفير التلقائي مع التمثيل الداخلي المضغوط في المنتصف
عمل التشفير التلقائي

سيقوم النموذج بتحديث الأوزان عن طريق تقليل وظيفة الخسارة. تتم معاقبة النموذج إذا كان ناتج إعادة الإعمار مختلفًا عن المدخلات.

تخيل صورة بحجم 50×50 (أي 2,500 بكسل) وشبكة عصبية ذات طبقة مخفية واحدة فقط تتكون من مئة عصبون. يتم التعلم على خريطة ميزات أصغر بخمس وعشرين مرة من المدخلات. هذا يعني أن الشبكة تحتاج إلى إيجاد طريقة لإعادة بناء 2,500 بكسل باستخدام متجه من العصبونات يساوي 100 فقط.

مثال على وحدة التشفير التلقائي المكدسة

في هذا الدرس التعليمي حول التشفير التلقائي، ستتعلم كيفية استخدام مُشفِّر تلقائي مُكدَّس. يشبه تصميمه تصميم الشبكات العصبية التقليدية. تُرسَل المُدخلات إلى طبقة مخفية لضغطها، أو تقليل حجمها، ثم تصل إلى طبقات إعادة البناء. الهدف هو إنتاج صورة مُخرَجة أقرب ما يكون إلى الصورة الأصلية. يجب على النموذج أن يتعلم كيفية إنجاز مهمته ضمن مجموعة من القيود، أي بأبعاد أقل.

تُستخدم المشفرات التلقائية في التعلم العميق حاليًا بشكل أساسي لإزالة التشويش من الصور. تخيل صورة بها خدوش؛ لا يزال بإمكان الإنسان تمييز محتواها. تكمن فكرة المشفر التلقائي لإزالة التشويش في إضافة تشويش إلى الصورة لإجبار الشبكة على تعلم النمط الكامن وراء البيانات.

العائلة الأخرى المفيدة من المشفر التلقائي تعلم عميق هو مُشفِّر تلقائي تبايني. هذا النوع من الشبكات قادر على توليد صور جديدة. تخيّل أنك تُدرِّب شبكة على صورة رجل؛ هذه الشبكة قادرة على إنتاج وجوه جديدة.

يضع الجدول أدناه المشفر التلقائي المكدس الذي تم إنشاؤه في هذا البرنامج التعليمي بجوار العائلات الأخرى التي من المحتمل أن تصادفها، بحيث يسهل مقارنة القيد الذي يضيفه كل منها.

نوع المشفر التلقائي تمت إضافة القيد الاستخدام النموذجي
غير مكتمل / مكدس طبقة الترميز أضيق من طبقة الإدخال تقليل الأبعاد، مثال على الميزةtracالإنتاج
تقليل الضوضاء تمت إضافة ضوضاء إلى المدخلات، والهدف نظيف تنظيف الصورة والإشارة
متناثر عقوبة على عدد الوحدات النشطة ميزات قابلة للتفسير وقائمة على الأجزاء
متغير تتعلم طبقة الترميز توزيعًا احتماليًا توليد عينات جديدة

كيفية بناء جهاز تشفير تلقائي باستخدام TensorFlow

في هذا البرنامج التعليمي، سوف تتعلم كيفية إنشاء جهاز تشفير تلقائي مكدس لإعادة بناء الصورة.

ستستخدم مجموعة بيانات CIFAR-10 التي تحتوي على 60000 صورة ملونة بحجم 32×32 بكسل. مجموعة بيانات Autoencoder مقسمة مسبقًا إلى 50000 صورة للتدريب و10000 صورة للاختبار. يوجد ما يصل إلى عشر فئات.

  • طائرة
  • لاستخدام السيارة
  • طائر
  • قط
  • أيل
  • كلب
  • ضفدع
  • خيل
  • شحن
  • شاحنة

يجب عليك تنزيل الصور من صفحة مجموعة بيانات CIFAR-10 ثم قم بفك ضغط الملف المضغوط. يحتوي المجلد cifar-10-batches-py على خمس دفعات من البيانات، كل منها تحتوي على 10000 صورة بترتيب عشوائي.

قبل إنشاء نموذجك وتدريبه، تحتاج إلى تطبيق بعض عمليات معالجة البيانات. سوف تتصرف على النحو التالي:

  1. استيراد البيانات
  2. تحويل البيانات إلى تنسيق أبيض وأسود
  3. إلحاق كافة الدفعات
  4. بناء مجموعة بيانات التدريب
  5. بناء متخيل الصورة

ملاحظة حول الإصدار: يستهدف الكود في هذا الدرس TensorFlow 1.x. في TensorFlow 2، لم يعد الموديول tf.contrib موجودًا، وتوجد العناصر النائبة والجلسات والمكرر القابل للتهيئة ضمن tf.compat.v1. يُعد استدعاء tf.compat.v1.disable_v2_behavior() بعد الاستيراد أسرع طريقة لتشغيل القوائم دون تغيير.

معالجة الصور

الخطوة 1) استيراد البيانات

بحسب الموقع الرسمي، يمكنك تحميل البيانات باستخدام الكود التالي. سيقوم كود التشفير التلقائي بتحميل البيانات في قاموس يحتوي على البيانات والتصنيف. لاحظ أن الكود عبارة عن دالة.

import numpy as np
import tensorflow as tf
import pickle
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='latin1')
    return dict

الخطوة 2) تحويل البيانات إلى تنسيق أبيض وأسود

للتبسيط، سوف تقوم بتحويل البيانات إلى تدرج رمادي. أي ببعد واحد فقط مقابل ثلاثة لألوان الصورة. تعمل معظم الشبكات العصبية بإدخال بُعد واحد فقط.

def grayscale(im):
    return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)

الخطوة 3) إلحاق جميع الدُفعات

بعد إنشاء الدالتين وتحميل مجموعة البيانات، يمكنك كتابة حلقة تكرارية لإضافة البيانات إلى الذاكرة. إذا دققت النظر، ستجد أن الملف الذي تم فك ضغطه والذي يحتوي على البيانات يحمل اسم data_batch_ متبوعًا برقم من 1 إلى 5. يمكنك تكرار العملية على الملفات وإضافة كل ملف إلى data.

عند إتمام هذه الخطوة، يتم تحويل بيانات الألوان إلى تنسيق تدرج الرمادي. كما تلاحظ، يبلغ حجم البيانات 50000 و1024 بكسل. وقد تم دمج وحدات البكسل 32×32 لتصبح 1024 بكسل.

# Load the data into memory
data, labels = [], []
## Loop over the b
for i in range(1, 6):
    filename = './cifar-10-batches-py/data_batch_' + str(i)
    open_data = unpickle(filename)
    if len(data) > 0:
        data = np.vstack((data, open_data['data']))
        labels = np.hstack((labels, open_data['labels']))
    else:
        data = open_data['data']
        labels = open_data['labels']

data = grayscale(data)
x = np.matrix(data)
y = np.array(labels)
print(x.shape)
(50000, 1024)

ملاحظة: غيّر './cifar-10-batches-py/data_batch_' إلى الموقع الفعلي لملفك. على سبيل المثال، بالنسبة لـ Windows الجهاز، يمكن أن يكون المسار filename = 'E:\cifar-10-batches-py\data_batch_' + str(i)

الخطوة 4) إنشاء مجموعة بيانات التدريب

لتسريع عملية التدريب وتسهيلها، ستُدرّب النموذج على صور الخيول فقط. تحمل الخيول التصنيف 7 في بيانات التصنيف. وكما هو مذكور في وثائق مجموعة بيانات CIFAR-10، تحتوي كل فئة على 5000 صورة. يمكنك طباعة شكل البيانات للتأكد من وجود 5,000 صورة موزعة على 1024 عمودًا، كما هو موضح في مثال خطوة مُشفّر TensorFlow التلقائي أدناه.

horse_i = np.where(y == 7)[0]
horse_x = x[horse_i]
print(np.shape(horse_x)) 
(5000, 1024)

الخطوة 5) إنشاء متخيل الصورة

وأخيرًا، يمكنك إنشاء دالة لرسم الصور. ستحتاج إلى هذه الوظيفة لطباعة الصورة المعاد بناؤها من جهاز التشفير التلقائي.

إحدى الطرق السهلة لطباعة الصور هي استخدام دالة imshow() من مكتبة Matplotlib. لاحظ أنه يجب عليك تحويل شكل البيانات من 1024 إلى 32×32 (أي تنسيق الصورة).

# To plot pretty figures
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
def plot_image(image, shape=[32, 32], cmap = "Greys_r"):
    plt.imshow(image.reshape(shape), cmap=cmap,interpolation="nearest")
    plt.axis("off")   

تأخذ الدالة 3 وسيطات:

  • الصورة: المدخل
  • الشكل: قائمة، أبعاد الصورة
  • خريطة الألوان: اختر خريطة الألوان. اللون الافتراضي هو الرمادي.

يمكنك محاولة رسم الصورة الأولى في مجموعة البيانات. يجب أن ترى رجلاً على حصان.

plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")

تُعيد هذه العملية الصورة المصغرة ذات التدرج الرمادي أدناه، وتؤكد أن إعادة تشكيل الصورة من 1024 قيمة إلى صورة 32×32 صحيحة.

صورة مصغرة بالأبيض والأسود بحجم 32×32 بكسل من نوع CIFAR-10 لفارس على حصان، تم رسمها باستخدام دالة plot_image().

تعيين مقدر مجموعة البيانات

حسنًا، الآن وقد أصبحت مجموعة البيانات جاهزة للاستخدام، يمكنك البدء في استخدام TensorFlow. قبل بناء النموذج، استخدم مُقدِّر مجموعة البيانات الخاص بـ TensorFlow لتغذية الشبكة.

ستقوم بإنشاء مجموعة بيانات باستخدام مقدر TensorFlow. لتحديث عقلك، عليك استخدام:

  • from_tensor_slices
  • كرر
  • دفعة

الكود الكامل لبناء مجموعة البيانات هو:

dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)

لاحظ أن x عبارة عن عنصر نائب على شكل [None,n_inputs]. تم تعيين البُعد الأول إلى None لأن عدد الصور المُدخلة إلى الشبكة يساوي حجم الدفعة، والذي يتم تحديده فقط أثناء التشغيل. لمزيد من التفاصيل، يُرجى الرجوع إلى البرنامج التعليمي على الانحدار الخطي باستخدام TensorFlow.

بعد ذلك، تحتاج إلى إنشاء المكرر. بدون هذا السطر من التعليمات البرمجية، لن تمر أي بيانات عبر المسار.

iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()

الآن وبعد أن أصبح خط الأنابيب جاهزًا، يمكنك التحقق مما إذا كانت الصورة الأولى هي نفسها التي كانت عليها من قبل (أي رجل على حصان).

لقد قمت بتعيين حجم الدفعة إلى 1 لأنك تريد تغذية مجموعة البيانات بصورة واحدة فقط. يمكنك رؤية أبعاد البيانات باستخدام print(sess.run(features).shape). وهي تساوي (1, 1024). يشير الرقم 1 إلى تغذية صورة واحدة تحتوي على 1024 قيمة في كل مرة. إذا تم تعيين حجم الدفعة إلى 2، فسيتم تمرير صورتين عبر مسار المعالجة. لا تقم بتغيير حجم الدفعة، وإلا سيحدث خطأ، لأنه لا يمكن تمرير سوى صورة واحدة في كل مرة إلى الدالة plot_image().

## Parameters
n_inputs = 32 * 32
BATCH_SIZE = 1
batch_size = tf.placeholder(tf.int64)

# using a placeholder
x = tf.placeholder(tf.float32, shape=[None,n_inputs])
## Dataset
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
iter = dataset.make_initializable_iterator() # create the iterator
features = iter.get_next()

## Print the image
with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iter.initializer, feed_dict={x: horse_x,
                                         batch_size: BATCH_SIZE}) 
    print(sess.run(features).shape) 
    plot_image(sess.run(features), shape=[32, 32], cmap = "Greys_r")
(1, 1024)

تقوم سلسلة المعالجة بإرجاع نفس العنصر الذي تم رسمه مباشرة من مصفوفة NumPy، مما يثبت أن العنصر النائب والمكرر وحجم الدفعة موصلة بشكل صحيح.

نفس الصورة المصغرة للحصان مطبوعة بعد مرور الصورة عبر مُكرِّر مجموعة بيانات TensorFlow

بناء الشبكة

لقد حان الوقت لبناء الشبكة. سوف تقوم بتدريب أداة التشفير التلقائي المكدسة، وهي شبكة ذات طبقات مخفية متعددة.

ستحتوي شبكتك على طبقة إدخال واحدة تحتوي على 1024 نقطة، أي 32×32، وهو شكل الصورة.

ستحتوي وحدة التشفير على طبقة مخفية علوية واحدة تضم 300 عصبون، وطبقة مركزية تضم 150 عصبونًا. وحدة فك التشفير متناظرة مع وحدة التشفير. يمكنك تصور الشبكة في الرسم التخطيطي أدناه. لاحظ أنه يمكنك تغيير قيم الطبقات المخفية والمركزية.

بنية مشفر تلقائي متناظرة مع 1024 مدخلاً، و300 و150 طبقة مشفر، ووحدة فك تشفير معكوسة

بناء شبكة التشفير التلقائي

إن بناء جهاز التشفير التلقائي يشبه إلى حد كبير أي نموذج آخر للتعلم العميق.

سوف تقوم ببناء النموذج باتباع الخطوات التالية:

  1. تحديد المعلمات
  2. تحديد الطبقات
  3. تحديد الهندسة المعمارية
  4. تحديد التحسين
  5. قم بتشغيل النموذج
  6. قيم النموذج

في القسم السابق، تعلمت كيفية إنشاء مسار لتغذية النموذج، لذا لا داعي لإنشاء مجموعة البيانات مرة أخرى. ستقوم بإنشاء مُشفِّر تلقائي بأربع طبقات. ستستخدم تهيئة زافيير، وهي تقنية لضبط الأوزان الأولية وفقًا لتباين كلٍّ من المدخلات والمخرجات. أخيرًا، ستستخدم دالة التنشيط ELU. ستُطبِّق مُنظِّم L2 على دالة الخسارة.

الخطوة 1) تحديد المعلمات

تتضمن الخطوة الأولى تحديد عدد الخلايا العصبية في كل طبقة، ومعدل التعلم والمعلمة الفائقة للمنظم.

قبل ذلك، استورد الدالة الجزئية. إنها طريقة أفضل لتحديد معلمات الطبقات الكثيفة. يحدد الكود أدناه قيم بنية المشفر التلقائي. كما ذُكر سابقًا، يتكون المشفر من طبقتين، تحتوي الطبقة الأولى على 300 عصبون، بينما تحتوي الطبقة الثانية على 150 عصبونًا. تُخزن قيمها في n_hidden_1 و n_hidden_2.

يجب عليك تحديد معدل التعلم والمعامل الفائق L2. يتم تخزين القيم في learning_rate و l2_reg.

from functools import partial

## Encoder
n_hidden_1 = 300
n_hidden_2 = 150  # codings

## Decoder
n_hidden_3 = n_hidden_1
n_outputs = n_inputs

learning_rate = 0.01
l2_reg = 0.0001

يتم استدعاء تقنية تهيئة Xavier باستخدام الكائن xavier_initializer من مكتبة estimator contrib. في نفس المُقدِّر، يمكنك إضافة المُنتظم باستخدام l2_regularizer.

## Define the Xavier initialization
xav_init =  tf.contrib.layers.xavier_initializer()
## Define the L2 regularizer
l2_regularizer = tf.contrib.layers.l2_regularizer(l2_reg)

ملاحظة حول الإصدار: تمت إزالة tf.contrib في TensorFlow 2. البدائل المباشرة هي tf.keras.initializers.GlorotUniform() لـ xavier_initializer() و tf.keras.regularizers.l2() لـ l2_regularizer().

الخطوة الثانية: تحديد الطبقات

تم ضبط جميع معلمات الطبقات الكثيفة؛ يمكنك تجميع كل شيء في المتغير dense_layer باستخدام الكائن partial. ثم يستخدم dense_layer دالة التنشيط ELU، وتهيئة Xavier، وتنظيم L2 في كل استدعاء.

## Create the dense layer
dense_layer = partial(tf.layers.dense,
                         activation=tf.nn.elu,
                         kernel_initializer=xav_init,
                         kernel_regularizer=l2_regularizer)

الخطوة 3) تحديد البنية

إذا نظرت إلى مخطط بنية الشبكة، ستلاحظ أنها تتكون من ثلاث طبقات بالإضافة إلى طبقة إخراج. في الكود أدناه، يتم توصيل الطبقات المناسبة. على سبيل المثال، تحسب الطبقة الأولى حاصل الضرب النقطي بين مصفوفة خصائص الإدخال والمصفوفة التي تحتوي على 300 وزن. بعد حساب حاصل الضرب النقطي، يُمرر الناتج إلى دالة التنشيط ELU. يصبح الناتج مدخلاً للطبقة التالية، ولذلك يُستخدم لحساب hidden_2 وهكذا. عملية ضرب المصفوفات متطابقة في جميع الطبقات نظرًا لاستخدام دالة التنشيط نفسها. لاحظ أن الطبقة الأخيرة، وهي طبقة الإخراج، لا تُطبق دالة تنشيط. وهذا منطقي لأنها تمثل المدخل المُعاد بناؤه.

## Make the mat mul
hidden_1 = dense_layer(features, n_hidden_1)
hidden_2 = dense_layer(hidden_1, n_hidden_2)
hidden_3 = dense_layer(hidden_2, n_hidden_3)
outputs = dense_layer(hidden_3, n_outputs, activation=None)

الخطوة الرابعة) تحديد التحسين

الخطوة الأخيرة هي بناء المُحسِّن. ستستخدم متوسط ​​مربع الخطأ كدالة خسارة. إذا كنتَ تتذكر الدرس التعليمي حول الانحدار الخطي، فأنتَ تعلم أن متوسط ​​مربع الخطأ يُحسب من خلال الفرق بين الناتج المُتوقع والتصنيف الحقيقي. هنا، التصنيف هو الخاصية لأن النموذج يحاول إعادة بناء المُدخل. لذلك، أنت تريد متوسط ​​مجموع مربعات الفروق بين الناتج المُتوقع والمُدخل. باستخدام TensorFlow، يمكنك برمجة دالة الخسارة كما يلي:

loss = tf.reduce_mean(tf.square(outputs - features))

بعد ذلك، عليك تحسين دالة الخسارة. تستخدم مُحسِّن آدم لحساب التدرجات. الهدف هو تقليل الخسارة.

## Optimize
loss = tf.reduce_mean(tf.square(outputs - features))
optimizer = tf.train.AdamOptimizer(learning_rate)
train  = optimizer.minimize(loss)

إعداد آخر قبل تدريب النموذج. تريد استخدام حجم دفعة يبلغ 150، أي تغذية التدفق بـ 150 صورة في كل تكرار. تحتاج إلى حساب عدد التكرارات يدويًا. وهذا أمر تافه للقيام به:

إذا كنت ترغب في تمرير 150 صورة في كل مرة، وكنت تعلم أن هناك 5000 صورة في مجموعة البيانات، فإن عدد التكرارات يساوي 5000 مقسومًا على 150. Python يمكنك تشغيل الأكواد التالية والتأكد من أن الناتج هو 33:

BATCH_SIZE = 150
### Number of batches :  length dataset / batch size
n_batches = horse_x.shape[0] // BATCH_SIZE
print(n_batches)
33

الخطوة 5) تشغيل النموذج

وأخيرًا وليس آخرًا، قم بتدريب النموذج. أنت تدرب النموذج باستخدام 100 دورة تدريبية. أي أن النموذج سيشاهد الصور 100 مرة أثناء تحسين الأوزان.

أنت على دراية مسبقة بأكواد تدريب نموذج في TensorFlow. الفرق البسيط هو تمرير البيانات قبل بدء التدريب. بهذه الطريقة، يتم تدريب النموذج بشكل أسرع.

أنت مهتم بطباعة الخسارة بعد عشر فترات لمعرفة ما إذا كان النموذج يتعلم شيئًا ما (أي أن الخسارة آخذة في التناقص). يستغرق التدريب من 2 إلى 5 دقائق، حسب مكونات جهازك.

## Set params
n_epochs = 100

## Call Saver to save the model and re-use it later during evaluation
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # initialise iterator with train data
    sess.run(iter.initializer, feed_dict={x: horse_x,
                                          batch_size: BATCH_SIZE})
    print('Training...')
    print(sess.run(features).shape) 
    for epoch in range(n_epochs):       
        for iteration in range(n_batches):
            sess.run(train)
        if epoch % 10 == 0:
            loss_train = loss.eval()   # not shown
            print("\r{}".format(epoch), "Train MSE:", loss_train) 
        #saver.save(sess, "./my_model_all_layers.ckpt") 
    save_path = saver.save(sess, "./model.ckpt")    
    print("Model saved in path: %s" % save_path)  
Training...
(150, 1024)
0 Train MSE: 2934.455
10 Train MSE: 1672.676
20 Train MSE: 1514.709
30 Train MSE: 1404.3118
40 Train MSE: 1425.058
50 Train MSE: 1479.0631
60 Train MSE: 1609.5259
70 Train MSE: 1482.3223
80 Train MSE: 1445.7035
90 Train MSE: 1453.8597
Model saved in path: ./model.ckpt

الخطوة 6) تقييم النموذج

بعد تدريب النموذج، حان وقت تقييمه. عليك استيراد مجموعة الاختبار من الملف /cifar-10-batches-py/.

test_data = unpickle('./cifar-10-batches-py/test_batch')
test_x = grayscale(test_data['data'])
#test_labels = np.array(test_data['labels'])

ملاحظة: ل Windows الجهاز، يصبح الكود test_data = unpickle(r”E:\cifar-10-batches-py\test_batch”)

يمكنك محاولة طباعة الصورة رقم 13، وهي صورة حصان.

plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")

يؤكد الرسم البياني أن دفعة الاختبار قد تم تحميلها بشكل صحيح وأن الصورة رقم 13 تنتمي إلى الفئة التي تم تدريب النموذج عليها.

صورة الاختبار رقم 13 من مجموعة اختبار CIFAR-10 تُظهر حصانًا باللون الرمادي

لتقييم النموذج، ستستخدم قيمة البكسل لهذه الصورة، وسترى ما إذا كان بإمكان المُشفِّر إعادة بناء الصورة نفسها بعد تصغيرها إلى 1024 بكسل. لاحظ أنه يجب عليك تعريف دالة لتقييم النموذج على صور مختلفة. من المفترض أن يعمل النموذج بشكل أفضل على صور الخيول فقط.

تأخذ الدالة وسيطتين:

  • df: استيراد بيانات الاختبار
  • رقم_الصورة: حدد الصورة المراد استيرادها

تنقسم الوظيفة إلى ثلاثة أجزاء:

  1. إعادة تشكيل الصورة إلى البعد الصحيح، أي 1، 1024
  2. قم بتغذية النموذج بالصورة غير المرئية، وقم بتشفير/فك تشفير الصورة
  3. طباعة الصورة الحقيقية والمعاد بناؤها
def reconstruct_image(df, image_number = 1):
    ## Part 1: Reshape the image to the correct dimension i.e 1, 1024
    x_test = df[image_number]
    x_test_1 = x_test.reshape((1, 32*32))
    
    ## Part 2: Feed the model with the unseen image, encode/decode the image
    with tf.Session() as sess:     
        sess.run(tf.global_variables_initializer()) 
        sess.run(iter.initializer, feed_dict={x: x_test_1,
                                      batch_size: 1})
    ## Part 3:  Print the real and reconstructed image
      # Restore variables from disk.
        saver.restore(sess, "./model.ckpt")  
        print("Model restored.")
      # Reconstruct image
        outputs_val = outputs.eval()
        print(outputs_val.shape)
        fig = plt.figure()
      # Plot real
        ax1 = fig.add_subplot(121)
        plot_image(x_test_1, shape=[32, 32], cmap = "Greys_r")
      # Plot estimated
        ax2 = fig.add_subplot(122)
        plot_image(outputs_val, shape=[32, 32], cmap = "Greys_r")
        plt.tight_layout()
        fig = plt.gcf()

الآن وقد تم تعريف دالة التقييم، يمكنك إلقاء نظرة على الصورة المعاد بناؤها رقم ثلاثة عشر.

reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckpt
Model restored.
(1, 1024)

يوضح الشكل صورة الاختبار الأصلية على اليسار ومخرجات المشفر التلقائي على اليمين، لذا يسهل الحكم على فقدان التفاصيل الدقيقة بعد الضغط من 1024 إلى 150.

مقارنة جنبًا إلى جنب بين صورة الحصان الأصلية وإعادة بناء الصورة باستخدام الترميز التلقائي الأكثر ضبابية

الأسئلة الشائعة

كلا الطريقتين تُقللان الأبعاد، لكن تحليل المكونات الرئيسية (PCA) يقتصر على الإسقاطات الخطية. أما المُشفِّر التلقائي فيُركِّب دوال التنشيط غير الخطية مثل ELU، لذا فهو يلتقط البنية المنحنية التي يغفل عنها تحليل المكونات الرئيسية. وباستخدام طبقة خطية واحدة وخطأ تربيعي، يُعيد المُشفِّر التلقائي إنتاج تحليل المكونات الرئيسية بدقة شبه تامة.

لم يتم التغيير. تمت إزالة وحدة tf.contrib، ونُقلت العناصر النائبة والجلسات إلى tf.compat.v1. إضافة disable_v2_behavior() تُسرّع عملية نقل القوائم، بينما في الوضع الأصلي TensorFlow 2 إعادة الكتابة تستخدم tf.keras.layers.Dense مع تهيئة GlorotUniform.

تُجرّب أدوات البحث الآلي العديد من نطاقات عرض طبقات الترميز، وقيم التنشيط، وقوة التنظيم بسرعة تفوق بكثير الضبط اليدوي، ثم تُرتّب النتائج حسب خطأ إعادة البناء. تُختصر هذه الأدوات عملية البحث، مع أن الإنسان لا يزال يتحقق من مدى ملاءمة عمليات إعادة البناء للبيانات المتاحة.

نعم. مساعد الطيار جيثب يُستخلص تناظر المُشفِّر والمُفكِّك، وحلقة التدريب، وأداة الرسم البياني من تعليق قصير، مما يُزيل معظم التعليمات البرمجية المُكرَّرة. تحقَّق بنفسك من أشكال الموترات وتعريف الخسارة، لأن الكود المُولَّد غالبًا ما يمزج بين صيغتي TensorFlow 1 و2.

ابدأ بنسبة تتراوح بين عشرة إلى عشرين بالمئة من عرض الإدخال، كما تفعل الطبقة المكونة من 150 وحدة لـ 1024 بكسل هنا. عدد قليل جدًا من الوحدات يُشوش التفاصيل، بينما عدد كبير جدًا منها يسمح للشبكة بنسخ الإدخال بدلًا من تعلم رمز مضغوط.

يُدمج التدرج الرمادي ثلاث قنوات لونية في قناة واحدة، مما يقلل عدد قيم كل مدخل من 3072 إلى 1024 قيمة. يُسرّع هذا من عملية التدريب، ويحافظ على صغر حجم الطبقات الكثيفة، ويُظهر بوضوح ما تعلمه المُشفّر التلقائي.

ينخفض ​​عدد مرات التشغيل المطبوعة من 2,934 إلى حوالي 1,404 بحلول الدورة 30، ثم يتذبذب بين 1,425 و1,609. معدل التعلم الثابت البالغ 0.01 يتجاوز الحد الأدنى عند تلك النقطة - وعادة ما يؤدي خفضه، أو إضافة جدول زمني للتضاؤل، إلى استعادة المزيد من التقدم.

تشمل استخدامات الإنتاج اكتشاف الحالات الشاذة في سجلات الخادم والمعاملات، حيث يشير خطأ إعادة البناء المرتفع إلى وجود قيمة شاذة، بالإضافة إلى تضمينات التوصيات، وإزالة التشويش من المستشعرات، وتدريب الميزات مسبقًا.tracتورات تغذي مصنفًا لاحقًا.

تلخيص هذه التدوينة بـ: