يوفر TensorFlow.js وظيفة لحفظ وتحميل النماذج التي تم إنشاؤها باستخدام Layers
API أو تم تحويلها من نماذج TensorFlow الحالية. قد تكون هذه نماذج قمت بتدريبها بنفسك أو تلك التي تم تدريبها من قبل الآخرين. تتمثل الميزة الرئيسية لاستخدام واجهة برمجة تطبيقات الطبقات في أن النماذج التي تم إنشاؤها باستخدامها قابلة للتسلسل وهذا ما سنستكشفه في هذا البرنامج التعليمي.
سيركز هذا البرنامج التعليمي على حفظ وتحميل نماذج TensorFlow.js (التي يمكن تحديدها بواسطة ملفات JSON). يمكننا أيضًا استيراد نماذج TensorFlow Python. تتم تغطية تحميل هذه النماذج في البرنامجين التعليميين التاليين:
حفظ tf.Model
يوفر كل من tf.Model
و tf.Sequential
وظيفة model.save
تسمح لك بحفظ هيكل النموذج وأوزانه .
الطوبولوجيا: هذا ملف يصف بنية النموذج (أي العمليات التي يستخدمها). ويحتوي على إشارات إلى أوزان النماذج المخزنة خارجيًا.
الأوزان: هي ملفات ثنائية تقوم بتخزين أوزان نموذج معين بتنسيق فعال. يتم تخزينها بشكل عام في نفس المجلد مثل الهيكل.
دعونا نلقي نظرة على الشكل الذي يبدو عليه رمز حفظ النموذج
const saveResult = await model.save('localstorage://my-model-1');
بعض الأشياء يجب ملاحظتها:
- تأخذ طريقة
save
وسيطة سلسلة تشبه عنوان URL تبدأ بمخطط . يصف هذا نوع الوجهة التي نحاول حفظ النموذج فيها. في المثال أعلاه، المخطط هوlocalstorage://
- ويتبع المخطط مسار . في المثال أعلاه المسار هو
my-model-1
. - طريقة
save
غير متزامنة. - القيمة المرجعة لـ
model.save
هي كائن JSON يحمل معلومات مثل أحجام البايت لهيكل النموذج وأوزانه. - لا تؤثر البيئة المستخدمة لحفظ النموذج على البيئات التي يمكنها تحميل النموذج. إن حفظ النموذج في Node.js لا يمنع تحميله في المتصفح.
أدناه سوف ندرس المخططات المختلفة المتاحة.
التخزين المحلي (المتصفح فقط)
المخطط: localstorage://
await model.save('localstorage://my-model');
يؤدي هذا إلى حفظ نموذج تحت اسم my-model
في وحدة التخزين المحلية للمتصفح. سيستمر هذا بين عمليات التحديث، على الرغم من إمكانية مسح مساحة التخزين المحلية بواسطة المستخدمين أو المتصفح نفسه إذا أصبحت المساحة مصدر قلق. يقوم كل متصفح أيضًا بتعيين الحد الخاص به بشأن كمية البيانات التي يمكن تخزينها في وحدة التخزين المحلية لمجال معين.
IndexedDB (المتصفح فقط)
المخطط: indexeddb://
await model.save('indexeddb://my-model');
يؤدي هذا إلى حفظ النموذج في مساحة تخزين IndexedDB الخاصة بالمتصفح. مثل التخزين المحلي، فإنه يستمر بين عمليات التحديث، كما أنه يميل أيضًا إلى أن يكون له حدود أكبر على حجم الكائنات المخزنة.
تنزيلات الملفات (المتصفح فقط)
المخطط: downloads://
await model.save('downloads://my-model');
سيؤدي هذا إلى قيام المتصفح بتنزيل ملفات النموذج على جهاز المستخدم. سيتم إنتاج ملفين:
- ملف JSON نصي يسمى
[my-model].json
، والذي يحمل الهيكل والإشارة إلى ملف الأوزان الموضح أدناه. - ملف ثنائي يحمل قيم الوزن المسمى
[my-model].weights.bin
.
يمكنك تغيير الاسم [my-model]
للحصول على ملفات باسم مختلف.
نظرًا لأن ملف .json
يشير إلى .bin
باستخدام مسار نسبي، فيجب أن يكون الملفان في نفس المجلد.
طلب HTTP(S).
المخطط: http://
أو https://
await model.save('http://model-server.domain/upload')
سيؤدي هذا إلى إنشاء طلب ويب لحفظ نموذج على خادم بعيد. يجب أن تكون متحكمًا في هذا الخادم البعيد حتى تتمكن من التأكد من أنه قادر على التعامل مع الطلب.
سيتم إرسال النموذج إلى خادم HTTP المحدد عبر طلب POST . نص POST بتنسيق multipart/form-data
ويتكون من ملفين
- ملف JSON نصي يسمى
model.json
، والذي يحمل الهيكل والإشارة إلى ملف الأوزان الموضح أدناه. - ملف ثنائي يحمل قيم الوزن المسمى
model.weights.bin
.
لاحظ أن اسم الملفين سيكون دائمًا كما هو محدد أعلاه تمامًا (الاسم مدمج في الوظيفة). يحتوي مستند API هذا على مقتطف كود Python الذي يوضح كيفية استخدام إطار عمل الويب flask للتعامل مع الطلب الذي تم إنشاؤه من save
.
سيتعين عليك غالبًا تمرير المزيد من الوسائط أو طلب الرؤوس إلى خادم HTTP الخاص بك (على سبيل المثال للمصادقة أو إذا كنت تريد تحديد مجلد يجب حفظ النموذج فيه). يمكنك الحصول على تحكم دقيق في هذه الجوانب من الطلبات من save
عن طريق استبدال وسيطة سلسلة URL في tf.io.browserHTTPRequest
. توفر واجهة برمجة التطبيقات هذه مرونة أكبر في التحكم في طلبات HTTP.
على سبيل المثال:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
نظام الملفات الأصلي (Node.js فقط)
المخطط: file://
await model.save('file:///path/to/my-model');
عند التشغيل على Node.js، لدينا أيضًا إمكانية الوصول المباشر إلى نظام الملفات ويمكننا حفظ النماذج هناك. سيقوم الأمر أعلاه بحفظ ملفين في path
المحدد بعد scheme
.
- ملف JSON نصي يسمى
[model].json
، والذي يحمل الهيكل والإشارة إلى ملف الأوزان الموضح أدناه. - ملف ثنائي يحمل قيم الوزن المسمى
[model].weights.bin
.
لاحظ أن اسم الملفين سيكون دائمًا كما هو محدد أعلاه تمامًا (الاسم مدمج في الوظيفة).
تحميل tf.Model
بالنظر إلى النموذج الذي تم حفظه باستخدام إحدى الطرق المذكورة أعلاه، يمكننا تحميله باستخدام tf.loadLayersModel
API.
دعونا نلقي نظرة على الشكل الذي يبدو عليه رمز تحميل النموذج
const model = await tf.loadLayersModel('localstorage://my-model-1');
بعض الأشياء يجب ملاحظتها:
- مثل
model.save()
، تأخذ الدالةloadLayersModel
وسيطة سلسلة تشبه عنوان URL تبدأ بمخطط . يصف هذا نوع الوجهة التي نحاول تحميل النموذج منها. - ويتبع المخطط مسار . في المثال أعلاه المسار هو
my-model-1
. - يمكن استبدال السلسلة التي تشبه عنوان url بكائن يطابق واجهة IOHandler.
- الدالة
tf.loadLayersModel()
غير متزامنة. - القيمة المرجعة لـ
tf.loadLayersModel
هيtf.Model
أدناه سوف ندرس المخططات المختلفة المتاحة.
التخزين المحلي (المتصفح فقط)
المخطط: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
يؤدي هذا إلى تحميل نموذج باسم my-model
من وحدة التخزين المحلية للمتصفح.
IndexedDB (المتصفح فقط)
المخطط: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
يؤدي هذا إلى تحميل نموذج من مساحة تخزين IndexedDB الخاصة بالمتصفح.
HTTP(S)
المخطط: http://
أو https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
يؤدي هذا إلى تحميل نموذج من نقطة نهاية http. بعد تحميل ملف json
، ستقوم الوظيفة بتقديم طلبات لملفات .bin
المقابلة التي يشير إليها ملف json
.
نظام الملفات الأصلي (Node.js فقط)
المخطط: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
عند التشغيل على Node.js، لدينا أيضًا إمكانية الوصول المباشر إلى نظام الملفات ويمكننا تحميل النماذج من هناك. لاحظ أنه في استدعاء الوظيفة أعلاه نشير إلى ملف model.json نفسه (بينما عند الحفظ نحدد مجلدًا). يجب أن يكون ملف (ملفات) .bin
المقابلة في نفس المجلد مثل ملف json
.
تحميل النماذج باستخدام IOHandlers
إذا كانت المخططات المذكورة أعلاه غير كافية لاحتياجاتك، فيمكنك تنفيذ سلوك تحميل مخصص باستخدام IOHandler
. أحد IOHandler
التي يوفرها TensorFlow.js هو tf.io.browserFiles
الذي يسمح لمستخدمي المتصفح بتحميل ملفات النماذج في المتصفح. راجع الوثائق لمزيد من المعلومات.
حفظ النماذج وتحميلها باستخدام معالجات IOHandlers المخصصة
إذا كانت المخططات المذكورة أعلاه غير كافية لاحتياجات التحميل أو الحفظ الخاصة بك، فيمكنك تنفيذ سلوك التسلسل المخصص من خلال تطبيق IOHandler
.
IOHandler
هو كائن ذو طريقة save
load
.
تأخذ وظيفة save
معلمة واحدة تتطابق مع واجهة ModelArtifacts ويجب أن تُرجع وعدًا يتم حله إلى كائن SaveResult .
لا تأخذ دالة load
أي معلمات ويجب أن تُرجع وعدًا يتم حله لكائن ModelArtifacts . هذا هو نفس الكائن الذي تم تمريره save
.
راجع BrowserHTTPRequest للحصول على مثال حول كيفية تنفيذ IOHandler.