1. مقدمة
لقد اتّخذت خطواتك الأولى باستخدام TensorFlow.js، أو جرّبت نماذجنا الجاهزة، أو ربما أنشأت نموذجًا خاصًا بك، ولكنك رأيت بعض الأبحاث المتطورة التي تم إجراؤها في Python، وتريد معرفة ما إذا كان بإمكانك تشغيلها في متصفّح الويب لتحويل فكرتك الرائعة إلى حقيقة متاحة لملايين المستخدمين بطريقة قابلة للتوسّع. هل يبدو هذا مألوفًا؟ إذا كان الأمر كذلك، هذا الدرس التطبيقي حول الترميز مناسب لك.
وفّر فريق TensorFlow.js أداة ملائمة لتحويل النماذج بتنسيق SavedModel إلى TensorFlow.js من خلال أداة تحويل سطر الأوامر، ما يتيح لك الاستفادة من هذه النماذج على الويب.
ما ستتعلمه
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام أداة التحويل من سطر الأوامر في TensorFlow.js لنقل SavedModel تم إنشاؤه باستخدام Python إلى تنسيق model.json المطلوب للتنفيذ من جهة العميل في متصفّح الويب.
على وجه التحديد:
- كيفية إنشاء نموذج بسيط لتعلُّم الآلة باستخدام Python وحفظه بالتنسيق المطلوب الذي يحتاج إليه محوّل TensorFlow.js
- كيفية تثبيت أداة التحويل TensorFlow.js واستخدامها على SavedModel الذي تم تصديره من Python
- استخدِم الملفات الناتجة من عملية التحويل في تطبيق الويب المستند إلى JavaScript.
- التعرّف على الإجراءات التي يجب اتّخاذها عند حدوث خطأ (لن يتم تحويل بعض النماذج) والخيارات المتاحة لك
تخيّل أنّه بإمكانك الاستفادة من بعض الأبحاث التي تم إجراؤها مؤخرًا وإتاحة هذا النموذج لملايين مطوّري JavaScript حول العالم. أو ربما ستستخدم هذا بنفسك في عملك الخاص، ويمكن لأي شخص في العالم تجربة ذلك إذا كان يعمل في متصفح الويب، إذ لا يلزم توفّر أي تبعيات معقدة أو إعداد بيئة. هل أنت مستعد للبدء؟ هذا رائع
شارِكنا المحتوى الذي تحوّله.
يمكنك استخدام ما تعلّمناه اليوم لمحاولة تحويل بعض النماذج المفضّلة لديك من Python. إذا نجحت في ذلك، وتمكّنت من إنشاء موقع إلكتروني تجريبي يعمل على النموذج، يمكنك الإشارة إلينا على وسائل التواصل الاجتماعي باستخدام الهاشتاغ #MadeWithTFJS لنعرض مشروعك على مدونة TensorFlow أو حتى في فعاليات "عرض الأفكار" المستقبلية. يسرّنا أن نرى المزيد من الأبحاث الرائعة يتم نقلها إلى الويب، وأن نتيح لعدد أكبر من الأشخاص استخدام هذه النماذج بطرق مبتكرة أو إبداعية، تمامًا مثل هذا المثال الرائع.
2. ما هي مكتبة TensorFlow.js؟

TensorFlow.js هي مكتبة مفتوحة المصدر لتعلُّم الآلة يمكن تشغيلها في أي مكان يمكن فيه تشغيل JavaScript. وهي تستند إلى مكتبة TensorFlow الأصلية المكتوبة بلغة Python وتهدف إلى إعادة إنشاء تجربة المطوّرين هذه ومجموعة واجهات برمجة التطبيقات لنظام JavaScript المتكامل.
أين يمكن استخدامها؟
بفضل إمكانية نقل JavaScript، يمكنك الآن كتابة التعليمات البرمجية بلغة واحدة وتنفيذ تعلُّم الآلة على جميع المنصات التالية بسهولة:
- من جهة العميل في متصفّح الويب باستخدام JavaScript العادية
- الخادم وحتى أجهزة إنترنت الأشياء، مثل Raspberry Pi باستخدام Node.js
- تطبيقات الكمبيوتر التي تستخدم Electron
- تطبيقات الأجهزة الجوّالة المتوافقة مع نظام التشغيل باستخدام React Native
تتيح مكتبة TensorFlow.js أيضًا استخدام عدة أنظمة خلفية في كل من هذه البيئات (البيئات المستندة إلى الأجهزة الفعلية التي يمكن تنفيذها فيها، مثل وحدة المعالجة المركزية أو WebGL على سبيل المثال). لا يعني "الخادم الخلفي" في هذا السياق بيئة من جهة الخادم، بل يمكن أن يكون الخادم الخلفي للتنفيذ من جهة العميل في WebGL مثلاً، وذلك لضمان التوافق والحفاظ على سرعة الأداء. يتوافق TensorFlow.js حاليًا مع ما يلي:
- تنفيذ WebGL على بطاقة الرسومات في الجهاز (وحدة معالجة الرسومات): هذه هي أسرع طريقة لتنفيذ نماذج أكبر (أكثر من 3 ميغابايت) مع تسريع وحدة معالجة الرسومات.
- تنفيذ Web Assembly (WASM) على وحدة المعالجة المركزية (CPU): لتحسين أداء وحدة المعالجة المركزية على جميع الأجهزة، بما في ذلك الهواتف الجوّالة القديمة مثلاً. هذا الخيار أنسب للنماذج الأصغر حجمًا (أقل من 3 ميغابايت) التي يمكن تنفيذها بشكل أسرع على وحدة المعالجة المركزية باستخدام WASM مقارنةً بـ WebGL بسبب تكلفة تحميل المحتوى إلى معالج الرسومات.
- تنفيذ وحدة المعالجة المركزية: يجب أن يكون الخيار الاحتياطي متاحًا في حال عدم توفّر أي من البيئات الأخرى. هذه الطريقة هي الأبطأ من بين الطرق الثلاث، ولكنّها متاحة لك دائمًا.
ملاحظة: يمكنك اختيار فرض إحدى الخلفيات إذا كنت تعرف الجهاز الذي سيتم التنفيذ عليه، أو يمكنك ببساطة السماح لـ TensorFlow.js بتحديد ذلك نيابةً عنك إذا لم تحدّد ذلك.
ميزات خارقة من جهة العميل
يمكن أن يؤدي تشغيل TensorFlow.js في متصفّح الويب على جهاز العميل إلى تحقيق العديد من المزايا التي تستحق أخذها في الاعتبار.
الخصوصية
يمكنك تدريب البيانات وتصنيفها على جهاز العميل بدون إرسال البيانات إلى خادم ويب تابع لجهة خارجية. قد يكون ذلك مطلوبًا في بعض الأحيان للامتثال للقوانين المحلية، مثل اللائحة العامة لحماية البيانات (GDPR)، أو عند معالجة أي بيانات قد يريد المستخدم الاحتفاظ بها على جهازه وعدم إرسالها إلى جهة خارجية.
السرعة
بما أنّك لست مضطرًا إلى إرسال البيانات إلى خادم بعيد، يمكن أن يكون الاستنتاج (تصنيف البيانات) أسرع. والأفضل من ذلك، يمكنك الوصول مباشرةً إلى أدوات الاستشعار في الجهاز، مثل الكاميرا والميكروفون ونظام تحديد المواقع العالمي (GPS) ومقياس التسارع وغيرها، إذا منحك المستخدم إذن الوصول.
الوصول إلى الجمهور على نطاق واسع
بنقرة واحدة، يمكن لأي شخص في العالم النقر على رابط ترسله إليه، وفتح صفحة الويب في المتصفّح، والاستفادة من المحتوى الذي أنشأته. لا حاجة إلى إعداد معقّد لخادم Linux مع برامج تشغيل CUDA وغير ذلك الكثير لمجرّد استخدام نظام تعلُّم الآلة.
التكلفة
عدم الحاجة إلى خوادم يعني أنّ الشيء الوحيد الذي عليك الدفع مقابله هو شبكة توصيل المحتوى (CDN) لاستضافة ملفات HTML وCSS وJS والنماذج. إنّ تكلفة شبكة توصيل المحتوى أقل بكثير من تكلفة تشغيل خادم (ربما مع بطاقة رسومات مرفقة) على مدار الساعة طوال أيام الأسبوع.
الميزات من جهة الخادم
يتيح استخدام Node.js في TensorFlow.js الميزات التالية.
التوافق الكامل مع CUDA
على مستوى الخادم، لتسريع بطاقة الرسومات، يجب تثبيت برامج تشغيل NVIDIA CUDA لتمكين TensorFlow من العمل مع بطاقة الرسومات (على عكس المتصفّح الذي يستخدم WebGL، فلا حاجة إلى التثبيت). ومع ذلك، يمكنك الاستفادة بشكل كامل من إمكانات بطاقة الرسومات ذات المستوى الأدنى من خلال توفُّر توافق كامل مع CUDA، ما يؤدي إلى تقليل وقت التدريب والاستنتاج. ويكون الأداء مماثلاً لتنفيذ TensorFlow في Python لأنّهما يشتركان في الخلفية نفسها المكتوبة بلغة C++.
حجم النموذج
بالنسبة إلى أحدث النماذج من الأبحاث، قد تعمل مع نماذج كبيرة جدًا، ربما بحجم الجيجابايت. لا يمكن تشغيل هذه النماذج حاليًا في متصفح الويب بسبب القيود المفروضة على استخدام الذاكرة لكل علامة تبويب متصفّح. لتشغيل هذه النماذج الأكبر حجمًا، يمكنك استخدام Node.js على الخادم الخاص بك مع مواصفات الأجهزة التي تحتاج إليها لتشغيل هذا النموذج بكفاءة.
IOT
يتوافق Node.js مع أجهزة الكمبيوتر الشائعة ذات اللوحة الواحدة، مثل Raspberry Pi، ما يعني بدوره أنّه يمكنك تنفيذ نماذج TensorFlow.js على هذه الأجهزة أيضًا.
السرعة
تمت كتابة Node.js بلغة JavaScript، ما يعني أنّها تستفيد من التجميع أثناء التشغيل. وهذا يعني أنّه قد تلاحظ غالبًا تحسّنًا في الأداء عند استخدام Node.js لأنّه سيتم تحسينه في وقت التشغيل، خاصةً لأي معالجة مسبقة قد تجريها. يمكن الاطّلاع على مثال رائع لذلك في دراسة الحالة هذه التي توضّح كيف استخدمت شركة Hugging Face منصة Node.js لتحسين أداء نموذج معالجة اللغة الطبيعية بمقدار الضعف.
بعد أن تعرّفت على أساسيات TensorFlow.js، والمكان الذي يمكن تشغيلها فيه، وبعض المزايا، لنبدأ الآن في تنفيذ مهام مفيدة باستخدامها.
3- إعداد نظامك
في هذا البرنامج التعليمي، سنستخدم Ubuntu، وهو إصدار شائع من Linux يستخدمه الكثيرون ويتوفّر على Compute Engine في Google Cloud كصورة أساسية إذا اخترت المتابعة على جهاز افتراضي مستند إلى السحابة الإلكترونية.
في وقت كتابة هذا المستند، يمكننا اختيار صورة Ubuntu 18.04.4 LTS عند إنشاء آلة افتراضية جديدة من Compute Engine، وهذا ما سنستخدمه. يمكنك بالطبع استخدام جهازك الخاص أو حتى نظام تشغيل مختلف إذا اخترت ذلك، ولكن قد تختلف تعليمات التثبيت والتبعيات بين الأنظمة.
تثبيت TensorFlow (إصدار Python)
الآن، بما أنّك تحاول على الأرجح تحويل بعض النماذج الحالية المستندة إلى Python التي عثرت عليها أو ستكتبها، قبل أن نتمكّن من تصدير ملف "SavedModel" من Python، عليك إعداد إصدار Python من TensorFlow على الجهاز إذا لم يكن ملف "SavedModel" متاحًا للتنزيل بعد.
استخدِم بروتوكول النقل الآمن (SSH) في جهازك على السحابة الإلكترونية الذي أنشأته أعلاه، ثم اكتب ما يلي في نافذة الوحدة الطرفية:
نافذة المحطة الطرفية:
sudo apt update
sudo apt-get install python3
سيضمن ذلك تثبيت الإصدار 3 من Python على الجهاز. يجب تثبيت الإصدار 3.4 أو الإصدارات الأحدث من Python لاستخدام TensorFlow.
للتأكّد من تثبيت الإصدار الصحيح، اكتب ما يلي:
نافذة المحطة الطرفية:
python3 --version
من المفترض أن تظهر لك بعض النتائج التي تشير إلى رقم الإصدار، مثل Python 3.6.9. إذا ظهرت هذه القيمة بشكل صحيح وكانت أعلى من 3.4، يمكننا المتابعة.
بعد ذلك، سنثبّت PIP لإصدار Python 3، وهو أداة إدارة حِزم Python، ثم نحدّثها. النوع:
نافذة المحطة الطرفية:
sudo apt install python3-pip
pip3 install --upgrade pip
يمكننا مرة أخرى التحقّق من تثبيت pip3 من خلال:
نافذة المحطة الطرفية:
pip3 --version
في وقت كتابة هذا المقال، نرى pip 20.2.3 مطبوعًا في الوحدة الطرفية بعد تنفيذ هذا الأمر.
قبل أن نتمكّن من تثبيت TensorFlow، يجب أن يكون إصدار حزمة Python "setuptools" هو 41.0.0 أو إصدار أحدث. نفِّذ الأمر التالي للتأكّد من تحديثه إلى أحدث إصدار:
نافذة المحطة الطرفية:
pip3 install -U setuptools
أخيرًا، يمكننا الآن تثبيت TensorFlow لـ Python:
نافذة المحطة الطرفية:
pip3 install tensorflow
قد يستغرق إكمال هذه العملية بعض الوقت، لذا يُرجى الانتظار إلى حين انتهائها.
لنتأكّد من تثبيت TensorFlow بشكل صحيح. أنشئ ملف Python باسم test.py في الدليل الحالي:
نافذة المحطة الطرفية:
nano test.py
بعد فتح nano، يمكننا كتابة بعض رموز Python البرمجية لعرض إصدار TensorFlow المثبَّت:
test.py:
import tensorflow as tf
print(tf.__version__)
اضغط على CTRL + O لكتابة التغييرات على القرص، ثم على CTRL + X للخروج من محرر nano.
يمكننا الآن تشغيل ملف Python هذا للاطّلاع على إصدار TensorFlow المطبوع على الشاشة:
نافذة المحطة الطرفية:
python3 test.py
في وقت كتابة هذا المستند، نرى 2.3.1 مطبوعًا على وحدة التحكّم لإصدار TensorFlow Python المثبَّت لدينا.
4. إنشاء نموذج Python
ستشرح الخطوة التالية من هذا الدرس التطبيقي حول الترميز كيفية إنشاء نموذج بسيط بلغة Python لتوضيح كيفية حفظ هذا النموذج المدرَّب الناتج بتنسيق "SavedModel" لاستخدامه بعد ذلك مع أداة التحويل المستندة إلى سطر الأوامر في TensorFlow.js. سيكون المبدأ مشابهًا لأي نموذج Python تحاول تحويله، ولكن سنبقي هذا الرمز بسيطًا حتى يتمكّن الجميع من فهمه.
لنعدّل ملف test.py الذي أنشأناه في القسم الأول ونعدّل الرمز ليكون على النحو التالي:
test.py:
import tensorflow as tf
print(tf.__version__)
# Import NumPy - package for working with arrays in Python.
import numpy as np
# Import useful keras functions - this is similar to the
# TensorFlow.js Layers API functionality.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# Create a new dense layer with 1 unit, and input shape of [1].
layer0 = Dense(units=1, input_shape=[1])
model = Sequential([layer0])
# Compile the model using stochastic gradient descent as optimiser
# and the mean squared error loss function.
model.compile(optimizer='sgd', loss='mean_absolute_error')
# Provide some training data! Here we are using some fictional data
# for house square footage and house price (which is simply 1000x the
# square footage) which our model must learn for itself.
xs = np.array([800.0, 850.0, 900.0, 950.0, 980.0, 1000.0, 1050.0, 1075.0, 1100.0, 1150.0, 1200.0, 1250.0, 1300.0, 1400.0, 1500.0, 1600.0, 1700.0, 1800.0, 1900.0, 2000.0], dtype=float)
ys = np.array([800000.0, 850000.0, 900000.0, 950000.0, 980000.0, 1000000.0, 1050000.0, 1075000.0, 1100000.0, 1150000.0, 1200000.0, 1250000.0, 1300000.0, 1400000.0, 1500000.0, 1600000.0, 1700000.0, 1800000.0, 1900000.0, 2000000.0], dtype=float)
# Train the model for 500 epochs.
model.fit(xs, ys, epochs=500, verbose=0)
# Test the trained model on a test input value
print(model.predict([1200.0]))
# Save the model we just trained to the "SavedModel" format to the
# same directory our test.py file is located.
tf.saved_model.save(model, './')
سيدرّب هذا الرمز نموذج انحدار خطي بسيطًا جدًا لتعلُّم تقدير العلاقة بين قيم x (المدخلات) وقيم y (المخرجات) المقدَّمة. بعد ذلك، سنحفظ النموذج المدرَّب الناتج على القرص. راجِع التعليقات المضمّنة للحصول على مزيد من التفاصيل حول وظيفة كل سطر.
إذا تحقّقنا من الدليل بعد تشغيل هذا البرنامج (من خلال استدعاء python3 test.py)، من المفترض أن نرى الآن بعض الملفات والمجلدات الجديدة التي تم إنشاؤها في الدليل الحالي:
- test.py
- saved_model.pb
- الأصول
- المتغيرات
لقد أنشأنا الآن الملفات التي يحتاج إليها محوّل TensorFlow.js لتحويل هذا النموذج ليعمل في المتصفّح.
5- تحويل SavedModel إلى تنسيق TensorFlow.js
تثبيت أداة تحويل TensorFlow.js
لتثبيت المحوّل، شغِّل الأمر التالي:
نافذة المحطة الطرفية:
pip3 install tensorflowjs
كان ذلك سهلاً.
بافتراض أنّنا كنا نستخدم أداة التحويل من سطر الأوامر (tensorflowjs_converter) وليس إصدار المعالج الموضّح أعلاه، يمكننا استدعاء الأمر التالي لتحويل النموذج المحفوظ الذي أنشأناه للتو وتمرير المَعلمات بشكلٍ صريح إلى أداة التحويل:
نافذة المحطة الطرفية:
tensorflowjs_converter \
--input_format=keras_saved_model \
./ \
./predict_houses_tfjs
ما الذي يحدث هنا؟ أولاً، سنستدعي ملف tensorflowjs_converter الثنائي الذي ثبّتناه للتو ونحدّد أنّنا نحاول تحويل نموذج محفوظ من Keras.
في مثال الرمز البرمجي أعلاه، ستلاحظ أنّنا استوردنا Keras واستخدمنا واجهات برمجة التطبيقات ذات الطبقات الأعلى مستوى لإنشاء النموذج. إذا لم تكن قد استخدمت keras في رمز Python البرمجي، يمكنك استخدام تنسيق إدخال مختلف:
- keras: لتحميل تنسيق keras (نوع ملف HDF5)
- tf_saved_model: لتحميل نموذج يستخدم واجهات برمجة التطبيقات الأساسية في TensorFlow بدلاً من Keras.
- tf_frozen_model - لتحميل نموذج يحتوي على أوزان ثابتة
- tf_hub: لتحميل نموذج تم إنشاؤه من tensorflow hub.
يمكنك الاطّلاع على مزيد من المعلومات حول هذه التنسيقات الأخرى هنا.
تحدّد المَعلمتان التاليتان المجلد الذي يوجد فيه النموذج المحفوظ. في العرض التوضيحي أعلاه، نحدّد الدليل الحالي، ثم نحدّد أخيرًا الدليل الذي نريد إخراج عملية التحويل إليه، والذي نحدّده أعلاه كمجلد باسم "predict_houses_tfjs" في الدليل الحالي.
يؤدي تنفيذ الأمر أعلاه إلى إنشاء مجلد جديد في الدليل الحالي باسم predict_houses_tfjs يحتوي على :
- model.json
- Group1-shard1of1.bin
هذه هي الملفات التي نحتاج إليها لتشغيل النموذج في متصفّح الويب. احفظ هذه الملفات لأنّنا سنستخدمها في القسم التالي.
6. استخدام النموذج المحوَّل في المتصفّح
استضافة الملفات المحوّلة
أولاً، يجب وضع ملفَي model.json و*.bin اللذين تم إنشاؤهما على خادم ويب حتى نتمكّن من الوصول إليهما من خلال صفحة الويب. في هذا العرض التوضيحي، سنستخدم Glitch.com لتسهيل متابعة الخطوات. ومع ذلك، إذا كان لديك خبرة في هندسة الويب، يمكنك اختيار تشغيل خادم http بسيط على مثيل خادم Ubuntu الحالي لتنفيذ ذلك بدلاً من ذلك. القرار بيدك لاختيار الصوت الذي يناسبك.
تحميل الملفات إلى Glitch
- سجِّل الدخول إلى Glitch.com.
- استخدِم هذا الرابط من أجل استنساخ مشروع TensorFlow.js النموذجي. يحتوي هذا الملف على ملفات html وcss وjs أساسية تستورد مكتبة TensorFlow.js لتكون جاهزة للاستخدام.
- انقر على مجلد "مواد العرض" في اللوحة اليمنى.
- انقر على "تحميل مادة عرض" واختَر
group1-shard1of1.binلتحميلها في هذا المجلد. من المفترض أن يظهر بالشكل التالي بعد التحميل:
- إذا نقرت على ملف
group1-shard1of1.binالذي حمّلته للتو، سيصبح بإمكانك نسخ عنوان URL الخاص بموقعه. انسخ هذا المسار الآن كما هو موضّح:
- عدِّل الآن
model.jsonباستخدام محرّر النصوص المفضّل لديك على جهازك المحلي وابحث (باستخدام CTRL+F) عن الملفgroup1-shard1of1.binالذي سيتم ذكره في مكان ما بداخله.
استبدِل اسم الملف هذا بعنوان URL الذي نسخته من الخطوة 5، ولكن احذف https://cdn.glitch.com/ الذي ينشئه الخلل من المسار المنسوخ.
بعد التعديل، يجب أن يبدو على النحو التالي (لاحظ كيف تمت إزالة مسار الخادم الرئيسي والاحتفاظ باسم الملف الذي تم تحميله فقط):
7. احفظ الآن ملف model.json المعدَّل هذا وحمِّله إلى Glitch من خلال النقر على "مواد العرض"، ثم على الزر "تحميل مادة عرض" (مهم). إذا لم تستخدم الزر الفعلي، وقمت بسحب الملف وإفلاته، سيتم تحميله كملف قابل للتعديل بدلاً من تحميله على شبكة توصيل المحتوى (CDN)، ولن يكون في المجلد نفسه، وسيتم افتراض المسار النسبي عندما يحاول TensorFlow.js تنزيل الملفات الثنائية لنموذج معيّن. إذا تم ذلك بشكل صحيح، من المفترض أن يظهر ملفان في المجلد assets على النحو التالي: 
رائع! نحن الآن جاهزون لاستخدام ملفاتنا المحفوظة مع بعض الرموز البرمجية الفعلية في المتصفح.
تحميل النموذج
بعد استضافة الملفات المحوّلة، يمكننا كتابة صفحة ويب بسيطة لتحميل هذه الملفات واستخدامها لإجراء عملية توقّع. افتح ملف script.js في مجلد مشروع Glitch واستبدِل محتوى هذا الملف بما يلي بعد تغيير const MODEL_URL للإشارة إلى رابط Glitch.com الذي تم إنشاؤه لملف model.json الذي حمّلته على Glitch:
script.js:
// Grab a reference to our status text element on the web page.
// Initially we print out the loaded version of TFJS.
const status = document.getElementById('status');
status.innerText = 'Loaded TensorFlow.js - version: ' + tf.version.tfjs;
// Specify location of our Model.json file we uploaded to the Glitch.com CDN.
const MODEL_URL = ‘YOUR MODEL.JSON URL HERE! CHANGE THIS!';
// Specify a test value we wish to use in our prediction.
// Here we use 950, so we expect the result to be close to 950,000.
const TEST_VALUE = 950.0
// Create an asynchronous function.
async function run() {
// Load the model from the CDN.
const model = await tf.loadLayersModel(MODEL_URL);
// Print out the architecture of the loaded model.
// This is useful to see that it matches what we built in Python.
console.log(model.summary());
// Create a 1 dimensional tensor with our test value.
const input = tf.tensor1d([TEST_VALUE]);
// Actually make the prediction.
const result = model.predict(input);
// Grab the result of prediction using dataSync method
// which ensures we do this synchronously.
status.innerText = 'Input of ' + TEST_VALUE +
'sqft predicted as $' + result.dataSync()[0];
}
// Call our function to start the prediction!
run();
سيؤدي تنفيذ الرمز أعلاه بعد تغيير الثابت MODEL_URL للإشارة إلى مسار model.json إلى ظهور الناتج الموضّح أدناه.

إذا فحصنا وحدة التحكّم في متصفّح الويب (اضغط على F12 لعرض أدوات المطوّرين في المتصفّح)، يمكننا أيضًا الاطّلاع على وصف النموذج الذي تم تحميله والذي يعرض ما يلي:

بمقارنة ذلك برمز Python البرمجي في بداية هذا الدرس التطبيقي حول الترميز، يمكننا التأكّد من أنّ هذه هي الشبكة نفسها التي أنشأناها باستخدام إدخال كثيف واحد وطبقة كثيفة واحدة تحتوي على عقدة واحدة.
تهانينا! لقد نفّذت للتو نموذجًا تم تدريبه باستخدام Python في متصفّح الويب.
7. النماذج التي لا تحقّق إحالات ناجحة
في بعض الأحيان، لن تكون النماذج الأكثر تعقيدًا التي يتم تجميعها لاستخدام عمليات أقل شيوعًا متاحة للتحويل. إنّ إصدار TensorFlow.js المستند إلى المتصفح هو إعادة كتابة كاملة لـ TensorFlow، وبالتالي لا تتوافق حاليًا جميع العمليات المنخفضة المستوى التي تتضمّنها واجهة برمجة التطبيقات TensorFlow C++ (هناك الآلاف منها)، ولكن تتم إضافة المزيد منها بمرور الوقت مع تطوّرنا وزيادة استقرار العمليات الأساسية.
في وقت كتابة هذا المستند، إحدى هذه الدوال في TensorFlow Python التي تنشئ عملية غير متوافقة عند تصديرها كنموذج محفوظ هي linalg.diag. إذا حاولنا تحويل savedmodel يستخدم هذا في Python (الذي يتيح العمليات الناتجة التي ينتجها)، سيظهر لنا خطأ مشابه للخطأ الموضّح أدناه:

يمكننا هنا أن نرى باللون الأحمر أنّ طلب linalg.diag تم تجميعه لإنتاج عملية باسم MatrixDiagV3 غير متوافقة مع TensorFlow.js في متصفّح الويب في وقت كتابة هذا الدرس التطبيقي حول الترميز.
ما هي الإجراءات التي يجب اتّخاذها؟
ولديك خياران لتنفيذ ذلك.
- يمكنك تنفيذ هذه العملية غير المتوفّرة في TensorFlow.js، فنحن مشروع مفتوح المصدر ونرحّب بالمساهمات في أمور مثل العمليات الجديدة. راجِع هذا الدليل حول كتابة عمليات جديدة في TensorFlow.js. إذا تمكّنت من إجراء ذلك، يمكنك بعد ذلك استخدام العلامة
Skip_op_checkفي أداة التحويل من سطر الأوامر لتجاهل هذا الخطأ ومواصلة التحويل على أي حال (سيتم افتراض أنّ هذه العملية متاحة في الإصدار الجديد من TensorFlow.js الذي أنشأته والذي يتوافق مع العملية غير المتوفّرة). - حدِّد الجزء من رمز Python الذي أدّى إلى حدوث العملية غير المتوافقة في ملف
savedmodelالذي صدّرته. قد يكون من السهل تحديد ذلك في مجموعة صغيرة من الرموز، ولكن في النماذج الأكثر تعقيدًا، قد يتطلّب ذلك بعض البحث، إذ لا تتوفّر حاليًا طريقة لتحديد استدعاء دالة Python العالية المستوى التي أنتجت عملية معيّنة مرة واحدة بتنسيق الملفsavedmodel. بعد تحديد الموقع الجغرافي، يمكنك تغييره لاستخدام طريقة أخرى متاحة.
8. تهانينا
تهانينا، لقد اتّخذت خطواتك الأولى في استخدام نموذج Python من خلال TensorFlow.js في متصفّح الويب.
ملخّص
في هذا الدرس العملي، تعلّمنا كيفية:
- إعداد بيئة Linux لتثبيت TensorFlow المستند إلى Python
- تصدير SavedModel في Python
- تثبيت أداة التحويل في سطر الأوامر TensorFlow.js
- استخدِم أداة التحويل من سطر الأوامر في TensorFlow.js لإنشاء الملفات المطلوبة من جهة العميل.
- استخدام الملفات التي تم إنشاؤها في تطبيق ويب حقيقي
- تحديد النماذج التي لن يتم تحويلها والإجراءات التي يجب تنفيذها للسماح بتحويلها في المستقبل
ما هي الخطوات التالية؟
يُرجى تذكُّر الإشارة إلينا في أي محتوى تنشئه باستخدام #MadeWithTFJS للحصول على فرصة لعرضه على وسائل التواصل الاجتماعي أو حتى في فعاليات TensorFlow المستقبلية. يسرّنا أن نرى ما تحوّله وتستخدمه من جهة العميل في المتصفّح.
المزيد من الدروس التطبيقية حول الترميز في TensorFlow.js للتعمّق أكثر
- كتابة شبكة عصبية من البداية في TensorFlow.js
- صناعة كاميرا ويب ذكية يمكنها رصد الأجسام
- تصنيف الصور المخصّص باستخدام التعلّم القائم على نقل المهام في TensorFlow.js