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

1. ভূমিকা

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

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

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

যা আপনি নির্মাণ করবেন

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

এটি করার জন্য আপনি:

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

আপনি কি শিখবেন

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

আপনি কি প্রয়োজন হবে

2. সেট আপ করুন

একটি 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 কনসোল খুলুন।

যদি সবকিছু কাজ করে, তাহলে devtools কনসোলে দুটি গ্লোবাল ভেরিয়েবল তৈরি এবং উপলব্ধ হওয়া উচিত।:

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

আপনার ব্রাউজারের বিকাশকারী সরঞ্জামগুলি খুলুন, আপনি কনসোল আউটপুটে Hello TensorFlow বলে একটি বার্তা দেখতে পাবেন। যদি তাই হয়, আপনি পরবর্তী ধাপে যেতে প্রস্তুত.

3. ইনপুট ডেটা লোড করুন, ফর্ম্যাট করুন এবং কল্পনা করুন৷

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

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

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 এর মধ্যে একটি নেতিবাচক সম্পর্ক রয়েছে, অর্থাৎ হর্সপাওয়ার বাড়লে গাড়িগুলি সাধারণত প্রতি গ্যালন কম মাইল পায়।

আমাদের টাস্ক ধারণা

আমাদের ইনপুট তথ্য এখন এই মত দেখাবে.

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

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

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

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

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

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

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 স্তরে ওজন ম্যাট্রিক্স কত বড় হবে তা সেট করে। এটিকে 1 এ সেট করে আমরা বলছি যে ডেটার প্রতিটি ইনপুট বৈশিষ্ট্যের জন্য 1 ওজন থাকবে।

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);

এটি মডেলের একটি উদাহরণ তৈরি করবে এবং ওয়েবপৃষ্ঠায় স্তরগুলির একটি সারাংশ দেখাবে৷

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

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,
}

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

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

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

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 ডেটা উপসেটগুলির আকারকে বোঝায় যা মডেলটি প্রশিক্ষণের প্রতিটি পুনরাবৃত্তিতে দেখতে পাবে। সাধারণ ব্যাচের আকার 32-512 সীমার মধ্যে থাকে। সমস্ত সমস্যার জন্য সত্যিই একটি আদর্শ ব্যাচের আকার নেই এবং বিভিন্ন ব্যাচের আকারের জন্য গাণিতিক প্রেরণা বর্ণনা করা এই টিউটোরিয়ালের সুযোগের বাইরে।
  • epochs বলতে বোঝায় যে মডেলটি আপনার প্রদান করা সম্পূর্ণ ডেটাসেটের দিকে কতবার তাকাবে। এখানে আমরা ডেটাসেটের মাধ্যমে 50টি পুনরাবৃত্তি করব।

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

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 এ কিছু কলব্যাক পাস করি। আমরা tfvis.show.fitCallbacks ব্যবহার করি এমন ফাংশন তৈরি করতে যা 'ক্ষতি' এবং 'mse' মেট্রিকের জন্য চার্ট তৈরি করে যা আমরা আগে উল্লেখ করেছি।

সব একসাথে রাখুন

এখন আমাদের 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

এগুলি আমরা আগে তৈরি করা কলব্যাক দ্বারা তৈরি। তারা প্রতিটি যুগের শেষে সমগ্র ডেটাসেটের গড় হার এবং mse প্রদর্শন করে।

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

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

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

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]));

আমরা মডেলকে খাওয়ানোর জন্য 100টি নতুন 'উদাহরণ' তৈরি করি। 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);

ডেটা আমাদের আসল পরিসরে ফিরে পেতে (0-1 এর পরিবর্তে) আমরা স্বাভাবিক করার সময় আমরা যে মানগুলি গণনা করেছি তা ব্যবহার করি, তবে কেবল অপারেশনগুলিকে উল্টে দিই।

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

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

8. প্রধান টেকওয়ে

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

আপনার টাস্ক গঠন করুন:

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

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

  • আপনার ডেটা পরিষ্কার করুন এবং সম্ভব হলে প্যাটার্নের জন্য ম্যানুয়ালি পরিদর্শন করুন
  • প্রশিক্ষণের জন্য এটি ব্যবহার করার আগে আপনার ডেটা শাফেল করুন
  • নিউরাল নেটওয়ার্কের জন্য একটি যুক্তিসঙ্গত পরিসরে আপনার ডেটাকে স্বাভাবিক করুন। সাধারনত 0-1 বা -1-1 হল সাংখ্যিক ডেটার জন্য ভাল রেঞ্জ।
  • আপনার ডেটাকে টেনসরে রূপান্তর করুন

আপনার মডেল তৈরি করুন এবং চালান:

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

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

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

9. অতিরিক্ত ক্রেডিট: চেষ্টা করার জিনিস

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

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

আপনি নীচের ছবির মত আউটপুট উত্পাদন করতে মডেল পেতে পারেন কিনা দেখুন.

a21c5e6537cf81d.png