النماذج والطبقات

في التعلم الآلي ، النموذج هو وظيفة ذات معلمات قابلة للتعلم تقوم بتعيين مدخلات إلى مخرجات. يتم الحصول على المعلمات المثلى من خلال تدريب النموذج على البيانات. سيوفر النموذج المدرب جيدًا تخطيطًا دقيقًا من المدخلات إلى المخرجات المطلوبة.

في TensorFlow.js ، هناك طريقتان لإنشاء نموذج التعلم الآلي:

  1. باستخدام Layers API حيث تقوم ببناء نموذج باستخدام الطبقات .
  2. باستخدام 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. بعد ذلك ، راجع دليل نماذج التدريب لمعرفة كيفية تدريب النموذج.