حفظ وتحميل النماذج

يوفر 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');

سيؤدي هذا إلى قيام المتصفح بتنزيل ملفات النموذج على جهاز المستخدم. سيتم إنتاج ملفين:

  1. ملف JSON نصي يسمى [my-model].json ، والذي يحمل الهيكل والإشارة إلى ملف الأوزان الموضح أدناه.
  2. ملف ثنائي يحمل قيم الوزن المسمى [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 ويتكون من ملفين

  1. ملف JSON نصي يسمى model.json ، والذي يحمل الهيكل والإشارة إلى ملف الأوزان الموضح أدناه.
  2. ملف ثنائي يحمل قيم الوزن المسمى 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 .

  1. ملف JSON نصي يسمى [model].json ، والذي يحمل الهيكل والإشارة إلى ملف الأوزان الموضح أدناه.
  2. ملف ثنائي يحمل قيم الوزن المسمى [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.