1. مقدمة
لقد اتخذت الخطوات الأولى باستخدام TensorFlow.js، وجربت نماذجنا المعدة مسبقًا، أو ربما صنعت نماذجك الخاصة، ولكنك لاحظت بعض الأبحاث المتطورة التي ظهرت في لغة بايثون وتشعر بالفضول لمعرفة ما إذا كان سيتم إجرائها في متصفح الويب لتحويل هذه الفكرة الرائعة إلى حقيقة واقعة لملايين الأشخاص بطريقة قابلة للتطور. ألا يبدو هذا مألوفًا؟ إذا كان الأمر كذلك، فهذا هو برنامج CodeLab المناسب لك.
صمّم فريق TensorFlow.js أداة ملائمة لتحويل النماذج بتنسيق SavedModel إلى TensorFlow.js باستخدام محوّل سطر الأوامر كي تتمكّن من استخدام هذه النماذج لمدى الوصول إلى الإنترنت وحجمه.
المعلومات التي ستطّلع عليها
ستتعلم في هذا التمرين المعملي عن الترميز كيفية استخدام محوّل سطر الأوامر TensorFlow.js لتنفيذ عملية نقل ملف SaveModel من إنشاء بايثون إلى تنسيق model.json المطلوب للتنفيذ على جهة العميل في متصفح الويب.
وهذه القيود تحديدًا هي كالآتي:
- طريقة إنشاء نموذج تعلُّم الآلة بسيط في Python وحفظه بالتنسيق المطلوب الذي يحتاجه محوّل TensorFlow.js.
- كيفية تثبيت واستخدام محوّل TensorFlow.js على SaveModel الذي صدّرته من Python.
- احصل على الملفات الناتجة من الإحالة الناجحة واستخدِمها في تطبيق الويب JS.
- افهم ما يجب فعله عند حدوث خطأ ما (لن يتم تحويل جميع النماذج) والخيارات المتاحة لك.
تخيّل أنّ لديك القدرة على إجراء بعض الأبحاث التي تم إصدارها حديثًا وإتاحة هذا النموذج للملايين من مطوّري برامج JavaScript على مستوى العالم. أو ربما ستستخدم هذا بنفسك في إبداعك، والتي يمكن لأي شخص في العالم بعد ذلك تجربتها إذا تم تشغيلها في متصفح الويب، حيث لا يلزم أي تبعيات أو إعداد بيئة معقدة. هل أنت مستعد لاختراق موقعك؟ هذا رائع
شارِكنا تحويلك.
يمكنك استخدام ما تعلمناه اليوم لمحاولة تحويل بعض النماذج المفضلة لديك من بايثون. إذا نجحت في تنفيذ ذلك بنجاح، وأنشأت موقعًا إلكترونيًا تجريبيًا صالحًا للنموذج أثناء تنفيذه، يمكنك الإشارة إلى حسابنا على وسائل التواصل الاجتماعي باستخدام الهاشتاغ #MadeWithTFJS للاستفادة من فرصة عرض مشروعك على مدونة TensorFlow أو حتى أحداث العروض والتقديم المستقبلية. يسرّنا نقل المزيد من الأبحاث الرائعة إلى الويب والسماح لعدد أكبر من المستخدمين باستخدام هذه النماذج بطرق مبتكرة أو إبداعية، تمامًا كما هو الحال مع هذا المثال الرائع.
2. ما هو TensorFlow.js؟
TensorFlow.js هي مكتبة مفتوحة المصدر لتعلُّم الآلة يمكنها العمل في أي مكان يتوفّر فيه JavaScript. وهو يستند إلى مكتبة TensorFlow الأصلية المكتوبة بلغة Python وتهدف إلى إعادة إنشاء تجربة المطوِّر هذه ومجموعة من واجهات برمجة التطبيقات لمنظومة JavaScript المتكاملة.
أين يمكن استخدامها؟
ونظرًا لإمكانية نقل لغة JavaScript، يمكنك الآن الكتابة بلغة واحدة وتنفيذ عملية تعلُّم الآلة على جميع الأنظمة الأساسية التالية بسهولة:
- من جانب العميل في متصفح الويب باستخدام vanilla JavaScript
- من جانب الخادم وحتى أجهزة إنترنت الأشياء مثل Raspberry Pi التي تستخدم Node.js
- تطبيقات الكمبيوتر المكتبي باستخدام Electron
- تطبيقات متوافقة مع الأجهزة الجوّالة باستخدام React Native
يدعم TensorFlow.js أيضًا العديد من الخلفيات في كل من هذه البيئات (البيئات الفعلية القائمة على الأجهزة التي يمكن تنفيذها داخل مثل وحدة المعالجة المركزية (CPU) أو WebGL (على سبيل المثال). "الواجهة الخلفية" في هذا السياق لا يعني وجود بيئة من جانب الخادم - الواجهة الخلفية للتنفيذ يمكن أن تكون من جانب العميل في WebGL على سبيل المثال) لضمان التوافق وأيضًا الحفاظ على سرعة سير الأمور. في الوقت الحالي، يدعم TensorFlow.js ما يلي:
- تنفيذ WebGL على بطاقة رسومات الجهاز (GPU) - هذه هي أسرع طريقة لتنفيذ النماذج الأكبر (التي يزيد حجمها عن 3 ميغابايت) مع تسريع وحدة معالجة الرسومات.
- تنفيذ Web Assembly (WASM) على وحدة المعالجة المركزية (CPU): لتحسين أداء وحدة المعالجة المركزية (CPU) على جميع الأجهزة، بما في ذلك الهواتف الجوّالة من الجيل القديم مثلاً. ويناسب ذلك بشكل أفضل النماذج الأصغر (أقل من 3 ميغابايت) التي يمكنها في الواقع تنفيذها بشكل أسرع على وحدة المعالجة المركزية (CPU) باستخدام WASM مقارنةً بـ WebGL بسبب عبء تحميل المحتوى إلى معالج رسومات.
- تنفيذ وحدة المعالجة المركزية (CPU) - يجب ألا يكون الجهاز الاحتياطي متاحًا لأي من البيئات الأخرى. هذا الخيار هو الأبطأ من بين ثلاثة، ولكن يمكنك دائمًا الاستماع إليه.
ملاحظة: يمكنك اختيار فرض إحدى هذه الخلفيات إذا كنت تعرف الجهاز الذي سيتم التنفيذ عليه، أو يمكنك ببساطة السماح لمنصة TensorFlow.js باختيار عدم تحديد ذلك.
القوى الخارقة من جانب العميل
يمكن أن يؤدي تشغيل TensorFlow.js في متصفح الويب على جهاز العميل إلى عدة فوائد جديرة بالاهتمام.
الخصوصية
يمكنك تدريب البيانات وتصنيفها على جهاز العميل بدون إرسال البيانات مطلقًا إلى خادم ويب لجهة خارجية. وفي بعض الأحيان، قد يكون هذا شرطًا للالتزام بالقوانين المحلية، مثل اللائحة العامة لحماية البيانات، أو عند معالجة أي بيانات قد يرغب المستخدم في الاحتفاظ بها على جهازه وعدم إرسالها إلى جهة خارجية.
السرعة
نظرًا لعدم حاجتك إلى إرسال البيانات إلى خادم بعيد، يمكن أن يكون الاستنتاج (عملية تصنيف البيانات) أسرع. والأفضل من ذلك أنّه يمكنك الوصول مباشرةً إلى أجهزة الاستشعار في الجهاز، مثل الكاميرا والميكروفون ونظام تحديد المواقع العالمي (GPS) ومقياس التسارع وغيرها، في حال منحك المستخدم إذن الوصول.
الوصول إلى الجمهور وتوسيع نطاقه
بنقرة واحدة، يستطيع أي شخص في العالم النقر على الرابط الذي ترسله إليه، وفتح صفحة الويب في متصفحه، والاستفادة من ما قمت بإنشائه. ليست هناك حاجة إلى إعداد Linux معقد من جانب الخادم مع برامج تشغيل CUDA وغير ذلك الكثير لاستخدام نظام التعلم الآلي فقط.
التكلفة
تعني عدم توفّر خوادم أنّ ما عليك سوى الدفع مقابل شبكة توصيل المحتوى (CDN) لاستضافة ملفات HTML وCSS وJS والنماذج. أما تكلفة شبكة توصيل المحتوى (CDN)، فأقل تكلفة بكثير من الاحتفاظ بخادم (من المحتمل أن يكون مع إرفاق بطاقة رسومات) على مدار الساعة طوال أيام الأسبوع.
الميزات من جانب الخادم
بالاستفادة من تنفيذ Node.js في TensorFlow.js يمكن توفير الميزات التالية.
دعم CUDA بالكامل
على الخادم، لتسريع بطاقة الرسومات، يجب تثبيت برامج تشغيل NVIDIA CUDA لتمكين TensorFlow من العمل مع بطاقة الرسومات (على عكس المتصفح الذي يستخدم WebGL ولا يلزم التثبيت). مع ذلك، يمكنك الاستفادة بشكل كامل من القدرات ذات المستوى الأدنى في بطاقة الرسومات من خلال التوافق الكامل مع CUDA، ما يؤدي إلى تدريب واستنتاج أسرع. يتساوى الأداء مع تنفيذ Python TensorFlow حيث إنهما يشتركان في نفس خلفية C++.
مقاس الطراز
بالنسبة إلى النماذج المتطورة من البحث، قد تعمل على نماذج كبيرة جدًا، ربما يصل حجمها إلى غيغابايت. لا يمكن تشغيل هذه النماذج في الوقت الحالي في متصفح الويب بسبب قيود استخدام الذاكرة لكل علامة تبويب في المتصفح. لتشغيل هذه النماذج الأكبر حجمًا، يمكنك استخدام Node.js على خادمك الخاص مع مواصفات الأجهزة التي تحتاجها لتشغيل هذا النموذج بكفاءة.
إنترنت الأشياء (IOT)
تتوافق Node.js مع أجهزة الكمبيوتر الشائعة الأحادية اللوحة، مثل Rspberry 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 عند إنشاء مثيل محرك حوسبة جديد vanilla vanilla وهو ما سنستخدمه. يمكنك بالطبع استخدام جهازك الخاص، أو حتى نظام تشغيل مختلف إذا اخترت ذلك، ولكن قد تختلف إرشادات التثبيت والتبعيات بين الأنظمة.
تثبيت TensorFlow (إصدار بايثون)
والآن، بما أنك ربما تحاول تحويل بعض النماذج الحالية المستندة إلى بايثون التي عثرت عليها أو ستكتبها، قبل أن نتمكن من تصدير نموذج محفوظ من بايثون، فستحتاج إلى إعداد إصدار بايثون من TensorFlow على المثيل إذا كان النموذج "SavedModel" غير متاح للتنزيل حاليًا.
بروتوكول النقل الآمن (SSH) في جهازك السحابي الذي أنشأته أعلاه ثم اكتب ما يلي في نافذة الوحدة الطرفية:
نافذة المحطة الطرفية:
sudo apt update
sudo apt-get install python3
سيضمن ذلك تثبيت Python 3 على الجهاز. لاستخدام TensorFlow، يجب تثبيت الإصدار 3.4 أو إصدار أحدث من Python.
للتحقق من تثبيت الإصدار الصحيح، اكتب ما يلي:
نافذة المحطة الطرفية:
python3 --version
من المفترض أن تظهر لك بعض النتائج التي تشير إلى رقم الإصدار، مثلاً Python 3.6.9
. إذا تمت طباعة هذا الرمز بشكل صحيح وكان أعلى من 3.4، فنحن جاهزون للمتابعة.
سنقوم بعد ذلك بتثبيت نافذة ضمن النافذة (PIP) للغة بايثون 3، وهي مدير حزم لغة بايثون، ثم نقوم بتحديثها. النوع:
نافذة المحطة الطرفية:
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 للغة بايثون:
نافذة المحطة الطرفية:
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 بسيط لتوضيح كيف يمكننا حفظ هذا النموذج المدرَّب الناتج في "SavedModel" ليتم استخدامها بعد ذلك مع محول سطر الأوامر TensorFlow.js. سيكون المبدأ مشابهًا لأي نموذج بايثون كنت تحاول تحويله، لكننا سنبقي هذه التعليمة البرمجية بسيطة حتى يتمكن الجميع من فهمها.
لنقم بتحرير ملف 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- تحويل النموذج المحفوظ إلى التنسيق TensorFlow.js
تثبيت محوّل TensorFlow.js
لتثبيت المحوّل، شغِّل الأمر التالي:
نافذة المحطة الطرفية:
pip3 install tensorflowjs
كان ذلك سهلاً.
وبافتراض أننا كنا نستخدم محوّل سطر الأوامر (tensorflowjs_converter
) وليس إصدار المعالج الموضح أعلاه، يمكننا استدعاء الأمر التالي لتحويل النموذج المحفوظ الذي أنشأناه للتو وتمرير المعلمات بشكل صريح إلى المحوّل:
نافذة المحطة الطرفية:
tensorflowjs_converter \
--input_format=keras_saved_model \
./ \
./predict_houses_tfjs
ما الذي يحدث هنا؟ أولًا، نستدعي البرنامج الثنائي tensorflowjs_converter الذي ثبته للتو، ونحدد أننا نحاول تحويل نموذج keras محفوظ.
في مثال التعليمة البرمجية أعلاه، ستلاحظ أننا استوردنا كيراس واستخدمنا واجهات برمجة التطبيقات لطبقات المستوى الأعلى لإنشاء نموذجنا. إذا لم تكن قد استخدمت كيراس في رمز بايثون، فقد تحتاج إلى استخدام تنسيق إدخال مختلف:
- keras - لتحميل تنسيق keras (نوع ملف HDF5)
- tf_saved_model - لتحميل نموذج يستخدم واجهات برمجة التطبيقات الأساسية لنظام tensorflow بدلاً من keras.
- tf_frozen_model - لتحميل نموذج يحتوي على أوزان مجمّدة.
- tf_hub - لتحميل نموذج تم إنشاؤه من مركز tensorflow.
يمكنك الاطّلاع على مزيد من المعلومات حول هذه التنسيقات الأخرى هنا.
تحدد المعلمتان التاليتان المجلد الذي يقع فيه النموذج المحفوظ. في العرض التوضيحي أعلاه، نحدد الدليل الحالي، ثم نحدد في النهاية الدليل الذي نريد إخراج التحويل إليه، والذي نحدده أعلاه كمجلد باسم "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
المعدَّل هذا وتحميله استنادًا إلى أي خلل من خلال النقر على مواد العرض، ثم النقر على "تحميل مادة عرض". زر (مهم). وإذا لم تكن تستخدم الزر الفعلي، وقمت بسحبه وإفلاته، فسيتم تحميله كملف قابل للتعديل بدلاً من شبكة توصيل المحتوى الذي لن يكون في نفس المجلد والمسار النسبي كما يفترض عندما تحاول 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++ (هناك 1000 واجهة برمجة تطبيقات)، ولكن مع مرور الوقت، تتم إضافة المزيد منها مع تطوّرها ومع زيادة ثبات العمليات الأساسية.
في وقت الكتابة، إحدى هذه الدوال في TensorFlow Python والتي تنشئ عملية غير متوافقة عند تصديرها كنموذج محفوظ هي linalg.diag
. إذا حاولنا تحويل نموذج محفوظ يستخدم ذلك في بايثون (الذي يدعم العمليات الناتجة)، سيظهر خطأ مشابه للخطأ الموضح أدناه:
نلاحظ هنا تمييزًا باللون الأحمر أنّه تم تجميع استدعاء linalg.diag
لإنشاء عملية باسم MatrixDiagV3
وهي غير متوافقة مع TensorFlow.js في متصفّح الويب في وقت كتابة هذا الدرس التطبيقي حول الترميز.
ما يجب فعله
ولديك خياران لتنفيذ ذلك.
- نفذ هذه العملية المفقودة في TensorFlow.js - نحن مشروع مفتوح المصدر ونرحب بالمساهمات في أشياء مثل العمليات الجديدة. اطّلِع على هذا الدليل حول كتابة عمليات جديدة على TensorFlow.js. إذا نجحت في ذلك، يمكنك استخدام علامة
Skip_op_check
في محول سطر الأوامر لتجاهل هذا الخطأ ومواصلة التحويل بأي شكل (ستفترض أن هذه العملية متوفرة في إصدارك الجديد من TensorFlow.js الذي أنشأته والتي تتوفر بها العملية المفقودة). - حدِّد الجزء الذي أدّى إلى تنفيذ العملية غير المتوافقة في ملف
savedmodel
الذي تم تصديره في رمز Python. قد يكون من السهل العثور على ذلك في مجموعة صغيرة من الرموز البرمجية، ولكن في النماذج الأكثر تعقيدًا، قد يتطلب ذلك بعض التحقيق، لأنّه لا تتوفّر حاليًا طريقة لتحديد استدعاء دالة Python العالية المستوى الذي أدّى إلى إنشاء عملية معيّنة مرة واحدة بتنسيق ملفsavedmodel
. وبعد تحديد الموقع الجغرافي، يمكنك تغيير ذلك لاستخدام طريقة أخرى متاحة.
8. تهانينا
تهانينا، لقد اتخذت الخطوات الأولى في استخدام نموذج بايثون عبر TensorFlow.js في متصفح الويب!
الملخّص
نتعلم في هذا التمرين المعملي الخاص بالرموز كيفية:
- إعداد بيئة Linux لتثبيت TensorFlow استنادًا إلى لغة Python
- تصدير نموذج محفوظ في Python
- تثبيت محوّل سطر الأوامر TensorFlow.js
- استخدِم محوّل سطر الأوامر TensorFlow.js لإنشاء الملفات المطلوبة من جهة العميل.
- استخدام الملفات التي تم إنشاؤها في تطبيق ويب فعلي
- تحديد النماذج التي لن يتم تحويلها وما يجب تنفيذه للسماح لها بالتحويل في المستقبل.
الخطوات التالية
ننصحك بالإشارة إلى حسابنا في أي محتوى تنشئه باستخدام #MadeWithTFJS للاستفادة من فرصة عرض فيديوهاتك على وسائل التواصل الاجتماعي أو حتى عرضها في فعاليات TensorFlow المستقبلية. نريد معرفة ما يتم تحويله واستخدامه في المتصفح.
المزيد من الدروس التطبيقية حول الترميز من TensorFlow.js للتعرّف على مزيد من التفاصيل
- كتابة شبكة عصبية من البداية في TensorFlow.js
- إنشاء كاميرا ويب ذكية يمكنها رصد الأجسام
- تصنيف الصور المخصّصة باستخدام تعلُّم النقل في TensorFlow.js