في التعلم الآلي ، النموذج هو وظيفة ذات معلمات قابلة للتعلم تقوم بتعيين مدخلات إلى مخرجات. يتم الحصول على المعلمات المثلى من خلال تدريب النموذج على البيانات. سيوفر النموذج المدرب جيدًا تخطيطًا دقيقًا من المدخلات إلى المخرجات المطلوبة.
في TensorFlow.js ، هناك طريقتان لإنشاء نموذج التعلم الآلي:
- باستخدام Layers API حيث تقوم ببناء نموذج باستخدام الطبقات .
- باستخدام Core API مع العمليات ذات المستوى المنخفض مثل
tf.matMul()
،tf.add()
، إلخ.
أولاً ، سننظر في Layers API ، وهي واجهة برمجة تطبيقات ذات مستوى أعلى لبناء النماذج. بعد ذلك ، سوف نوضح كيفية بناء نفس النموذج باستخدام Core API.
إنشاء نماذج باستخدام Layers API
هناك طريقتان لإنشاء نموذج باستخدام Layers API: نموذج تسلسلي ونموذج وظيفي . ينظر القسمان التاليان إلى كل نوع عن كثب.
النموذج المتسلسل
أكثر أنواع النماذج شيوعًا هو النموذج Sequential
، وهو عبارة عن كومة خطية من الطبقات. يمكنك إنشاء نموذج Sequential
عن طريق تمرير قائمة الطبقات إلى الوظيفة sequential()
:
const model = tf.sequential({
layers: [
tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
tf.layers.dense({units: 10, activation: 'softmax'}),
]
});
أو عن طريق طريقة add()
:
const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
هام: تحتاج الطبقة الأولى في النموذج إلى شكل
inputShape
. تأكد من استبعاد حجم الدُفعة عند تقديم شكلinputShape
. على سبيل المثال ، إذا كنت تخطط لتغذية موتر النموذج بالشكل[B, 784]
، حيث يمكن أن يكونB
أي حجم دفعة ، حددinputShape
كـ[784]
عند إنشاء النموذج.
يمكنك الوصول إلى طبقات النموذج عبر model.layers
، وبشكل أكثر تحديدًا model.inputLayers
و model.outputLayers
.
النموذج الوظيفي
هناك طريقة أخرى لإنشاء LayersModel
وهي عبر الدالة tf.model()
. الفرق الرئيسي بين tf.model()
و tf.sequential()
هو أن tf.model()
يسمح لك بإنشاء رسم بياني عشوائي للطبقات ، طالما أنها لا تحتوي على دورات.
فيما يلي مقتطف الشفرة الذي يحدد نفس النموذج كما هو مذكور أعلاه باستخدام tf.model()
API:
// Create an arbitrary graph of layers, by connecting them
// via the apply() method.
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model = tf.model({inputs: input, outputs: dense2});
نسمي apply()
على كل طبقة لربطها بإخراج طبقة أخرى. نتيجة apply()
في هذه الحالة هي SymbolicTensor
، والتي تعمل مثل Tensor
ولكن بدون أي قيم محددة.
لاحظ أنه بخلاف النموذج التسلسلي ، نقوم بإنشاء SymbolicTensor
عبر tf.input()
بدلاً من توفير شكل inputShape
للطبقة الأولى.
يمكن أن يمنحك apply()
أيضًا Tensor
ملموسًا ، إذا قمت بتمرير Tensor
خرساني إليه:
const t = tf.tensor([-2, 1, 0, 5]);
const o = tf.layers.activation({activation: 'relu'}).apply(t);
o.print(); // [0, 1, 0, 5]
يمكن أن يكون هذا مفيدًا عند اختبار الطبقات بمعزل عن بعضها ورؤية مخرجاتها.
تمامًا كما هو الحال في النموذج المتسلسل ، يمكنك الوصول إلى طبقات النموذج عبر model.layers
، وبشكل أكثر تحديدًا model.inputLayers
و model.outputLayers
.
تصديق
يعتبر كل من النموذج التسلسلي والنموذج الوظيفي مثيلات لفئة LayersModel
. إحدى الفوائد الرئيسية للعمل مع LayersModel
هو التحقق من الصحة: فهو يفرض عليك تحديد شكل الإدخال وسيستخدمه لاحقًا للتحقق من صحة الإدخال. يقوم LayersModel
أيضًا بالاستدلال التلقائي للشكل أثناء تدفق البيانات عبر الطبقات. تسمح معرفة الشكل مسبقًا للنموذج بإنشاء معلماته تلقائيًا ، ويمكن أن يخبرك ما إذا كانت طبقتان متتاليتان غير متوافقين مع بعضهما البعض.
ملخص نموذج
model.summary()
لطباعة ملخص مفيد للنموذج ، والذي يتضمن:
- اسم ونوع كل الطبقات في النموذج.
- شكل الإخراج لكل طبقة.
- عدد معاملات الوزن لكل طبقة.
- إذا كان النموذج يحتوي على طوبولوجيا عامة (تمت مناقشتها أدناه) ، فإن المدخلات التي تتلقاها كل طبقة
- العدد الإجمالي لمعلمات النموذج القابلة للتدريب وغير القابلة للتدريب.
بالنسبة للنموذج الذي حددناه أعلاه ، نحصل على الإخراج التالي على وحدة التحكم:
طبقة (نوع) | شكل الإخراج | بارام # |
كثيف 1 (كثيف) | [خالية ، 32] | 25120 |
كثيف 2 (كثيف) | [خالية ، 10] | 330 |
إجمالي المعلمات: 25450 المعلمات القابلة للتدريب: 25450 المعلمات غير القابلة للتدريب: 0 |
لاحظ القيم null
في أشكال الإخراج للطبقات: تذكير بأن النموذج يتوقع أن يكون للإدخال حجم دُفعة كأبعاد خارجية ، والتي يمكن أن تكون مرنة في هذه الحالة بسبب القيمة null
.
التسلسل
تتمثل إحدى الفوائد الرئيسية لاستخدام LayersModel
على واجهة برمجة التطبيقات ذات المستوى الأدنى في القدرة على حفظ النموذج وتحميله. يعرف LayersModel
عن:
- بنية النموذج ، مما يسمح لك بإعادة إنشاء النموذج.
- أوزان النموذج
- تكوين التدريب (الخسارة ، المحسن ، المقاييس).
- حالة المحسن ، مما يسمح لك باستئناف التدريب.
لحفظ أو تحميل نموذج ما هو إلا سطر واحد من التعليمات البرمجية:
const saveResult = await model.save('localstorage://my-model-1');
const model = await tf.loadLayersModel('localstorage://my-model-1');
المثال أعلاه يحفظ النموذج في التخزين المحلي في المتصفح. راجع model.save() documentation
ودليل الحفظ والتحميل للتعرف على كيفية الحفظ إلى وسائط مختلفة (مثل تخزين الملفات ، و IndexedDB
، وتشغيل تنزيل المتصفح ، وما إلى ذلك)
طبقات مخصصة
الطبقات هي اللبنات الأساسية للنموذج. إذا كان نموذجك يقوم بعملية حسابية مخصصة ، فيمكنك تحديد طبقة مخصصة تتفاعل جيدًا مع بقية الطبقات. نحدد أدناه طبقة مخصصة تحسب مجموع المربعات:
class SquaredSumLayer extends tf.layers.Layer {
constructor() {
super({});
}
// In this case, the output is a scalar.
computeOutputShape(inputShape) { return []; }
// call() is where we do the computation.
call(input, kwargs) { return input.square().sum();}
// Every layer needs a unique name.
getClassName() { return 'SquaredSum'; }
}
لاختباره ، يمكننا استدعاء طريقة apply()
بموتر ملموس:
const t = tf.tensor([-2, 1, 0, 5]);
const o = new SquaredSumLayer().apply(t);
o.print(); // prints 30
هام: إذا أضفت طبقة مخصصة ، فستفقد القدرة على إجراء تسلسل للنموذج.
إنشاء نماذج باستخدام Core API
في بداية هذا الدليل ، ذكرنا أن هناك طريقتين لإنشاء نموذج التعلم الآلي في TensorFlow.js.
تتمثل القاعدة العامة في محاولة استخدام Layers API أولاً ، حيث تم تصميمها على غرار Keras API المعتمد جيدًا والذي يتبع أفضل الممارسات ويقلل من الحمل المعرفي . تقدم Layers API أيضًا العديد من الحلول الجاهزة مثل تهيئة الوزن ، وتسلسل النموذج ، والتدريب على المراقبة ، وقابلية النقل ، وفحص السلامة.
قد ترغب في استخدام Core API عندما:
- أنت بحاجة إلى أقصى قدر من المرونة أو التحكم.
- لا تحتاج إلى التسلسل ، أو يمكنك تنفيذ منطق التسلسل الخاص بك.
النماذج في Core API هي مجرد وظائف تأخذ واحدًا أو أكثر من Tensors
Tensor
. يبدو نفس النموذج الموضح أعلاه باستخدام Core API كما يلي:
// The weights and biases for the two dense layers.
const w1 = tf.variable(tf.randomNormal([784, 32]));
const b1 = tf.variable(tf.randomNormal([32]));
const w2 = tf.variable(tf.randomNormal([32, 10]));
const b2 = tf.variable(tf.randomNormal([10]));
function model(x) {
return x.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();
}
لاحظ أنه في Core API ، نحن مسؤولون عن إنشاء أوزان النموذج وتهيئتها. يتم دعم كل وزن بواسطة Variable
يشير إلى TensorFlow.js أن هذه الموترات قابلة للتعلم. يمكنك إنشاء Variable
باستخدام tf.variable () وتمرير Tensor
موجود.
في هذا الدليل ، تعرفت على الطرق المختلفة لإنشاء نموذج باستخدام Layers و Core API. بعد ذلك ، راجع دليل نماذج التدريب لمعرفة كيفية تدريب النموذج.