প্রশিক্ষণ মডেল

এই নির্দেশিকা অনুমান করে আপনি ইতিমধ্যে মডেল এবং স্তর নির্দেশিকা পড়েছেন।

TensorFlow.js-এ একটি মেশিন লার্নিং মডেলকে প্রশিক্ষণ দেওয়ার দুটি উপায় রয়েছে:

  1. LayersModel.fit() বা LayersModel.fitDataset() এর সাথে Layers API ব্যবহার করে।
  2. Optimizer.minimize() এর সাথে Core API ব্যবহার করে।

প্রথমে, আমরা লেয়ার এপিআই দেখব, যা মডেল তৈরি এবং প্রশিক্ষণের জন্য একটি উচ্চ-স্তরের API। তারপর, আমরা দেখাব কিভাবে কোর এপিআই ব্যবহার করে একই মডেলকে প্রশিক্ষণ দিতে হয়।

ভূমিকা

একটি মেশিন লার্নিং মডেল শেখারযোগ্য প্যারামিটার সহ একটি ফাংশন যা একটি পছন্দসই আউটপুটে একটি ইনপুট ম্যাপ করে। সর্বোত্তম পরামিতিগুলি ডেটাতে মডেলকে প্রশিক্ষণ দিয়ে প্রাপ্ত করা হয়।

প্রশিক্ষণে বেশ কয়েকটি ধাপ জড়িত:

  • মডেলে ডেটার একটি ব্যাচ পাওয়া যাচ্ছে।
  • একটি ভবিষ্যদ্বাণী করতে মডেল জিজ্ঞাসা.
  • "সত্য" মানের সাথে সেই ভবিষ্যদ্বাণীটির তুলনা করা।
  • প্রতিটি প্যারামিটার কতটা পরিবর্তন করতে হবে তা নির্ধারণ করা যাতে মডেলটি সেই ব্যাচের জন্য ভবিষ্যতে আরও ভাল ভবিষ্যদ্বাণী করতে পারে।

একটি ভাল-প্রশিক্ষিত মডেল ইনপুট থেকে পছন্দসই আউটপুটে একটি সঠিক ম্যাপিং প্রদান করবে।

মডেল পরামিতি

লেয়ার API ব্যবহার করে একটি সাধারণ 2-স্তর মডেল সংজ্ঞায়িত করা যাক:

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() একটি দরকারী পদ্ধতি যদি আপনি আপনার মডেলের একটি ওভারভিউ পেতে চান এবং প্যারামিটারের মোট সংখ্যা দেখতে চান:

স্তর (প্রকার) আউটপুট আকৃতি পরম #
ঘন_ঘন১ (ঘন) [শূন্য, 32] 25120
ঘন_ঘন২ (ঘন) [শূন্য, 10] 330
মোট প্যারাম: 25450
প্রশিক্ষণযোগ্য প্যারামস: 25450
অ-প্রশিক্ষণযোগ্য প্যারামস: 0

মডেলের প্রতিটি ওজন একটি Variable বস্তু দ্বারা ব্যাকএন্ড। TensorFlow.js-এ, একটি Variable হল একটি ফ্লোটিং-পয়েন্ট Tensor যার মান আপডেট করার জন্য একটি অতিরিক্ত পদ্ধতি assign() ব্যবহার করা হয়। স্তর API সর্বোত্তম অনুশীলন ব্যবহার করে স্বয়ংক্রিয়ভাবে ওজন শুরু করে। প্রদর্শনের সুবিধার জন্য, আমরা অন্তর্নিহিত ভেরিয়েবলগুলিতে assign() কল করে ওজনগুলি ওভাররাইট করতে পারি:

model.weights.forEach(w => {
  const newVals = tf.randomNormal(w.shape);
  // w.val is an instance of tf.Variable
  w.val.assign(newVals);
});

অপ্টিমাইজার, ক্ষতি এবং মেট্রিক

আপনি কোন প্রশিক্ষণ করার আগে, আপনাকে তিনটি বিষয়ে সিদ্ধান্ত নিতে হবে:

  1. একটি অপ্টিমাইজার । অপ্টিমাইজারের কাজ হল বর্তমান মডেলের ভবিষ্যদ্বাণী অনুসারে মডেলের প্রতিটি প্যারামিটার কতটা পরিবর্তন করতে হবে তা নির্ধারণ করা। লেয়ার এপিআই ব্যবহার করার সময়, আপনি একটি বিদ্যমান অপ্টিমাইজারের একটি স্ট্রিং শনাক্তকারী প্রদান করতে পারেন (যেমন 'sgd' বা 'adam' ), অথবা Optimizer ক্লাসের একটি উদাহরণ।
  2. একটি ক্ষতি ফাংশন . একটি উদ্দেশ্য যা মডেলটি ছোট করার চেষ্টা করবে। এর লক্ষ্য হল মডেলের ভবিষ্যদ্বাণী "কত ভুল" এর জন্য একটি একক সংখ্যা দেওয়া। ডেটার প্রতিটি ব্যাচে ক্ষতি গণনা করা হয় যাতে মডেলটি তার ওজন আপডেট করতে পারে। লেয়ার এপিআই ব্যবহার করার সময়, আপনি একটি বিদ্যমান লস ফাংশন (যেমন 'categoricalCrossentropy' ) এর একটি স্ট্রিং শনাক্তকারী প্রদান করতে পারেন, অথবা এমন কোনো ফাংশন যা একটি পূর্বাভাসিত এবং একটি সত্য মান নেয় এবং ক্ষতি ফেরত দেয়। আমাদের API ডক্সে উপলব্ধ ক্ষতির একটি তালিকা দেখুন।
  3. মেট্রিক্সের তালিকা। ক্ষতির অনুরূপ, মেট্রিক্স একটি একক সংখ্যা গণনা করে, আমাদের মডেল কতটা ভাল কাজ করছে তা সংক্ষিপ্ত করে। মেট্রিক্স সাধারণত প্রতিটি যুগের শেষে সমগ্র ডেটাতে গণনা করা হয়। অন্তত, আমরা নিরীক্ষণ করতে চাই যে সময়ের সাথে আমাদের ক্ষতি কমছে। যাইহোক, আমরা প্রায়ই আরো মানব-বান্ধব মেট্রিক যেমন নির্ভুলতা চাই। লেয়ার এপিআই ব্যবহার করার সময়, আপনি একটি বিদ্যমান মেট্রিকের একটি স্ট্রিং শনাক্তকারী প্রদান করতে পারেন (যেমন 'accuracy' ), অথবা কোনো ফাংশন যা একটি পূর্বাভাসিত এবং একটি সত্য মান নেয় এবং একটি স্কোর প্রদান করে। আমাদের API ডক্সে উপলব্ধ মেট্রিক্সের একটি তালিকা দেখুন।

আপনি যখন সিদ্ধান্ত নিয়েছেন, প্রদত্ত বিকল্পগুলির সাথে model.compile() কল করে একটি LayersModel কম্পাইল করুন:

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 সম্পর্কে আরও তথ্যের জন্য, মডেল এবং স্তর নির্দেশিকাতে "কোর API" বিভাগটি পড়ুন।

কোর 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);
}

লেয়ার এপিআই ছাড়াও, ডেটা এপিআই কোর এপিআই-এর সাথে নির্বিঘ্নে কাজ করে। আসুন আমরা মডেল.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);
}

কোর API এর সাথে একটি মডেলকে প্রশিক্ষণ দেওয়ার সময় উপরের কোডটি আদর্শ রেসিপি:

  • epochs সংখ্যা উপর লুপ.
  • প্রতিটি যুগের ভিতরে, আপনার ব্যাচের ডেটা লুপ করুন। একটি Dataset ব্যবহার করার সময়, dataset.forEachAsync() হল আপনার ব্যাচগুলি লুপ করার একটি সুবিধাজনক উপায়৷
  • প্রতিটি ব্যাচের জন্য, কল করুন optimizer.minimize(f) , যা f চালায় এবং চারটি ভেরিয়েবলের সাপেক্ষে গ্রেডিয়েন্ট কম্পিউট করে এর আউটপুট কম করে যা আমরা আগে সংজ্ঞায়িত করেছি।
  • f ক্ষতি গণনা করে। এটি মডেলের পূর্বাভাস এবং সত্য মান ব্যবহার করে পূর্বনির্ধারিত ক্ষতির ফাংশনগুলির একটিকে কল করে।