يوفر TensorFlow.js وظائف لحفظ وتحميل النماذج التي تم إنشاؤها باستخدام Layers
API أو تم تحويلها من نماذج TensorFlow الحالية. قد تكون هذه نماذج قمت بتدريبها بنفسك أو تلك التي تم تدريبها من قبل الآخرين. تتمثل إحدى الفوائد الرئيسية لاستخدام Layers api في أن النماذج التي تم إنشاؤها باستخدامها قابلة للتسلسل وهذا ما سنستكشفه في هذا البرنامج التعليمي.
سيركز هذا البرنامج التعليمي على حفظ نماذج TensorFlow.js وتحميلها (يمكن تحديدها بواسطة ملفات JSON). يمكننا أيضًا استيراد نماذج TensorFlow Python. يتم تغطية تحميل هذه النماذج في الدرسين التاليين:
احفظ نموذج tf
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
بالنظر إلى النموذج الذي تم حفظه باستخدام إحدى الطرق المذكورة أعلاه ، يمكننا تحميله باستخدام 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.