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

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

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

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

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

ایجاد مدل ها با لایه های API

دو راه برای ایجاد یک مدل با استفاده از 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() به چاپ خلاصه ای از این مدل، که شامل:

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

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

لایه (نوع) شکل خروجی پارامتر #
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');

مثال بالا مدل را در حافظه محلی در مرورگر ذخیره می کند. را ببینید 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 وجود دارد.

قانون کلی این است که همیشه سعی کنید به استفاده از API لایه اول، از آن است که پس از API Keras خوبی به تصویب رسید که به شرح زیر مدل بهترین شیوه ها و کاهش بار شناختی . Layers API همچنین راه‌حل‌های مختلفی مانند مقدار دهی اولیه وزن، سریال‌سازی مدل، آموزش نظارت، قابلیت حمل و بررسی ایمنی را ارائه می‌دهد.

ممکن است بخواهید از Core API هر زمان که:

  • شما به حداکثر انعطاف یا کنترل نیاز دارید.
  • شما نیازی به سریال سازی ندارید یا می توانید منطق سریال سازی خود را پیاده سازی کنید.

مدل در پایه 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 آشنا شده اید. در مرحله بعد، دیدن مدل های آموزش راهنمایی در مورد چگونگی آموزش یک مدل.