TensorFlow.js — 2D ডেটা থেকে ভবিষ্যদ্বাণী করা

১. ভূমিকা

এই কোডল্যাবে আপনি এক সেট গাড়ির বর্ণনাকারী সাংখ্যিক ডেটা থেকে পূর্বাভাস দেওয়ার জন্য একটি মডেলকে প্রশিক্ষণ দেবেন।

এই অনুশীলনীতে বিভিন্ন ধরণের মডেল প্রশিক্ষণের সাধারণ ধাপগুলো দেখানো হবে, তবে এক্ষেত্রে একটি ছোট ডেটাসেট এবং একটি সরল (শেলো) মডেল ব্যবহার করা হবে। এর মূল উদ্দেশ্য হলো TensorFlow.js ব্যবহার করে মডেল প্রশিক্ষণের মৌলিক পরিভাষা, ধারণা এবং সিনট্যাক্সের সাথে আপনাকে পরিচিত হতে সাহায্য করা এবং আরও অনুসন্ধান ও শেখার জন্য একটি ভিত্তি তৈরি করে দেওয়া।

যেহেতু আমরা একটি মডেলকে অবিচ্ছিন্ন সংখ্যা ভবিষ্যদ্বাণী করার জন্য প্রশিক্ষণ দিচ্ছি, তাই এই কাজটিকে কখনও কখনও রিগ্রেশন টাস্ক বলা হয়। আমরা মডেলটিকে সঠিক আউটপুটের সাথে বিভিন্ন ইনপুটের অনেক উদাহরণ দেখিয়ে প্রশিক্ষণ দেব। একে সুপারভাইজড লার্নিং বলা হয়।

আপনি যা তৈরি করবেন

আপনি এমন একটি ওয়েবপেজ তৈরি করবেন যা ব্রাউজারে একটি মডেলকে প্রশিক্ষণ দিতে TensorFlow.js ব্যবহার করে। একটি গাড়ির "হর্সপাওয়ার" দেওয়া হলে, মডেলটি "মাইলস পার গ্যালন" (MPG) ভবিষ্যদ্বাণী করতে শিখবে।

এটি করতে আপনাকে যা করতে হবে:

  • ডেটা লোড করুন এবং প্রশিক্ষণের জন্য প্রস্তুত করুন।
  • মডেলটির স্থাপত্য কাঠামো সংজ্ঞায়িত করুন।
  • মডেলটিকে প্রশিক্ষণ দিন এবং প্রশিক্ষণ চলাকালীন এর কর্মক্ষমতা পর্যবেক্ষণ করুন।
  • কিছু পূর্বাভাস তৈরি করে প্রশিক্ষিত মডেলটি মূল্যায়ন করুন।

আপনি যা শিখবেন

  • মেশিন লার্নিংয়ের জন্য ডেটা প্রস্তুতির সর্বোত্তম পদ্ধতি, যার মধ্যে ডেটা পুনর্বিন্যাস এবং স্বাভাবিকীকরণ অন্তর্ভুক্ত।
  • tf.layers API ব্যবহার করে মডেল তৈরির জন্য TensorFlow.js সিনট্যাক্স।
  • tfjs-vis লাইব্রেরি ব্যবহার করে কীভাবে ইন-ব্রাউজার ট্রেনিং মনিটর করা যায়।

আপনার যা যা লাগবে

২. প্রস্তুত হন

একটি HTML পৃষ্ঠা তৈরি করুন এবং জাভাস্ক্রিপ্ট অন্তর্ভুক্ত করুন।

96914ff65fc3b74c.png নিম্নলিখিত কোডটি একটি html ফাইলে কপি করুন যার নাম

index.html

<!DOCTYPE html>
<html>
<head>
  <title>TensorFlow.js Tutorial</title>

  <!-- Import TensorFlow.js -->
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script>
  <!-- Import tfjs-vis -->
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js"></script>
</head>
<body>
  <!-- Import the main script file -->
  <script src="script.js"></script>
</body>
</html>

কোডের জন্য জাভাস্ক্রিপ্ট ফাইলটি তৈরি করুন

  1. উপরের HTML ফাইলটির ফোল্ডারেই script.js নামে একটি ফাইল তৈরি করুন এবং এর মধ্যে নিম্নলিখিত কোডটি রাখুন।
console.log('Hello TensorFlow');

পরীক্ষা করে দেখুন

এখন যেহেতু আপনি HTML এবং JavaScript ফাইলগুলো তৈরি করে ফেলেছেন, সেগুলো পরীক্ষা করে দেখুন। আপনার ব্রাউজারে index.html ফাইলটি খুলুন এবং devtools কনসোলটি খুলুন।

সবকিছু ঠিকঠাক থাকলে, দুটি গ্লোবাল ভেরিয়েবল তৈরি হবে এবং ডেভটুলস কনসোলে সেগুলো দেখা যাবে।

  • tf হলো TensorFlow.js লাইব্রেরির একটি রেফারেন্স।
  • tfvis হলো tfjs-vis লাইব্রেরির একটি রেফারেন্স।

আপনার ব্রাউজারের ডেভেলপার টুলস খুলুন। কনসোল আউটপুটে আপনি Hello TensorFlow লেখা একটি বার্তা দেখতে পাবেন। যদি তাই হয়, তাহলে আপনি পরবর্তী ধাপে যাওয়ার জন্য প্রস্তুত।

৩. ইনপুট ডেটা লোড, ফরম্যাট এবং ভিজ্যুয়ালাইজ করুন

প্রথম ধাপ হিসেবে, যে ডেটার ওপর ভিত্তি করে আমরা মডেলটিকে প্রশিক্ষণ দেবো, তা লোড, ফরম্যাট এবং ভিজ্যুয়ালাইজ করে নেওয়া যাক।

আমরা আপনার জন্য হোস্ট করা একটি JSON ফাইল থেকে 'cars' ডেটাসেটটি লোড করব। এতে প্রতিটি গাড়ি সম্পর্কে বিভিন্ন বৈশিষ্ট্য রয়েছে। এই টিউটোরিয়ালের জন্য, আমরা শুধুমাত্র হর্সপাওয়ার এবং মাইলস পার গ্যালন সম্পর্কিত ডেটা বের করতে চাই।

96914ff65fc3b74c.png আপনার নিম্নলিখিত কোডটি যোগ করুন

script.js ফাইল

/**
 * Get the car data reduced to just the variables we are interested
 * and cleaned of missing data.
 */
async function getData() {
  const carsDataResponse = await fetch('https://storage.googleapis.com/tfjs-tutorials/carsData.json');
  const carsData = await carsDataResponse.json();
  const cleaned = carsData.map(car => ({
    mpg: car.Miles_per_Gallon,
    horsepower: car.Horsepower,
  }))
  .filter(car => (car.mpg != null && car.horsepower != null));

  return cleaned;
}

এটি সেইসব এন্ট্রিও মুছে দেবে যেগুলিতে মাইল প্রতি গ্যালন বা হর্সপাওয়ার কোনোটিই নির্দিষ্ট করা নেই। চলুন এই ডেটা একটি স্ক্যাটারপ্লটে প্লট করে দেখি এটি কেমন দেখায়।

96914ff65fc3b74c.png আপনার ফাইলের শেষে নিম্নলিখিত কোডটি যোগ করুন।

script.js ফাইল।

async function run() {
  // Load and plot the original input data that we are going to train on.
  const data = await getData();
  const values = data.map(d => ({
    x: d.horsepower,
    y: d.mpg,
  }));

  tfvis.render.scatterplot(
    {name: 'Horsepower v MPG'},
    {values},
    {
      xLabel: 'Horsepower',
      yLabel: 'MPG',
      height: 300
    }
  );

  // More code will be added below
}

document.addEventListener('DOMContentLoaded', run);

যখন আপনি পৃষ্ঠাটি রিফ্রেশ করবেন, তখন পৃষ্ঠার বাম দিকে ডেটার একটি স্ক্যাটারপ্লটসহ একটি প্যানেল দেখতে পাবেন। এটি দেখতে অনেকটা এইরকম হবে।

cf44e823106c758e.png

এই প্যানেলটি ভাইজর নামে পরিচিত এবং এটি tfjs-vis দ্বারা সরবরাহ করা হয়। এটি ভিজ্যুয়ালাইজেশন প্রদর্শনের জন্য একটি সুবিধাজনক স্থান প্রদান করে।

সাধারণত ডেটা নিয়ে কাজ করার সময়, আপনার ডেটা পর্যালোচনা করার এবং প্রয়োজনে তা পরিমার্জন করার উপায় খুঁজে বের করা একটি ভালো অভ্যাস। এই ক্ষেত্রে, আমাদের carsData থেকে এমন কিছু এন্ট্রি বাদ দিতে হয়েছিল যেগুলিতে সমস্ত প্রয়োজনীয় ফিল্ড ছিল না। ডেটা ভিজ্যুয়ালাইজ করলে আমরা এই ধারণা পেতে পারি যে, ডেটার মধ্যে এমন কোনো কাঠামো আছে কি না যা থেকে মডেলটি শিখতে পারে।

উপরের প্লট থেকে আমরা দেখতে পাচ্ছি যে, হর্সপাওয়ার এবং এমপিজি-র মধ্যে একটি নেতিবাচক সম্পর্ক রয়েছে, অর্থাৎ হর্সপাওয়ার বাড়ার সাথে সাথে গাড়িগুলো সাধারণত প্রতি গ্যালনে কম মাইল চলে।

আমাদের কাজকে ধারণাগত রূপ দিন

আমাদের ইনপুট ডেটা এখন দেখতে এইরকম হবে।

...
{
  "mpg":15,
  "horsepower":165,
},
{
  "mpg":18,
  "horsepower":150,
},
{
  "mpg":16,
  "horsepower":150,
},
...

আমাদের লক্ষ্য হলো এমন একটি মডেলকে প্রশিক্ষণ দেওয়া, যা ‘হর্সপাওয়ার’ নামক একটি সংখ্যা গ্রহণ করে ‘মাইলস পার গ্যালন’ নামক আরেকটি সংখ্যা ভবিষ্যদ্বাণী করতে শিখবে। এই এক-এক সম্পর্কটির কথা মনে রাখবেন, কারণ এটি পরবর্তী অংশের জন্য গুরুত্বপূর্ণ হবে।

আমরা হর্সপাওয়ার এবং এমপিজি-র এই উদাহরণগুলো একটি নিউরাল নেটওয়ার্কে ইনপুট হিসেবে দেব, যা এই উদাহরণগুলো থেকে হর্সপাওয়ার জানা থাকলে এমপিজি অনুমান করার জন্য একটি সূত্র (বা ফাংশন) শিখবে। যেসব উদাহরণের সঠিক উত্তর আমাদের কাছে আছে, সেখান থেকে শেখার এই প্রক্রিয়াকে সুপারভাইজড লার্নিং বলা হয়

৪. মডেল আর্কিটেকচার সংজ্ঞায়িত করুন

এই অংশে আমরা মডেল আর্কিটেকচার বর্ণনা করার জন্য কোড লিখব। মডেল আর্কিটেকচার হলো সহজ ভাষায় বোঝানো যে , "মডেলটি কার্যকর হওয়ার সময় কোন ফাংশনগুলো চালাবে" , অথবা অন্যভাবে বললে , "আমাদের মডেল তার উত্তর গণনা করার জন্য কোন অ্যালগরিদম ব্যবহার করবে"

এমএল মডেল হলো এমন অ্যালগরিদম যা ইনপুট গ্রহণ করে আউটপুট তৈরি করে। নিউরাল নেটওয়ার্ক ব্যবহার করার ক্ষেত্রে, অ্যালগরিদমটি হলো নিউরনের কয়েকটি স্তরের একটি সেট, যার আউটপুট 'ওয়েট' (সংখ্যা) দ্বারা নিয়ন্ত্রিত হয়। প্রশিক্ষণ প্রক্রিয়ার মাধ্যমে ঐ ওয়েটগুলোর জন্য আদর্শ মানগুলো শেখা হয়।

96914ff65fc3b74c.png আপনার নিম্নলিখিত ফাংশনটি যোগ করুন

মডেলের স্থাপত্য নির্ধারণের জন্য script.js ফাইল।

function createModel() {
  // Create a sequential model
  const model = tf.sequential();

  // Add a single input layer
  model.add(tf.layers.dense({inputShape: [1], units: 1, useBias: true}));

  // Add an output layer
  model.add(tf.layers.dense({units: 1, useBias: true}));

  return model;
}

এটি tensorflow.js-এ সংজ্ঞায়িত করা যায় এমন সবচেয়ে সহজ মডেলগুলোর মধ্যে একটি, চলুন প্রতিটি লাইন একটু ভেঙে বিশ্লেষণ করা যাক।

মডেলটি ইনস্ট্যানশিয়েট করুন

const model = tf.sequential();

এটি একটি tf.Model অবজেক্ট তৈরি করে। এই মডেলটি sequential , কারণ এর ইনপুটগুলো সরাসরি আউটপুটে প্রবাহিত হয়। অন্যান্য ধরনের মডেলে শাখা, এমনকি একাধিক ইনপুট ও আউটপুটও থাকতে পারে, কিন্তু বেশিরভাগ ক্ষেত্রেই আপনার মডেলগুলো সিকোয়েনশিয়াল হবে। সিকোয়েনশিয়াল মডেলগুলোর এপিআই (API) ব্যবহার করাও সহজ

স্তর যোগ করুন

model.add(tf.layers.dense({inputShape: [1], units: 1, useBias: true}));

এটি আমাদের নেটওয়ার্কে একটি ইনপুট লেয়ার যুক্ত করে, যা স্বয়ংক্রিয়ভাবে একটি হিডেন ইউনিট সহ একটি dense লেয়ারের সাথে সংযুক্ত থাকে। dense লেয়ার হলো এমন এক ধরনের লেয়ার যা তার ইনপুটগুলোকে একটি ম্যাট্রিক্স (যাকে ওয়েটস বলা হয়) দ্বারা গুণ করে এবং তারপর ফলাফলের সাথে একটি সংখ্যা (যাকে বায়াস বলা হয়) যোগ করে। যেহেতু এটি নেটওয়ার্কের প্রথম লেয়ার, তাই আমাদের inputShape সংজ্ঞায়িত করতে হবে। inputShape হলো [1] কারণ আমাদের ইনপুট হিসেবে 1 সংখ্যা রয়েছে (একটি নির্দিষ্ট গাড়ির হর্সপাওয়ার)।

units নির্ধারণ করে যে লেয়ারের ওয়েট ম্যাট্রিক্সটি কতটা বড় হবে। এখানে এটিকে ১-এ সেট করার মাধ্যমে আমরা বলছি যে ডেটার প্রতিটি ইনপুট ফিচারের জন্য ১টি করে ওয়েট থাকবে।

model.add(tf.layers.dense({units: 1}));

উপরের কোডটি আমাদের আউটপুট লেয়ার তৈরি করে। আমরা units 1 সেট করেছি কারণ আমরা 1 সংখ্যা আউটপুট করতে চাই।

একটি ইনস্ট্যান্স তৈরি করুন

96914ff65fc3b74c.png নিম্নলিখিত কোডটি যোগ করুন

আমরা আগে যে ফাংশনটি সংজ্ঞায়িত করেছিলাম তা run

// Create the model
const model = createModel();
tfvis.show.modelSummary({name: 'Model Summary'}, model);

এটি মডেলটির একটি ইনস্ট্যান্স তৈরি করবে এবং ওয়েবপেজে লেয়ারগুলোর একটি সারাংশ দেখাবে।

৫. প্রশিক্ষণের জন্য ডেটা প্রস্তুত করুন।

TensorFlow.js-এর পারফরম্যান্সগত সুবিধাগুলো পেতে, যা মেশিন লার্নিং মডেলের প্রশিক্ষণকে বাস্তবসম্মত করে তোলে, আমাদের ডেটাকে টেনসরে রূপান্তর করতে হবে। এছাড়াও আমরা আমাদের ডেটার উপর বেশ কিছু রূপান্তর প্রয়োগ করব যা সর্বোত্তম অনুশীলন, যেমন শাফলিং এবং নর্মালাইজেশন

96914ff65fc3b74c.png আপনার নিম্নলিখিত কোডটি যোগ করুন

script.js ফাইল

/**
 * Convert the input data to tensors that we can use for machine
 * learning. We will also do the important best practices of _shuffling_
 * the data and _normalizing_ the data
 * MPG on the y-axis.
 */
function convertToTensor(data) {
  // Wrapping these calculations in a tidy will dispose any
  // intermediate tensors.

  return tf.tidy(() => {
    // Step 1. Shuffle the data
    tf.util.shuffle(data);

    // Step 2. Convert data to Tensor
    const inputs = data.map(d => d.horsepower)
    const labels = data.map(d => d.mpg);

    const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]);
    const labelTensor = tf.tensor2d(labels, [labels.length, 1]);

    //Step 3. Normalize the data to the range 0 - 1 using min-max scaling
    const inputMax = inputTensor.max();
    const inputMin = inputTensor.min();
    const labelMax = labelTensor.max();
    const labelMin = labelTensor.min();

    const normalizedInputs = inputTensor.sub(inputMin).div(inputMax.sub(inputMin));
    const normalizedLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));

    return {
      inputs: normalizedInputs,
      labels: normalizedLabels,
      // Return the min/max bounds so we can use them later.
      inputMax,
      inputMin,
      labelMax,
      labelMin,
    }
  });
}

চলুন, এখানে কী ঘটছে তা বিশদভাবে বিশ্লেষণ করা যাক।

ডেটা এলোমেলো করুন

// Step 1. Shuffle the data
tf.util.shuffle(data);

এখানে আমরা ট্রেনিং অ্যালগরিদমে যে উদাহরণগুলো দেবো, সেগুলোর ক্রম এলোমেলো করে দিই। এই এলোমেলো করা গুরুত্বপূর্ণ, কারণ সাধারণত ট্রেনিংয়ের সময় ডেটাসেটকে ছোট ছোট উপসেটে ভাগ করা হয়, যেগুলোকে ব্যাচ বলা হয়, এবং সেগুলোর উপরেই মডেলটিকে ট্রেনিং দেওয়া হয়। এই এলোমেলো করা প্রতিটি ব্যাচকে ডেটা ডিস্ট্রিবিউশনের বিভিন্ন স্তর থেকে নানা ধরনের ডেটা পেতে সাহায্য করে। এর মাধ্যমে আমরা মডেলটিকে সাহায্য করি:

  • এমন জিনিস শেখা নয় যা সম্পূর্ণরূপে ডেটা প্রদানের ক্রমের উপর নির্ভরশীল।
  • উপগোষ্ঠীগুলোর কাঠামোর প্রতি সংবেদনশীল না হওয়া (উদাহরণস্বরূপ, যদি এটি তার প্রশিক্ষণের প্রথম অর্ধাংশে কেবল উচ্চ হর্সপাওয়ারের গাড়ি দেখে, তবে এটি এমন একটি সম্পর্ক শিখতে পারে যা ডেটাসেটের বাকি অংশের ক্ষেত্রে প্রযোজ্য নয়)।

টেনসরে রূপান্তর করুন

// Step 2. Convert data to Tensor
const inputs = data.map(d => d.horsepower)
const labels = data.map(d => d.mpg);

const inputTensor = tf.tensor2d(inputs, [inputs.length, 1]);
const labelTensor = tf.tensor2d(labels, [labels.length, 1]);

এখানে আমরা দুটি অ্যারে তৈরি করি, একটি আমাদের ইনপুট উদাহরণগুলির জন্য (হর্সপাওয়ার এন্ট্রিগুলি), এবং অন্যটি প্রকৃত আউটপুট মানগুলির জন্য (যা মেশিন লার্নিংয়ে লেবেল নামে পরিচিত)।

এরপর আমরা প্রতিটি অ্যারে ডেটাকে একটি 2d ​​টেনসরে রূপান্তর করি। টেনসরটির আকার হবে [num_examples, num_features_per_example] । এখানে আমাদের inputs.length সংখ্যক উদাহরণ রয়েছে এবং প্রতিটি উদাহরণের 1 ইনপুট ফিচার (হর্সপাওয়ার) আছে।

ডেটা স্বাভাবিক করুন

//Step 3. Normalize the data to the range 0 - 1 using min-max scaling
const inputMax = inputTensor.max();
const inputMin = inputTensor.min();
const labelMax = labelTensor.max();
const labelMin = labelTensor.min();

const normalizedInputs = inputTensor.sub(inputMin).div(inputMax.sub(inputMin));
const normalizedLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));

এরপর আমরা মেশিন লার্নিং প্রশিক্ষণের জন্য আরেকটি সেরা অনুশীলন করি। আমরা ডেটা নর্মালাইজ করি । এখানে আমরা মিন-ম্যাক্স স্কেলিং ব্যবহার করে ডেটাকে 0-1 সংখ্যাসূচক পরিসরে নর্মালাইজ করি নর্মালাইজেশন গুরুত্বপূর্ণ কারণ tensorflow.js দিয়ে আপনি যে অনেক মেশিন লার্নিং মডেল তৈরি করবেন, সেগুলোর অভ্যন্তরীণ কাঠামো খুব বড় নয় এমন সংখ্যা নিয়ে কাজ করার জন্য ডিজাইন করা হয়েছে। ডেটা নর্মালাইজ করার জন্য সাধারণ পরিসরগুলোর মধ্যে 0 to 1 অথবা -1 to 1 অন্তর্ভুক্ত। আপনি যদি আপনার ডেটাকে একটি যুক্তিসঙ্গত পরিসরে নর্মালাইজ করার অভ্যাস গড়ে তোলেন, তবে আপনার মডেল প্রশিক্ষণে আপনি আরও বেশি সাফল্য পাবেন।

ডেটা এবং স্বাভাবিকীকরণের সীমা ফেরত দিন

return {
  inputs: normalizedInputs,
  labels: normalizedLabels,
  // Return the min/max bounds so we can use them later.
  inputMax,
  inputMin,
  labelMax,
  labelMin,
}

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

৬. মডেলটিকে প্রশিক্ষণ দিন

আমাদের মডেল ইনস্ট্যান্স তৈরি হয়ে যাওয়ায় এবং ডেটা টেনসর হিসেবে উপস্থাপিত হওয়ায়, প্রশিক্ষণ প্রক্রিয়া শুরু করার জন্য সবকিছু প্রস্তুত।

96914ff65fc3b74c.png নিম্নলিখিত ফাংশনটি আপনার মধ্যে কপি করুন

script.js ফাইল।

async function trainModel(model, inputs, labels) {
  // Prepare the model for training.
  model.compile({
    optimizer: tf.train.adam(),
    loss: tf.losses.meanSquaredError,
    metrics: ['mse'],
  });

  const batchSize = 32;
  const epochs = 50;

  return await model.fit(inputs, labels, {
    batchSize,
    epochs,
    shuffle: true,
    callbacks: tfvis.show.fitCallbacks(
      { name: 'Training Performance' },
      ['loss', 'mse'],
      { height: 200, callbacks: ['onEpochEnd'] }
    )
  });
}

চলুন বিষয়টি বিশদভাবে আলোচনা করা যাক।

প্রশিক্ষণের জন্য প্রস্তুতি নিন

// Prepare the model for training.
model.compile({
  optimizer: tf.train.adam(),
  loss: tf.losses.meanSquaredError,
  metrics: ['mse'],
});

মডেলটিকে প্রশিক্ষণ দেওয়ার আগে আমাদের এটিকে 'কম্পাইল' করতে হবে। তা করার জন্য, আমাদের বেশ কিছু অত্যন্ত গুরুত্বপূর্ণ বিষয় নির্দিষ্ট করতে হয়:

  • optimizer : এটি সেই অ্যালগরিদম যা মডেলের আপডেটগুলো পরিচালনা করে। TensorFlow.js-এ অনেক অপ্টিমাইজার রয়েছে। এখানে আমরা অ্যাডাম অপ্টিমাইজারটি বেছে নিয়েছি, কারণ এটি বাস্তবে বেশ কার্যকর এবং এর জন্য কোনো কনফিগারেশনের প্রয়োজন হয় না।
  • loss ): এটি এমন একটি ফাংশন যা মডেলকে জানায় যে, তাকে দেখানো প্রতিটি ব্যাচ (ডেটার উপসেট) শেখার ক্ষেত্রে সে কতটা ভালো করছে। এখানে আমরা মডেলের করা প্রেডিকশনগুলোকে প্রকৃত মানের সাথে তুলনা করার জন্য meanSquaredError ব্যবহার করি।
const batchSize = 32;
const epochs = 50;

এরপর আমরা একটি ব্যাচসাইজ এবং ইপোকের সংখ্যা নির্বাচন করব:

  • batchSize বলতে ডেটার সেই উপসেটগুলোর আকারকে বোঝায় যা মডেলটি প্রশিক্ষণের প্রতিটি পুনরাবৃত্তিতে দেখতে পাবে। প্রচলিত batch size সাধারণত ৩২ থেকে ৫১২-এর মধ্যে থাকে। সব সমস্যার জন্য আসলে কোনো আদর্শ batch size নেই এবং বিভিন্ন batch size-এর গাণিতিক কারণগুলো বর্ণনা করা এই টিউটোরিয়ালের আওতার বাইরে।
  • epochs বলতে বোঝায়, আপনার দেওয়া সম্পূর্ণ ডেটাসেটটি মডেলটি কতবার দেখবে। এখানে আমরা ডেটাসেটটির মধ্য দিয়ে ৫০ বার পুনরাবৃত্তি করব।

ট্রেন লুপ শুরু করুন

return await model.fit(inputs, labels, {
  batchSize,
  epochs,
  callbacks: tfvis.show.fitCallbacks(
    { name: 'Training Performance' },
    ['loss', 'mse'],
    { height: 200, callbacks: ['onEpochEnd'] }
  )
});

model.fit হলো সেই ফাংশন যা আমরা ট্রেনিং লুপ শুরু করার জন্য কল করি। এটি একটি অ্যাসিঙ্ক্রোনাস ফাংশন, তাই আমরা এর দেওয়া প্রমিজটি রিটার্ন করি, যাতে কলার বুঝতে পারে কখন ট্রেনিং সম্পূর্ণ হয়েছে।

ট্রেনিংয়ের অগ্রগতি নিরীক্ষণ করার জন্য আমরা model.fit এ কিছু কলব্যাক পাস করি। আমরা পূর্বে নির্দিষ্ট করা 'loss' এবং 'mse' মেট্রিকের জন্য চার্ট প্লট করার ফাংশন তৈরি করতে tfvis.show.fitCallbacks ব্যবহার করি।

সবকিছু একসাথে করুন

এখন আমাদের run ফাংশন থেকে সংজ্ঞায়িত ফাংশনগুলোকে কল করতে হবে।

96914ff65fc3b74c.png আপনার ফাইলের শেষে নিম্নলিখিত কোডটি যোগ করুন।

run ফাংশন।

// Convert the data to a form we can use for training.
const tensorData = convertToTensor(data);
const {inputs, labels} = tensorData;

// Train the model
await trainModel(model, inputs, labels);
console.log('Done Training');

আপনি যখন পৃষ্ঠাটি রিফ্রেশ করবেন, কয়েক সেকেন্ড পরে নিম্নলিখিত গ্রাফগুলি আপডেট হতে দেখবেন।

c6d3214d6e8c3752.png

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

একটি মডেলকে প্রশিক্ষণ দেওয়ার সময় আমরা চাই লস কমে আসুক। এক্ষেত্রে, যেহেতু আমাদের মেট্রিকটি ত্রুটির একটি পরিমাপ, তাই আমরা চাই এটিও কমে আসুক।

৭. ভবিষ্যদ্বাণী করুন

এখন যেহেতু আমাদের মডেলটি প্রশিক্ষিত হয়েছে, আমরা কিছু পূর্বাভাস দিতে চাই। কম থেকে বেশি হর্সপাওয়ারের একটি অভিন্ন পরিসরের জন্য মডেলটি কী পূর্বাভাস দেয়, তা দেখে এর কার্যকারিতা মূল্যায়ন করা যাক।

96914ff65fc3b74c.png আপনার script.js ফাইলে নিম্নলিখিত ফাংশনটি যোগ করুন।

function testModel(model, inputData, normalizationData) {
  const {inputMax, inputMin, labelMin, labelMax} = normalizationData;

  // Generate predictions for a uniform range of numbers between 0 and 1;
  // We un-normalize the data by doing the inverse of the min-max scaling
  // that we did earlier.
  const [xs, preds] = tf.tidy(() => {

    const xsNorm = tf.linspace(0, 1, 100);
    const predictions = model.predict(xsNorm.reshape([100, 1]));

    const unNormXs = xsNorm
      .mul(inputMax.sub(inputMin))
      .add(inputMin);

    const unNormPreds = predictions
      .mul(labelMax.sub(labelMin))
      .add(labelMin);

    // Un-normalize the data
    return [unNormXs.dataSync(), unNormPreds.dataSync()];
  });


  const predictedPoints = Array.from(xs).map((val, i) => {
    return {x: val, y: preds[i]}
  });

  const originalPoints = inputData.map(d => ({
    x: d.horsepower, y: d.mpg,
  }));


  tfvis.render.scatterplot(
    {name: 'Model Predictions vs Original Data'},
    {values: [originalPoints, predictedPoints], series: ['original', 'predicted']},
    {
      xLabel: 'Horsepower',
      yLabel: 'MPG',
      height: 300
    }
  );
}

উপরের ফাংশনটিতে কয়েকটি বিষয় লক্ষণীয়।

const xsNorm = tf.linspace(0, 1, 100);
const predictions = model.predict(xsNorm.reshape([100, 1]));

মডেলে দেওয়ার জন্য আমরা ১০০টি নতুন 'উদাহরণ' তৈরি করি। Model.predict ব্যবহার করে আমরা সেই উদাহরণগুলো মডেলে দিই। মনে রাখবেন, প্রশিক্ষণের সময়কার আকারের ( [num_examples, num_features_per_example] ) মতোই এগুলোর আকারও একই রকম হতে হবে।

// Un-normalize the data
const unNormXs = xsNorm
  .mul(inputMax.sub(inputMin))
  .add(inputMin);

const unNormPreds = predictions
  .mul(labelMax.sub(labelMin))
  .add(labelMin);

ডেটাকে আমাদের মূল পরিসরে (০-১ এর পরিবর্তে) ফিরিয়ে আনতে, আমরা নর্মালাইজ করার সময় গণনা করা মানগুলোই ব্যবহার করি, কিন্তু শুধু প্রক্রিয়াগুলো উল্টে দিই।

return [unNormXs.dataSync(), unNormPreds.dataSync()];

.dataSync() হলো এমন একটি মেথড যা ব্যবহার করে আমরা একটি টেনসরে সংরক্ষিত ভ্যালুগুলোর একটি typedarray পেতে পারি। এর মাধ্যমে আমরা সাধারণ জাভাস্ক্রিপ্টে সেই ভ্যালুগুলো প্রসেস করতে পারি। এটি .data() মেথডের একটি সিনক্রোনাস সংস্করণ, যা সাধারণত বেশি পছন্দ করা হয়।

অবশেষে আমরা মূল ডেটা এবং মডেল থেকে প্রাপ্ত পূর্বাভাসগুলো প্লট করার জন্য tfjs-vis ব্যবহার করি।

96914ff65fc3b74c.png আপনার নিম্নলিখিত কোডটি যোগ করুন

run ফাংশন।

// Make some predictions using the model and compare them to the
// original data
testModel(model, data, tensorData);

পৃষ্ঠাটি রিফ্রেশ করুন এবং মডেলটির প্রশিক্ষণ শেষ হলে আপনি নিচের মতো কিছু দেখতে পাবেন।

fe610ff34708d4a.png

অভিনন্দন! আপনি এইমাত্র একটি সাধারণ মেশিন লার্নিং মডেলকে প্রশিক্ষণ দিয়েছেন। এটি বর্তমানে লিনিয়ার রিগ্রেশন নামে পরিচিত একটি প্রক্রিয়া সম্পাদন করছে, যা ইনপুট ডেটার মধ্যে বিদ্যমান প্রবণতার সাথে একটি রেখা মেলানোর চেষ্টা করে।

৮. মূল বিষয়বস্তু

একটি মেশিন লার্নিং মডেল প্রশিক্ষণের ধাপগুলোর মধ্যে রয়েছে:

আপনার কাজটি প্রণয়ন করুন:

  • এটি কি রিগ্রেশন সমস্যা নাকি ক্লাসিফিকেশন সমস্যা?
  • এটি কি সুপারভাইজড লার্নিং বা আনসুপারভাইজড লার্নিং এর মাধ্যমে করা যেতে পারে?
  • ইনপুট ডেটার আকৃতি কী? আউটপুট ডেটা দেখতে কেমন হওয়া উচিত?

আপনার ডেটা প্রস্তুত করুন:

  • আপনার ডেটা পরিষ্কার করুন এবং সম্ভব হলে প্যাটার্ন খুঁজে বের করার জন্য ম্যানুয়ালি পরীক্ষা করুন।
  • প্রশিক্ষণের জন্য ব্যবহার করার আগে আপনার ডেটা পুনর্বিন্যাস করুন।
  • নিউরাল নেটওয়ার্কের জন্য আপনার ডেটাকে একটি যুক্তিসঙ্গত পরিসরে স্বাভাবিক করুন। সাধারণত সংখ্যাসূচক ডেটার জন্য ০-১ বা -১-১ ভালো পরিসর।
  • আপনার ডেটাকে টেনসরে রূপান্তর করুন

আপনার মডেলটি তৈরি ও চালান:

  • tf.sequential বা tf.model ব্যবহার করে আপনার মডেলটি সংজ্ঞায়িত করুন, তারপর tf.layers.* ব্যবহার করে এতে লেয়ার যুক্ত করুন।
  • একটি অপটিমাইজার (সাধারণত অ্যাডাম একটি ভালো অপটিমাইজার) এবং ব্যাচ সাইজ ও এপোকের সংখ্যার মতো প্যারামিটারগুলো বেছে নিন।
  • আপনার সমস্যার জন্য একটি উপযুক্ত লস ফাংশন এবং অগ্রগতি মূল্যায়নের জন্য একটি অ্যাকুরেসি মেট্রিক বেছে নিন। রিগ্রেশন সমস্যার জন্য meanSquaredError একটি প্রচলিত লস ফাংশন।
  • ক্ষতি কমছে কিনা তা দেখতে প্রশিক্ষণ পর্যবেক্ষণ করুন।

আপনার মডেল মূল্যায়ন করুন

  • আপনার মডেলের জন্য এমন একটি মূল্যায়ন মেট্রিক বেছে নিন যা আপনি প্রশিক্ষণের সময় পর্যবেক্ষণ করতে পারবেন। প্রশিক্ষণ সম্পন্ন হলে, ভবিষ্যদ্বাণীর মান সম্পর্কে ধারণা পেতে কিছু পরীক্ষামূলক ভবিষ্যদ্বাণী করে দেখুন।

৯. অতিরিক্ত ক্রেডিট: চেষ্টা করার মতো বিষয়সমূহ

  • ইপোকের সংখ্যা পরিবর্তন করে পরীক্ষা করুন। গ্রাফটি সমতল হওয়ার আগে কতগুলো ইপোকের প্রয়োজন হয়?
  • হিডেন লেয়ারে ইউনিটের সংখ্যা বাড়িয়ে পরীক্ষা করুন।
  • আমরা যে প্রথম হিডেন লেয়ারটি যোগ করেছি এবং চূড়ান্ত আউটপুট লেয়ারের মাঝে আরও হিডেন লেয়ার যোগ করে পরীক্ষা করুন। এই অতিরিক্ত লেয়ারগুলোর কোড দেখতে অনেকটা এইরকম হবে।
model.add(tf.layers.dense({units: 50, activation: 'sigmoid'}));

এই হিডেন লেয়ারগুলোর সবচেয়ে গুরুত্বপূর্ণ নতুন বিষয়টি হলো, এগুলো একটি নন-লিনিয়ার অ্যাক্টিভেশন ফাংশন প্রবর্তন করে, এক্ষেত্রে সিগময়েড অ্যাক্টিভেশন। অ্যাক্টিভেশন ফাংশন সম্পর্কে আরও জানতে এই নিবন্ধটি দেখুন

মডেলটিকে দিয়ে নিচের ছবির মতো আউটপুট তৈরি করানো যায় কিনা দেখুন।

a21c5e6537cf81d.png