این راهنما فرض شما در حال حاضر به عنوان خوانده شده مدل ها و لایه های راهنمای.
در TensorFlow.js دو راه برای آموزش مدل یادگیری ماشین وجود دارد:
- با استفاده از API لایه با
LayersModel.fit()
و یاLayersModel.fitDataset()
. - با استفاده از API هسته ای با
Optimizer.minimize()
.
ابتدا لایههای API را بررسی میکنیم که یک API سطح بالاتر برای ساخت و آموزش مدلها است. سپس، نحوه آموزش همان مدل را با استفاده از Core API نشان خواهیم داد.
معرفی
مدل های یادگیری ماشین یک تابع با پارامترهای یادگرفتنی است که به یک خروجی مورد نظر نقشه یک ورودی است. پارامترهای بهینه با آموزش مدل بر روی داده ها به دست می آیند.
آموزش شامل چندین مرحله است:
- گرفتن یک دسته ای از داده ها به مدل.
- درخواست از مدل برای پیش بینی.
- مقایسه آن پیش بینی با مقدار "واقعی".
- تصمیم گیری در مورد میزان تغییر هر پارامتر تا مدل بتواند پیش بینی بهتری در آینده برای آن دسته داشته باشد.
یک مدل به خوبی آموزش دیده یک نقشه برداری دقیق از ورودی به خروجی مورد نظر ارائه می دهد.
پارامترهای مدل
بیایید یک مدل 2 لایه ساده با استفاده از Layers API تعریف کنیم:
const model = tf.sequential({
layers: [
tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
tf.layers.dense({units: 10, activation: 'softmax'}),
]
});
در زیر هود، مدل ها دارای پارامترهای (اغلب به عنوان وزن نامیده می شود) که با آموزش بر روی داده های یادگرفتنی هستند. بیایید نام وزنه های مرتبط با این مدل و شکل آنها را چاپ کنیم:
model.weights.forEach(w => {
console.log(w.name, w.shape);
});
خروجی زیر را دریافت می کنیم:
> dense_Dense1/kernel [784, 32]
> dense_Dense1/bias [32]
> dense_Dense2/kernel [32, 10]
> dense_Dense2/bias [10]
در مجموع 4 وزنه، 2 وزن در هر لایه متراکم وجود دارد. این انتظار می رود از لایه های متراکم نشان دهنده یک تابع است که نقشه های ورودی تانسور x
به یک خروجی تانسور y
از طریق معادله y = Ax + b
که در آن (هسته) و A
b
(تعصب) پارامترهای لایه متراکم هستند.
توجه: به طور پیش فرض لایه متراکم عبارتند از تعصب، اما شما می توانید آن را با مشخص رد
{useBias: false}
در گزینه در هنگام ایجاد یک لایه متراکم.
model.summary()
یک روش مفید است اگر شما می خواهید برای دریافت یک مرور کلی از مدل خود را و تعداد پارامترها را مشاهده کنید:
لایه (نوع) | شکل خروجی | پارامتر # |
dense_Dense1 (متراکم) | [null,32] | 25120 |
dense_Dense2 (متراکم) | [null,10] | 330 |
مجموع پارامترها: 25450 پارامترهای قابل آموزش: 25450 پارامترهای غیر قابل آموزش: 0 |
هر وزن در مدل با باطن Variable
شی. در TensorFlow.js، یک Variable
یک شناور نقطه است Tensor
با یکی از روش اضافی assign()
مورد استفاده برای به روز رسانی ارزش آن است. Layers API به طور خودکار وزن ها را با استفاده از بهترین شیوه ها مقداردهی اولیه می کند. به خاطر تظاهرات، ما می تواند وزن با تماس با بازنویسی assign()
بر روی متغیرهای اساسی:
model.weights.forEach(w => {
const newVals = tf.randomNormal(w.shape);
// w.val is an instance of tf.Variable
w.val.assign(newVals);
});
بهینه ساز، ضرر و متریک
قبل از انجام هر آموزشی، باید در مورد سه چیز تصمیم بگیرید:
- بهینه ساز. وظیفه بهینه ساز این است که با توجه به پیش بینی مدل فعلی، تصمیم بگیرد که هر پارامتر در مدل چقدر تغییر کند. هنگامی که با استفاده از API لایه ها، شما هم می توانید یک شناسه رشته ای از بهینه ساز های موجود (مانند ارائه
'sgd'
یا'adam'
)، و یا یک نمونه ازOptimizer
کلاس. - یک تابع از دست دادن. هدفی که مدل سعی خواهد کرد آن را به حداقل برساند. هدف آن ارائه یک عدد واحد برای «چقدر اشتباه» پیشبینی مدل است. از دست دادن در هر دسته از داده ها محاسبه می شود تا مدل بتواند وزن خود را به روز کند. هنگامی که با استفاده از API لایه ها، شما هم می توانید یک شناسه رشته از یک تابع از دست دادن موجود (مانند ارائه
'categoricalCrossentropy'
)، و یا هر تابع است که طول می کشد یک و یک ارزش واقعی پیش بینی شده و بازده از دست دادن. الف مراجعه لیستی از ضرر و زیان های موجود در اسناد API ما. - فهرست معیارها مشابه با ضرر، معیارها یک عدد واحد را محاسبه میکنند و به طور خلاصه نشان میدهند که مدل ما چقدر خوب عمل میکند. معیارها معمولاً بر روی کل داده ها در پایان هر دوره محاسبه می شوند. حداقل، ما می خواهیم نظارت کنیم که ضرر ما در طول زمان کاهش می یابد. با این حال، ما اغلب معیارهای انسان پسندتری مانند دقت می خواهیم. هنگامی که با استفاده از API لایه ها، شما هم می توانید یک شناسه رشته از ارائه موجود متریک (مانند
'accuracy'
)، و یا هر تابع است که طول می کشد یک و یک ارزش واقعی پیش بینی شده و بازده نمره. الف مراجعه لیستی از معیارهای موجود در اسناد API ما.
هنگامی که شما تصمیم گرفته اید، تدوین LayersModel
با تماس model.compile()
با گزینه های ارائه شده:
model.compile({
optimizer: 'sgd',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
در طول کامپایل، مدل اعتبار سنجی انجام می دهد تا مطمئن شود که گزینه هایی که انتخاب کرده اید با یکدیگر سازگار هستند.
آموزش
دو راه برای تمرین دادن به یک وجود دارد LayersModel
:
- با استفاده از
model.fit()
و ارائه اطلاعات به عنوان یکی تانسور بزرگ است. - با استفاده از
model.fitDataset()
و ارائه اطلاعات از طریق یکDataset
شی.
model.fit()
اگر متناسب مجموعه داده های خود را در حافظه اصلی، و در دسترس به عنوان یک تانسور واحد است، شما می توانید یک مدل با تماس با آموزش fit()
روش:
// Generate dummy data.
const data = tf.randomNormal([100, 784]);
const labels = tf.randomUniform([100, 10]);
function onBatchEnd(batch, logs) {
console.log('Accuracy', logs.acc);
}
// Train for 5 epochs with batch size of 32.
model.fit(data, labels, {
epochs: 5,
batchSize: 32,
callbacks: {onBatchEnd}
}).then(info => {
console.log('Final accuracy', info.history.acc);
});
در زیر هود، model.fit()
می توانید تعداد زیادی برای ما انجام دهید:
- داده ها را به یک مجموعه قطار و اعتبار سنجی تقسیم می کند و از مجموعه اعتبار سنجی برای اندازه گیری پیشرفت در طول آموزش استفاده می کند.
- داده ها را با هم مخلوط می کند اما فقط پس از تقسیم. برای اطمینان، شما باید قبل از زدن داده ها قبل از انتقال آن به
fit()
. - انشعابات تانسور داده های بزرگ به تانسورها کوچکتر از اندازه
batchSize.
- تماس
optimizer.minimize()
در حالی که محاسبات از دست دادن مدل با توجه به دسته ای از داده ها. - این می تواند شما را در شروع و پایان هر دوره یا دسته ای مطلع کند. در مورد ما، ما به در پایان از هر دسته ای با استفاده از اطلاع
callbacks.onBatchEnd
گزینه است. گزینه های دیگر عبارتند از:onTrainBegin
،onTrainEnd
،onEpochBegin
،onEpochEnd
وonBatchBegin
. - به رشته اصلی تسلیم می شود تا اطمینان حاصل شود که کارهایی که در صف قرار گرفته در حلقه رویداد JS می توانند به موقع انجام شوند.
برای اطلاعات بیشتر، نگاه کنید به اسناد و مدارک از fit()
. توجه داشته باشید که اگر انتخاب کنید از Core API استفاده کنید، باید خودتان این منطق را پیاده سازی کنید.
model.fitDataset()
اگر اطلاعات خود را در حافظه مناسب نیست به طور کامل، و یا در حال پخش، شما می توانید یک مدل با تماس آموزش fitDataset()
، که طول می کشد یک Dataset
شی. در اینجا همان کد آموزشی است اما با مجموعه داده ای که یک تابع مولد را می پوشاند:
function* data() {
for (let i = 0; i < 100; i++) {
// Generate one sample at a time.
yield tf.randomNormal([784]);
}
}
function* labels() {
for (let i = 0; i < 100; i++) {
// Generate one sample at a time.
yield tf.randomUniform([10]);
}
}
const xs = tf.data.generator(data);
const ys = tf.data.generator(labels);
// We zip the data and labels together, shuffle and batch 32 samples at a time.
const ds = tf.data.zip({xs, ys}).shuffle(100 /* bufferSize */).batch(32);
// Train the model for 5 epochs.
model.fitDataset(ds, {epochs: 5}).then(info => {
console.log('Accuracy', info.history.acc);
});
برای اطلاعات بیشتر در مورد مجموعه داده، نگاه کنید به اسناد و مدارک از model.fitDataset()
.
پیش بینی داده های جدید
هنگامی که مدل آموزش داده شده است، شما می توانید پاسخ model.predict()
به پیش بینی بر روی داده های نهان:
// Predict 3 random samples.
const prediction = model.predict(tf.randomNormal([3, 784]));
prediction.print();
هسته API
قبلاً اشاره کردیم که دو روش برای آموزش مدل یادگیری ماشین در TensorFlow.js وجود دارد.
قانون کلی این است که سعی کنید ابتدا از لایه های API استفاده کنید، زیرا از API به خوبی پذیرفته شده Keras مدل شده است. Layers API همچنین راهحلهای مختلفی مانند مقدار دهی اولیه وزن، سریالسازی مدل، آموزش نظارت، قابلیت حمل و بررسی ایمنی را ارائه میدهد.
ممکن است بخواهید از Core API هر زمان که:
- شما به حداکثر انعطاف یا کنترل نیاز دارید.
- و شما نیازی به سریال سازی ندارید یا می توانید منطق سریال سازی خود را پیاده سازی کنید.
برای کسب اطلاعات بیشتر در مورد این API، بخش "پایه API" در مدل ها و لایه های راهنمای.
همان مدلی که در بالا با استفاده از 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);
}
علاوه بر Layers API، Data API نیز به طور یکپارچه با Core API کار می کند. بیایید استفاده مجدد از مجموعه داده است که ما در قبلا تعریف model.fitDataset () بخش، که برروی آن بکشید و دوز برای ما:
const xs = tf.data.generator(data);
const ys = tf.data.generator(labels);
// Zip the data and labels together, shuffle and batch 32 samples at a time.
const ds = tf.data.zip({xs, ys}).shuffle(100 /* bufferSize */).batch(32);
بیایید مدل را آموزش دهیم:
const optimizer = tf.train.sgd(0.1 /* learningRate */);
// Train for 5 epochs.
for (let epoch = 0; epoch < 5; epoch++) {
await ds.forEachAsync(({xs, ys}) => {
optimizer.minimize(() => {
const predYs = model(xs);
const loss = tf.losses.softmaxCrossEntropy(ys, predYs);
loss.data().then(l => console.log('Loss', l));
return loss;
});
});
console.log('Epoch', epoch);
}
کد بالا دستور استاندارد هنگام آموزش یک مدل با Core API است:
- روی تعداد دوره ها حلقه بزنید.
- در داخل هر دوره، روی دسته های داده خود حلقه بزنید. هنگام استفاده از یک
Dataset
،dataset.forEachAsync()
یک راه مناسب برای حلقه بیش از دسته خود است. - برای هر دسته ای، پاسخ
optimizer.minimize(f)
، که اجراf
و خروجی آن توسط شیب محاسبه با توجه به چهار متغیر ما قبلا تعریف شده به حداقل می رساند. -
f
محاسبه از دست دادن. یکی از توابع ضرر از پیش تعریف شده را با استفاده از پیش بینی مدل و مقدار واقعی فراخوانی می کند.