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

ما هو التشفير التلقائي في التعلم العميق؟
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 صورة بترتيب عشوائي.
قبل إنشاء نموذجك وتدريبه، تحتاج إلى تطبيق بعض عمليات معالجة البيانات. سوف تتصرف على النحو التالي:
- استيراد البيانات
- تحويل البيانات إلى تنسيق أبيض وأسود
- إلحاق كافة الدفعات
- بناء مجموعة بيانات التدريب
- بناء متخيل الصورة
ملاحظة حول الإصدار: يستهدف الكود في هذا الدرس 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 صحيحة.
تعيين مقدر مجموعة البيانات
حسنًا، الآن وقد أصبحت مجموعة البيانات جاهزة للاستخدام، يمكنك البدء في استخدام 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، مما يثبت أن العنصر النائب والمكرر وحجم الدفعة موصلة بشكل صحيح.
بناء الشبكة
لقد حان الوقت لبناء الشبكة. سوف تقوم بتدريب أداة التشفير التلقائي المكدسة، وهي شبكة ذات طبقات مخفية متعددة.
ستحتوي شبكتك على طبقة إدخال واحدة تحتوي على 1024 نقطة، أي 32×32، وهو شكل الصورة.
ستحتوي وحدة التشفير على طبقة مخفية علوية واحدة تضم 300 عصبون، وطبقة مركزية تضم 150 عصبونًا. وحدة فك التشفير متناظرة مع وحدة التشفير. يمكنك تصور الشبكة في الرسم التخطيطي أدناه. لاحظ أنه يمكنك تغيير قيم الطبقات المخفية والمركزية.
إن بناء جهاز التشفير التلقائي يشبه إلى حد كبير أي نموذج آخر للتعلم العميق.
سوف تقوم ببناء النموذج باتباع الخطوات التالية:
- تحديد المعلمات
- تحديد الطبقات
- تحديد الهندسة المعمارية
- تحديد التحسين
- قم بتشغيل النموذج
- قيم النموذج
في القسم السابق، تعلمت كيفية إنشاء مسار لتغذية النموذج، لذا لا داعي لإنشاء مجموعة البيانات مرة أخرى. ستقوم بإنشاء مُشفِّر تلقائي بأربع طبقات. ستستخدم تهيئة زافيير، وهي تقنية لضبط الأوزان الأولية وفقًا لتباين كلٍّ من المدخلات والمخرجات. أخيرًا، ستستخدم دالة التنشيط 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 تنتمي إلى الفئة التي تم تدريب النموذج عليها.
لتقييم النموذج، ستستخدم قيمة البكسل لهذه الصورة، وسترى ما إذا كان بإمكان المُشفِّر إعادة بناء الصورة نفسها بعد تصغيرها إلى 1024 بكسل. لاحظ أنه يجب عليك تعريف دالة لتقييم النموذج على صور مختلفة. من المفترض أن يعمل النموذج بشكل أفضل على صور الخيول فقط.
تأخذ الدالة وسيطتين:
- df: استيراد بيانات الاختبار
- رقم_الصورة: حدد الصورة المراد استيرادها
تنقسم الوظيفة إلى ثلاثة أجزاء:
- إعادة تشكيل الصورة إلى البعد الصحيح، أي 1، 1024
- قم بتغذية النموذج بالصورة غير المرئية، وقم بتشفير/فك تشفير الصورة
- طباعة الصورة الحقيقية والمعاد بناؤها
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.




