1. ভূমিকা
এই কোডল্যাবে আপনি একটি মডেলকে প্রশিক্ষণ দেবেন কিভাবে গাড়ির একটি সেট বর্ণনা করে সংখ্যাসূচক তথ্য থেকে ভবিষ্যদ্বাণী করতে হয়।
এই অনুশীলনীতে বিভিন্ন ধরণের মডেল প্রশিক্ষণের জন্য সাধারণ পদক্ষেপগুলি দেখানো হবে, তবে একটি ছোট ডেটাসেট এবং একটি সহজ (অগভীর) মডেল ব্যবহার করা হবে। প্রাথমিক লক্ষ্য হল TensorFlow.js-এর মাধ্যমে প্রশিক্ষণ মডেলগুলির মৌলিক পরিভাষা, ধারণা এবং বাক্য গঠনের সাথে পরিচিত হতে সাহায্য করা এবং আরও অন্বেষণ এবং শেখার জন্য একটি ধাপ প্রদান করা।
যেহেতু আমরা একটি মডেলকে ধারাবাহিক সংখ্যার পূর্বাভাস দেওয়ার প্রশিক্ষণ দিচ্ছি, তাই এই কাজটিকে কখনও কখনও রিগ্রেশন টাস্ক বলা হয়। আমরা সঠিক আউটপুট সহ ইনপুটের অনেক উদাহরণ দেখিয়ে মডেলটিকে প্রশিক্ষণ দেব। এটিকে তত্ত্বাবধানে শেখা বলা হয়।
তুমি কী তৈরি করবে
তুমি এমন একটি ওয়েবপেজ তৈরি করবে যা ব্রাউজারে একটি মডেলকে প্রশিক্ষণ দেওয়ার জন্য TensorFlow.js ব্যবহার করবে। একটি গাড়ির জন্য "হর্সপাওয়ার" দেওয়া হলে, মডেলটি "মাইল প্রতি গ্যালন" (MPG) পূর্বাভাস দিতে শিখবে।
এটি করার জন্য আপনি:
- তথ্য লোড করুন এবং প্রশিক্ষণের জন্য প্রস্তুত করুন।
- মডেলের স্থাপত্য সংজ্ঞায়িত করুন।
- মডেলটিকে প্রশিক্ষণ দিন এবং প্রশিক্ষণের সময় এর কর্মক্ষমতা পর্যবেক্ষণ করুন।
- কিছু ভবিষ্যদ্বাণী করে প্রশিক্ষিত মডেলটি মূল্যায়ন করুন।
তুমি কি শিখবে
- মেশিন লার্নিংয়ের জন্য ডেটা প্রস্তুতির জন্য সর্বোত্তম অনুশীলন, যার মধ্যে রয়েছে শাফলিং এবং নরমালাইজেশন।
- tf.layers API ব্যবহার করে মডেল তৈরির জন্য TensorFlow.js সিনট্যাক্স।
- tfjs-vis লাইব্রেরি ব্যবহার করে ব্রাউজারে প্রশিক্ষণ কীভাবে পর্যবেক্ষণ করবেন।
তোমার যা লাগবে
- Chrome অথবা অন্য কোন আধুনিক ব্রাউজারের সাম্প্রতিক সংস্করণ।
- একটি টেক্সট এডিটর, যা আপনার মেশিনে স্থানীয়ভাবে চলবে অথবা ওয়েবে কোডপেন বা গ্লিচের মতো কিছুর মাধ্যমে চলবে।
- HTML, CSS, JavaScript, এবং Chrome DevTools (অথবা আপনার পছন্দের ব্রাউজার devtools) সম্পর্কে জ্ঞান থাকতে হবে।
- নিউরাল নেটওয়ার্ক সম্পর্কে উচ্চ-স্তরের ধারণাগত ধারণা। যদি আপনার ভূমিকা বা রিফ্রেশারের প্রয়োজন হয়, তাহলে 3blue1brown-এর এই ভিডিওটি অথবা Ashi Krishnan-এর জাভাস্ক্রিপ্টে গভীর শিক্ষার উপর এই ভিডিওটি দেখার কথা বিবেচনা করুন।
2. সেট আপ করুন
একটি HTML পৃষ্ঠা তৈরি করুন এবং জাভাস্ক্রিপ্ট অন্তর্ভুক্ত করুন
নিচের কোডটি একটি 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>
কোডের জন্য জাভাস্ক্রিপ্ট ফাইল তৈরি করুন
- উপরের HTML ফাইলের মতো একই ফোল্ডারে, script.js নামে একটি ফাইল তৈরি করুন এবং এতে নিম্নলিখিত কোডটি রাখুন।
console.log('Hello TensorFlow');
এটি পরীক্ষা করে দেখুন
এখন যেহেতু তুমি HTML এবং JavaScript ফাইল তৈরি করে ফেলেছো, সেগুলো পরীক্ষা করে দেখো। তোমার ব্রাউজারে index.html ফাইলটি খুলো এবং devtools কনসোলটি খুলো।
যদি সবকিছু ঠিকঠাক কাজ করে, তাহলে devtools কনসোলে দুটি গ্লোবাল ভেরিয়েবল তৈরি এবং উপলব্ধ থাকা উচিত।:
-
tfহল TensorFlow.js লাইব্রেরির একটি রেফারেন্স -
tfvisহল tfjs-vis লাইব্রেরির একটি রেফারেন্স
আপনার ব্রাউজারের ডেভেলপার টুল খুলুন, কনসোল আউটপুটে Hello TensorFlow লেখা একটি বার্তা দেখতে পাবেন। যদি তাই হয়, তাহলে আপনি পরবর্তী ধাপে যেতে প্রস্তুত।
৩. ইনপুট ডেটা লোড, ফর্ম্যাট এবং ভিজ্যুয়ালাইজ করুন
প্রথম ধাপ হিসেবে, আসুন আমরা যে ডেটার উপর মডেলটিকে প্রশিক্ষণ দিতে চাই তা লোড, ফর্ম্যাট এবং ভিজ্যুয়ালাইজ করি।
আমরা আপনার জন্য হোস্ট করা একটি JSON ফাইল থেকে "কার" ডেটাসেট লোড করব। এতে প্রতিটি গাড়ির বিভিন্ন বৈশিষ্ট্য রয়েছে। এই টিউটোরিয়ালের জন্য, আমরা কেবল হর্সপাওয়ার এবং মাইলস পার গ্যালন সম্পর্কে ডেটা বের করতে চাই।
আপনার কোডে নিম্নলিখিত কোডটি যোগ করুন
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;
}
এটি এমন কোনও এন্ট্রিও সরিয়ে ফেলবে যেখানে মাইল প্রতি গ্যালন বা হর্সপাওয়ার সংজ্ঞায়িত করা হয়নি। আসুন এই ডেটাটি কেমন দেখাচ্ছে তা দেখার জন্য একটি স্ক্যাটারপ্লটে প্লট করি।
আপনার নীচের কোডটি যোগ করুন
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);
যখন আপনি পৃষ্ঠাটি রিফ্রেশ করবেন। তখন আপনি পৃষ্ঠার বাম দিকে একটি প্যানেল দেখতে পাবেন যেখানে ডেটার একটি বিক্ষিপ্ত অংশ থাকবে। এটি দেখতে এরকম কিছু হওয়া উচিত।

এই প্যানেলটি ভাইজার নামে পরিচিত এবং এটি tfjs-vis দ্বারা সরবরাহ করা হয়। এটি ভিজ্যুয়ালাইজেশন প্রদর্শনের জন্য একটি সুবিধাজনক জায়গা প্রদান করে।
সাধারণত ডেটা নিয়ে কাজ করার সময়, আপনার ডেটা একবার দেখে নেওয়া এবং প্রয়োজনে এটি পরিষ্কার করার উপায় খুঁজে বের করা একটি ভালো ধারণা। এই ক্ষেত্রে, আমাদের carsData থেকে কিছু এন্ট্রি মুছে ফেলতে হয়েছিল যেখানে সমস্ত প্রয়োজনীয় ক্ষেত্র ছিল না। ডেটা ভিজ্যুয়ালাইজ করার মাধ্যমে আমরা বুঝতে পারি যে ডেটার এমন কোনও কাঠামো আছে যা মডেলটি শিখতে পারে।
উপরের প্লট থেকে আমরা দেখতে পাচ্ছি যে হর্সপাওয়ার এবং MPG এর মধ্যে একটি নেতিবাচক সম্পর্ক রয়েছে, অর্থাৎ হর্সপাওয়ার যত বাড়বে, গাড়িগুলি সাধারণত প্রতি গ্যালনে কম মাইল পাবে।
আমাদের কাজটি ধারণা করুন
আমাদের ইনপুট ডেটা এখন এরকম দেখাবে।
...
{
"mpg":15,
"horsepower":165,
},
{
"mpg":18,
"horsepower":150,
},
{
"mpg":16,
"horsepower":150,
},
...
আমাদের লক্ষ্য হলো এমন একটি মডেল তৈরি করা যা একটি সংখ্যা , অশ্বশক্তি গ্রহণ করবে এবং একটি সংখ্যা, মাইলস প্রতি গ্যালন , ভবিষ্যদ্বাণী করতে শিখবে। এক-থেকে-এক ম্যাপিং মনে রাখবেন, কারণ এটি পরবর্তী বিভাগের জন্য গুরুত্বপূর্ণ হবে।
আমরা এই উদাহরণগুলি, হর্সপাওয়ার এবং MPG, একটি নিউরাল নেটওয়ার্কে সরবরাহ করতে যাচ্ছি যা এই উদাহরণগুলি থেকে MPG প্রদত্ত হর্সপাওয়ারের পূর্বাভাস দেওয়ার জন্য একটি সূত্র (বা ফাংশন) শিখবে। যে উদাহরণগুলির সঠিক উত্তরগুলি আমাদের কাছে রয়েছে তা থেকে এই শিক্ষাকে তত্ত্বাবধান করা শিক্ষা বলা হয় ।
৪. মডেল আর্কিটেকচারের সংজ্ঞা দাও
এই বিভাগে আমরা মডেল আর্কিটেকচার বর্ণনা করার জন্য কোড লিখব। মডেল আর্কিটেকচার হল "মডেলটি যখন কার্যকর হবে তখন কোন ফাংশনগুলি চলবে" , অথবা বিকল্পভাবে "আমাদের মডেলটি তার উত্তরগুলি গণনা করার জন্য কোন অ্যালগরিদম ব্যবহার করবে" তা বলার একটি অভিনব উপায়।
এমএল মডেল হল অ্যালগরিদম যা ইনপুট নেয় এবং আউটপুট তৈরি করে। নিউরাল নেটওয়ার্ক ব্যবহার করার সময়, অ্যালগরিদম হল নিউরনের স্তরের একটি সেট যার 'ওজন' (সংখ্যা) তাদের আউটপুট নিয়ন্ত্রণ করে। প্রশিক্ষণ প্রক্রিয়াটি সেই ওজনগুলির জন্য আদর্শ মানগুলি শেখে।
আপনার ফাংশনে নিম্নলিখিত ফাংশনটি যোগ করুন
মডেল আর্কিটেকচার সংজ্ঞায়িত করার জন্য 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 নম্বর আউটপুট করতে চাই।
একটি উদাহরণ তৈরি করুন
নিম্নলিখিত কোডটি এতে যোগ করুন
আমরা আগে সংজ্ঞায়িত ফাংশন run ।
// Create the model
const model = createModel();
tfvis.show.modelSummary({name: 'Model Summary'}, model);
এটি মডেলের একটি উদাহরণ তৈরি করবে এবং ওয়েবপৃষ্ঠায় স্তরগুলির একটি সারাংশ দেখাবে।
৫. প্রশিক্ষণের জন্য তথ্য প্রস্তুত করুন
TensorFlow.js এর কর্মক্ষমতা সুবিধা পেতে, যা প্রশিক্ষণ মেশিন লার্নিং মডেলগুলিকে ব্যবহারিক করে তোলে, আমাদের ডেটাকে টেনসর- এ রূপান্তর করতে হবে। আমরা আমাদের ডেটাতে বেশ কয়েকটি রূপান্তরও করব যা সর্বোত্তম অনুশীলন, যেমন শাফলিং এবং নরমালাইজেশন ।
আপনার কোডে নিম্নলিখিত কোডটি যোগ করুন
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));
এরপর আমরা মেশিন লার্নিং প্রশিক্ষণের জন্য আরেকটি সেরা অনুশীলন করি। আমরা ডেটা স্বাভাবিক করি । এখানে আমরা min-max স্কেলিং ব্যবহার করে ডেটাকে 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,
}
আমরা প্রশিক্ষণের সময় স্বাভাবিকীকরণের জন্য ব্যবহৃত মানগুলি ধরে রাখতে চাই যাতে আমরা আউটপুটগুলিকে আমাদের মূল স্কেলে ফিরিয়ে আনতে আন-নরমালাইজ করতে পারি এবং ভবিষ্যতের ইনপুট ডেটা একইভাবে স্বাভাবিক করতে পারি।
৬. মডেলকে প্রশিক্ষণ দিন
আমাদের মডেল ইনস্ট্যান্স তৈরি এবং আমাদের ডেটা টেনসর হিসেবে উপস্থাপনের মাধ্যমে, প্রশিক্ষণ প্রক্রিয়া শুরু করার জন্য আমাদের কাছে সবকিছুই প্রস্তুত রয়েছে।
নিম্নলিখিত ফাংশনটি আপনার মধ্যে অনুলিপি করুন
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বলতে বোঝায় মডেলটি আপনার দেওয়া সম্পূর্ণ ডেটাসেটটি কতবার দেখবে। এখানে আমরা ডেটাসেটের মাধ্যমে ৫০টি পুনরাবৃত্তি নেব।
ট্রেন লুপ শুরু করুন
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 ফাংশন থেকে সংজ্ঞায়িত ফাংশনগুলি কল করতে হবে।
আপনার নীচের কোডটি যোগ করুন
ফাংশন 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');
যখন আপনি পৃষ্ঠাটি রিফ্রেশ করবেন, কয়েক সেকেন্ড পরে আপনি নিম্নলিখিত গ্রাফগুলি আপডেট হতে দেখবেন।

এগুলো আমাদের আগে তৈরি করা কলব্যাক দ্বারা তৈরি করা হয়েছে। এগুলো প্রতিটি যুগের শেষে সমগ্র ডেটাসেটের গড় ক্ষতি এবং mse প্রদর্শন করে।
একটি মডেলকে প্রশিক্ষণ দেওয়ার সময় আমরা ক্ষতি কমাতে চাই। এই ক্ষেত্রে, যেহেতু আমাদের মেট্রিক ত্রুটির একটি পরিমাপ, আমরা এটিও কমাতে চাই।
৭. ভবিষ্যদ্বাণী করুন
এখন যেহেতু আমাদের মডেলটি প্রশিক্ষিত, আমরা কিছু ভবিষ্যদ্বাণী করতে চাই। আসুন মডেলটি মূল্যায়ন করি নিম্ন থেকে উচ্চ অশ্বশক্তির সংখ্যার অভিন্ন পরিসরের জন্য এটি কী ভবিষ্যদ্বাণী করে তা দেখে।
আপনার 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 ব্যবহার করি।
আপনার কোডে নিম্নলিখিত কোডটি যোগ করুন
ফাংশন run ।
// Make some predictions using the model and compare them to the
// original data
testModel(model, data, tensorData);
পৃষ্ঠাটি রিফ্রেশ করুন এবং মডেলটি প্রশিক্ষণ শেষ করার পরে আপনি নীচের মতো কিছু দেখতে পাবেন।

অভিনন্দন! আপনি সবেমাত্র একটি সহজ মেশিন লার্নিং মডেল প্রশিক্ষিত করেছেন। এটি বর্তমানে লিনিয়ার রিগ্রেশন নামে পরিচিত একটি কাজ করে যা ইনপুট ডেটাতে উপস্থিত ট্রেন্ডের সাথে একটি লাইন ফিট করার চেষ্টা করে।
৮. প্রধান উপায়
একটি মেশিন লার্নিং মডেল প্রশিক্ষণের ধাপগুলির মধ্যে রয়েছে:
তোমার কাজটি তৈরি করো:
- এটা কি রিগ্রেশন সমস্যা নাকি ক্লাসিফিকেশন সমস্যা?
- এটি কি তত্ত্বাবধানে শেখার মাধ্যমে করা যেতে পারে নাকি তত্ত্বাবধানহীন শেখার মাধ্যমে?
- ইনপুট ডেটার আকৃতি কেমন? আউটপুট ডেটা কেমন হওয়া উচিত?
আপনার তথ্য প্রস্তুত করুন:
- আপনার ডেটা পরিষ্কার করুন এবং সম্ভব হলে প্যাটার্নের জন্য ম্যানুয়ালি পরীক্ষা করুন।
- প্রশিক্ষণের জন্য আপনার ডেটা ব্যবহার করার আগে এটি এলোমেলো করুন
- নিউরাল নেটওয়ার্কের জন্য আপনার ডেটাকে একটি যুক্তিসঙ্গত পরিসরে স্বাভাবিক করুন। সাধারণত 0-1 বা -1-1 সংখ্যাসূচক ডেটার জন্য ভাল পরিসর।
- আপনার ডেটাকে টেনসরে রূপান্তর করুন
আপনার মডেল তৈরি করুন এবং চালান:
-
tf.sequentialঅথবাtf.modelব্যবহার করে আপনার মডেলটি সংজ্ঞায়িত করুন এবংtf.layers.* - একটি অপ্টিমাইজার ( অ্যাডাম সাধারণত ভালো) এবং ব্যাচের আকার এবং যুগের সংখ্যার মতো পরামিতি বেছে নিন।
- আপনার সমস্যার জন্য একটি উপযুক্ত লস ফাংশন এবং অগ্রগতি মূল্যায়নে সাহায্য করার জন্য একটি নির্ভুলতা মেট্রিক বেছে নিন।
meanSquaredErrorহল রিগ্রেশন সমস্যার জন্য একটি সাধারণ লস ফাংশন। - লোকসান কমছে কিনা তা দেখার জন্য প্রশিক্ষণ পর্যবেক্ষণ করুন।
আপনার মডেল মূল্যায়ন করুন
- আপনার মডেলের জন্য এমন একটি মূল্যায়ন মেট্রিক বেছে নিন যা আপনি প্রশিক্ষণের সময় পর্যবেক্ষণ করতে পারেন। একবার এটি প্রশিক্ষিত হয়ে গেলে, ভবিষ্যদ্বাণীর গুণমান সম্পর্কে ধারণা পেতে কিছু পরীক্ষামূলক ভবিষ্যদ্বাণী করার চেষ্টা করুন।
৯. অতিরিক্ত ক্রেডিট: চেষ্টা করার মতো জিনিস
- যুগের সংখ্যা পরিবর্তন করে পরীক্ষা করুন। গ্রাফটি সমতল হওয়ার আগে আপনার কতগুলি যুগের প্রয়োজন?
- লুকানো স্তরে ইউনিটের সংখ্যা বাড়ানোর পরীক্ষা করুন।
- আমাদের যোগ করা প্রথম লুকানো স্তর এবং চূড়ান্ত আউটপুট স্তরের মধ্যে আরও লুকানো স্তর যুক্ত করার পরীক্ষা করুন। এই অতিরিক্ত স্তরগুলির কোডটি এরকম কিছু দেখা উচিত।
model.add(tf.layers.dense({units: 50, activation: 'sigmoid'}));
এই লুকানো স্তরগুলির সবচেয়ে গুরুত্বপূর্ণ নতুন বিষয় হল তারা একটি নন-লিনিয়ার অ্যাক্টিভেশন ফাংশন প্রবর্তন করে, এই ক্ষেত্রে সিগময়েড অ্যাক্টিভেশন। অ্যাক্টিভেশন ফাংশন সম্পর্কে আরও জানতে, এই নিবন্ধটি দেখুন ।
দেখুন তো, নিচের ছবির মতো মডেলটি আউটপুট তৈরি করতে পারে কিনা।
