مدل ها و لایه ها

در یادگیری ماشینی، مدل تابعی با پارامترهای قابل یادگیری است که یک ورودی را به یک خروجی نگاشت می کند. پارامترهای بهینه با آموزش مدل بر روی داده ها به دست می آیند. یک مدل به خوبی آموزش دیده یک نقشه برداری دقیق از ورودی به خروجی مورد نظر ارائه می دهد.

در TensorFlow.js دو راه برای ایجاد یک مدل یادگیری ماشین وجود دارد:

  1. با استفاده از Layers API که در آن یک مدل با استفاده از لایه ها می سازید.
  2. استفاده از Core API با عملیات های سطح پایین تر مانند tf.matMul() ، tf.add() و غیره.

ابتدا لایه‌های API را بررسی می‌کنیم که یک API سطح بالاتر برای ساخت مدل‌ها است. سپس، نحوه ساخت همان مدل را با استفاده از Core API نشان خواهیم داد.

ایجاد مدل ها با لایه های 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 اما بدون هیچ مقدار مشخصی عمل می کند.

توجه داشته باشید که برخلاف مدل ترتیبی، به جای ارائه یک inputShape به لایه اول، از طریق tf.input() یک SymbolicTensor ایجاد می کنیم.

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() فراخوانی کنید:

  • نام و نوع تمام لایه های مدل.
  • شکل خروجی برای هر لایه
  • تعداد پارامترهای وزن هر لایه.
  • اگر مدل دارای توپولوژی کلی باشد (در زیر به آن پرداخته می شود)، ورودی هایی که هر لایه دریافت می کند
  • تعداد کل پارامترهای آموزش پذیر و غیر قابل آموزش مدل.

برای مدلی که در بالا تعریف کردیم، خروجی زیر را روی کنسول دریافت می کنیم:

لایه (نوع) شکل خروجی پارامتر #
dense_Dense1 (متراکم) [null,32] 25120
dense_Dense2 (متراکم) [null,10] 330
مجموع پارامترها: 25450
پارامترهای قابل آموزش: 25450
پارامترهای غیر قابل آموزش: 0

به مقادیر null در اشکال خروجی لایه ها توجه کنید: یادآوری این که مدل انتظار دارد ورودی دارای اندازه دسته ای به عنوان بیرونی ترین بعد باشد، که در این مورد به دلیل مقدار null می تواند انعطاف پذیر باشد.

سریال سازی

یکی از مزایای اصلی استفاده از LayersModel نسبت به API سطح پایین، توانایی ذخیره و بارگذاری یک مدل است. LayersModel در مورد:

  • معماری مدل، به شما امکان می دهد مدل را دوباره ایجاد کنید.
  • وزن های مدل
  • پیکربندی آموزش (از دست دادن، بهینه ساز، معیارها).
  • وضعیت بهینه ساز، به شما امکان می دهد آموزش را از سر بگیرید.

برای ذخیره یا بارگذاری یک مدل فقط 1 خط کد وجود دارد:

const saveResult = await model.save('localstorage://my-model-1');
const model = await tf.loadLayersModel('localstorage://my-model-1');

مثال بالا مدل را در حافظه محلی در مرورگر ذخیره می کند. برای نحوه ذخیره سازی در رسانه های مختلف (مانند ذخیره سازی فایل، IndexedDB ، راه اندازی دانلود مرورگر، و غیره) به model.save() documentation و راهنمای ذخیره و بارگذاری مراجعه کنید.

لایه های سفارشی

لایه ها بلوک های سازنده یک مدل هستند. اگر مدل شما در حال انجام یک محاسبات سفارشی است، می توانید یک لایه سفارشی تعریف کنید که به خوبی با بقیه لایه ها تعامل دارد. در زیر یک لایه سفارشی تعریف می کنیم که مجموع مربع ها را محاسبه می کند:

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 وجود دارد.

قاعده کلی این است که همیشه سعی کنید ابتدا از لایه های API استفاده کنید، زیرا از API به خوبی پذیرفته شده Keras مدل شده است که از بهترین شیوه ها پیروی می کند و بار شناختی را کاهش می دهد . 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 موجود ایجاد کنید.

در این راهنما شما با روش های مختلف ایجاد یک مدل با استفاده از لایه ها و Core API آشنا شده اید. در ادامه، راهنمای مدل های آموزشی برای نحوه آموزش یک مدل را ببینید.