در یادگیری ماشینی، مدل تابعی با پارامترهای قابل یادگیری است که یک ورودی را به یک خروجی نگاشت می کند. پارامترهای بهینه با آموزش مدل بر روی داده ها به دست می آیند. یک مدل به خوبی آموزش دیده یک نقشه برداری دقیق از ورودی به خروجی مورد نظر ارائه می دهد.
در TensorFlow.js دو راه برای ایجاد یک مدل یادگیری ماشین وجود دارد:
- با استفاده از Layers API که در آن یک مدل با استفاده از لایه ها می سازید.
- استفاده از 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 آشنا شده اید. در ادامه، راهنمای مدل های آموزشی برای نحوه آموزش یک مدل را ببینید.