1. ভূমিকা
এই কোডল্যাবে, আপনি একটি অডিও রিকগনিশন নেটওয়ার্ক তৈরি করবেন এবং এটি ব্যবহার করে ব্রাউজারে শব্দ তৈরি করে একটি স্লাইডার নিয়ন্ত্রণ করবেন। আপনি TensorFlow.js ব্যবহার করবেন, যা জাভাস্ক্রিপ্টের জন্য একটি শক্তিশালী এবং নমনীয় মেশিন লার্নিং লাইব্রেরি।
প্রথমে, আপনি একটি পূর্ব-প্রশিক্ষিত মডেল লোড করবেন এবং চালাবেন যা ২০টি স্পিচ কমান্ড চিনতে পারে। তারপর আপনার মাইক্রোফোন ব্যবহার করে, আপনি একটি সহজ নিউরাল নেটওয়ার্ক তৈরি এবং প্রশিক্ষণ দেবেন যা আপনার শব্দ চিনতে পারে এবং স্লাইডারটিকে বাম বা ডানে যেতে সাহায্য করে।
এই কোডল্যাবটি অডিও রিকগনিশন মডেলের পিছনের তত্ত্ব নিয়ে আলোচনা করবে না । যদি আপনি এটি সম্পর্কে আগ্রহী হন, তাহলে এই টিউটোরিয়ালটি দেখুন।
আমরা মেশিন লার্নিং শব্দের একটি শব্দকোষও তৈরি করেছি যা আপনি এই কোডল্যাবে পাবেন।
তুমি কি শিখবে
- কিভাবে একটি প্রাক-প্রশিক্ষিত স্পিচ কমান্ড স্বীকৃতি মডেল লোড করবেন
- মাইক্রোফোন ব্যবহার করে কীভাবে রিয়েল-টাইম ভবিষ্যদ্বাণী করা যায়
- ব্রাউজার মাইক্রোফোন ব্যবহার করে কীভাবে একটি কাস্টম অডিও স্বীকৃতি মডেল প্রশিক্ষণ এবং ব্যবহার করবেন
তো শুরু করা যাক।
2. প্রয়োজনীয়তা
এই কোডল্যাবটি সম্পূর্ণ করতে, আপনার প্রয়োজন হবে:
- Chrome অথবা অন্য কোন আধুনিক ব্রাউজারের সাম্প্রতিক সংস্করণ।
- একটি টেক্সট এডিটর, যা আপনার মেশিনে স্থানীয়ভাবে চলবে অথবা ওয়েবে কোডপেন বা গ্লিচের মতো কিছুর মাধ্যমে চলবে।
- HTML, CSS, JavaScript, এবং Chrome DevTools (অথবা আপনার পছন্দের ব্রাউজার devtools) সম্পর্কে জ্ঞান থাকতে হবে।
- নিউরাল নেটওয়ার্ক সম্পর্কে উচ্চ-স্তরের ধারণাগত ধারণা। যদি আপনার ভূমিকা বা রিফ্রেশারের প্রয়োজন হয়, তাহলে 3blue1brown-এর এই ভিডিওটি অথবা Ashi Krishnan-এর জাভাস্ক্রিপ্টে গভীর শিক্ষার উপর এই ভিডিওটি দেখার কথা বিবেচনা করুন।
৩. TensorFlow.js এবং অডিও মডেল লোড করুন
একটি এডিটরে index.html খুলুন এবং এই কন্টেন্টটি যোগ করুন:
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/speech-commands"></script>
</head>
<body>
<div id="console"></div>
<script src="index.js"></script>
</body>
</html>
প্রথম <script> ট্যাগটি TensorFlow.js লাইব্রেরি আমদানি করে এবং দ্বিতীয় <script> টি পূর্ব-প্রশিক্ষিত Speech Commands মডেল আমদানি করে। <div id="console"> ট্যাগটি মডেলের আউটপুট প্রদর্শন করতে ব্যবহৃত হবে।
৪. রিয়েল-টাইমে ভবিষ্যদ্বাণী করুন
এরপর, একটি কোড এডিটরে index.js ফাইলটি খুলুন/তৈরি করুন, এবং নিম্নলিখিত কোডটি অন্তর্ভুক্ত করুন:
let recognizer;
function predictWord() {
// Array of words that the recognizer is trained to recognize.
const words = recognizer.wordLabels();
recognizer.listen(({scores}) => {
// Turn scores into a list of (score,word) pairs.
scores = Array.from(scores).map((s, i) => ({score: s, word: words[i]}));
// Find the most probable word.
scores.sort((s1, s2) => s2.score - s1.score);
document.querySelector('#console').textContent = scores[0].word;
}, {probabilityThreshold: 0.75});
}
async function app() {
recognizer = speechCommands.create('BROWSER_FFT');
await recognizer.ensureModelLoaded();
predictWord();
}
app();
৫. ভবিষ্যদ্বাণী পরীক্ষা করুন
আপনার ডিভাইসে মাইক্রোফোন আছে কিনা তা নিশ্চিত করুন। এটি লক্ষণীয় যে এটি মোবাইল ফোনেও কাজ করবে! ওয়েবপৃষ্ঠাটি চালানোর জন্য, একটি ব্রাউজারে index.html খুলুন। আপনি যদি একটি স্থানীয় ফাইল থেকে কাজ করেন, তাহলে মাইক্রোফোন অ্যাক্সেস করার জন্য আপনাকে একটি ওয়েব সার্ভার শুরু করতে হবে এবং http://localhost:port/ ব্যবহার করতে হবে।
পোর্ট ৮০০০-এ একটি সাধারণ ওয়েবসার্ভার শুরু করতে:
python -m SimpleHTTPServer
মডেলটি ডাউনলোড করতে কিছুটা সময় লাগতে পারে, তাই ধৈর্য ধরুন। মডেলটি লোড হওয়ার সাথে সাথেই আপনি পৃষ্ঠার উপরে একটি শব্দ দেখতে পাবেন। মডেলটিকে 0 থেকে 9 সংখ্যা এবং "বাম", "ডান", "হ্যাঁ", "না" ইত্যাদির মতো কিছু অতিরিক্ত কমান্ড চিনতে প্রশিক্ষণ দেওয়া হয়েছিল।
এই শব্দগুলির মধ্যে একটি বলুন। এটি কি আপনার কথাটি সঠিকভাবে বুঝতে পেরেছে? probabilityThreshold দিয়ে খেলুন যা মডেলটি কতবার ফায়ার করবে তা নিয়ন্ত্রণ করে - 0.75 এর অর্থ হল মডেলটি তখনই ফায়ার করবে যখন এটি 75% এর বেশি আত্মবিশ্বাসী যে এটি একটি নির্দিষ্ট শব্দ শুনেছে।
স্পিচ কমান্ড মডেল এবং এর API সম্পর্কে আরও জানতে, Github-এর README.md দেখুন।
৬. তথ্য সংগ্রহ করুন
মজাদার করার জন্য, স্লাইডারটি নিয়ন্ত্রণ করতে পুরো শব্দের পরিবর্তে ছোট শব্দ ব্যবহার করা যাক!
তুমি একটি মডেলকে ৩টি ভিন্ন কমান্ড চিনতে শেখাবে: "Left", "Right" এবং "Noise" যার ফলে স্লাইডারটি বাম বা ডানে সরবে। "Noise" (কোনও পদক্ষেপের প্রয়োজন নেই) চিনতে পারা বক্তৃতা সনাক্তকরণে অত্যন্ত গুরুত্বপূর্ণ কারণ আমরা চাই স্লাইডারটি কেবল তখনই প্রতিক্রিয়া জানাক যখন আমরা সঠিক শব্দ তৈরি করি, যখন আমরা সাধারণত কথা বলি এবং ঘোরাঘুরি করি তখন নয়।
- প্রথমে আমাদের ডেটা সংগ্রহ করতে হবে।
<div id="console">এর আগে<body>ট্যাগের ভিতরে এটি যোগ করে অ্যাপটিতে একটি সহজ UI যোগ করুন:
<button id="left" onmousedown="collect(0)" onmouseup="collect(null)">Left</button>
<button id="right" onmousedown="collect(1)" onmouseup="collect(null)">Right</button>
<button id="noise" onmousedown="collect(2)" onmouseup="collect(null)">Noise</button>
- এটি
index.jsএ যোগ করুন:
// One frame is ~23ms of audio.
const NUM_FRAMES = 3;
let examples = [];
function collect(label) {
if (recognizer.isListening()) {
return recognizer.stopListening();
}
if (label == null) {
return;
}
recognizer.listen(async ({spectrogram: {frameSize, data}}) => {
let vals = normalize(data.subarray(-frameSize * NUM_FRAMES));
examples.push({vals, label});
document.querySelector('#console').textContent =
`${examples.length} examples collected`;
}, {
overlapFactor: 0.999,
includeSpectrogram: true,
invokeCallbackOnNoiseAndUnknown: true
});
}
function normalize(x) {
const mean = -100;
const std = 10;
return x.map(x => (x - mean) / std);
}
-
app()থেকেpredictWord()সরান:
async function app() {
recognizer = speechCommands.create('BROWSER_FFT');
await recognizer.ensureModelLoaded();
// predictWord() no longer called.
}
ভেঙে ফেলা
এই কোডটি প্রথমে অপ্রতিরোধ্য হতে পারে, তাই আসুন এটি ভেঙে ফেলা যাক।
আমরা আমাদের UI তে "Left", "Right" এবং "Noise" লেবেলযুক্ত তিনটি বোতাম যুক্ত করেছি, যা আমাদের মডেলকে চিনতে চাওয়া তিনটি কমান্ডের সাথে সঙ্গতিপূর্ণ। এই বোতামগুলি টিপলে আমাদের নতুন যোগ করা collect() ফাংশনটি কল হয়, যা আমাদের মডেলের জন্য প্রশিক্ষণের উদাহরণ তৈরি করে।
collect() recognizer.listen() এর আউটপুটের সাথে একটি label সংযুক্ত করে। যেহেতু includeSpectrogram সত্য , recognizer.listen() 1 সেকেন্ডের অডিওর জন্য raw spectrogram (ফ্রিকোয়েন্সি ডেটা) দেয়, যা 43টি ফ্রেমে বিভক্ত, তাই প্রতিটি ফ্রেম ~23ms অডিও:
recognizer.listen(async ({spectrogram: {frameSize, data}}) => {
...
}, {includeSpectrogram: true});
যেহেতু আমরা স্লাইডার নিয়ন্ত্রণের জন্য শব্দের পরিবর্তে ছোট শব্দ ব্যবহার করতে চাই, তাই আমরা শুধুমাত্র শেষ 3টি ফ্রেম (~70ms) বিবেচনা করছি:
let vals = normalize(data.subarray(-frameSize * NUM_FRAMES));
এবং সংখ্যাগত সমস্যা এড়াতে, আমরা ডেটাকে স্বাভাবিক করি যাতে গড় 0 এবং একটি আদর্শ বিচ্যুতি 1 থাকে। এই ক্ষেত্রে, বর্ণালীগ্রামের মানগুলি সাধারণত -100 এর কাছাকাছি বড় ঋণাত্মক সংখ্যা এবং 10 এর বিচ্যুতি হয়:
const mean = -100;
const std = 10;
return x.map(x => (x - mean) / std);
অবশেষে, প্রতিটি প্রশিক্ষণ উদাহরণে 2টি ক্ষেত্র থাকবে:
-
label****: "বাম", "ডান" এবং "নয়েজ" এর জন্য যথাক্রমে 0, 1, এবং 2। -
vals****: ফ্রিকোয়েন্সি তথ্য ধারণকারী 696 সংখ্যা (স্পেকট্রোগ্রাম)
এবং আমরা সমস্ত ডেটা examples variable-এ সংরক্ষণ করি:
examples.push({vals, label});
৭. পরীক্ষার তথ্য সংগ্রহ
একটি ব্রাউজারে index.html খুলুন, এবং আপনি 3 টি কমান্ডের সাথে সম্পর্কিত 3 টি বোতাম দেখতে পাবেন। যদি আপনি একটি স্থানীয় ফাইল থেকে কাজ করেন, তাহলে মাইক্রোফোন অ্যাক্সেস করার জন্য আপনাকে একটি ওয়েব সার্ভার শুরু করতে হবে এবং http://localhost:port/ ব্যবহার করতে হবে।
পোর্ট ৮০০০-এ একটি সাধারণ ওয়েবসার্ভার শুরু করতে:
python -m SimpleHTTPServer
প্রতিটি কমান্ডের উদাহরণ সংগ্রহ করতে, প্রতিটি বোতাম ৩-৪ সেকেন্ড ধরে টিপে ধরে রেখে বারবার (অথবা একটানা) একটি ধারাবাহিক শব্দ করুন। প্রতিটি লেবেলের জন্য আপনার প্রায় ১৫০টি উদাহরণ সংগ্রহ করা উচিত। উদাহরণস্বরূপ, আমরা "বাম" শব্দের জন্য আঙুল বাজাতে পারি, "ডান" শব্দের জন্য বাঁশি বাজাতে পারি এবং "নয়েজ" শব্দের জন্য নীরবতা এবং কথা বলার মধ্যে বিকল্প করতে পারি।
যত বেশি উদাহরণ সংগ্রহ করবেন, পৃষ্ঠায় দেখানো কাউন্টারটি উপরে উঠবে। কনসোলের examples ভেরিয়েবলে console.log() কল করে ডেটা পরীক্ষা করতে দ্বিধা করবেন না। এই মুহুর্তে লক্ষ্য হল ডেটা সংগ্রহ প্রক্রিয়া পরীক্ষা করা। পরে আপনি যখন পুরো অ্যাপটি পরীক্ষা করবেন তখন ডেটা পুনরায় সংগ্রহ করবেন।
৮. একজন মডেলকে প্রশিক্ষণ দিন
- index.html এর বডিতে " Noise " বোতামের ঠিক পরে একটি " Train " বোতাম যোগ করুন :
<br/><br/>
<button id="train" onclick="train()">Train</button>
- index.js- এ বিদ্যমান কোডে নিম্নলিখিতটি যোগ করুন:
const INPUT_SHAPE = [NUM_FRAMES, 232, 1];
let model;
async function train() {
toggleButtons(false);
const ys = tf.oneHot(examples.map(e => e.label), 3);
const xsShape = [examples.length, ...INPUT_SHAPE];
const xs = tf.tensor(flatten(examples.map(e => e.vals)), xsShape);
await model.fit(xs, ys, {
batchSize: 16,
epochs: 10,
callbacks: {
onEpochEnd: (epoch, logs) => {
document.querySelector('#console').textContent =
`Accuracy: ${(logs.acc * 100).toFixed(1)}% Epoch: ${epoch + 1}`;
}
}
});
tf.dispose([xs, ys]);
toggleButtons(true);
}
function buildModel() {
model = tf.sequential();
model.add(tf.layers.depthwiseConv2d({
depthMultiplier: 8,
kernelSize: [NUM_FRAMES, 3],
activation: 'relu',
inputShape: INPUT_SHAPE
}));
model.add(tf.layers.maxPooling2d({poolSize: [1, 2], strides: [2, 2]}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 3, activation: 'softmax'}));
const optimizer = tf.train.adam(0.01);
model.compile({
optimizer,
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
}
function toggleButtons(enable) {
document.querySelectorAll('button').forEach(b => b.disabled = !enable);
}
function flatten(tensors) {
const size = tensors[0].length;
const result = new Float32Array(tensors.length * size);
tensors.forEach((arr, i) => result.set(arr, i * size));
return result;
}
- অ্যাপটি লোড হলে
buildModel()কল করুন:
async function app() {
recognizer = speechCommands.create('BROWSER_FFT');
await recognizer.ensureModelLoaded();
// Add this line.
buildModel();
}
এই মুহুর্তে যদি আপনি অ্যাপটি রিফ্রেশ করেন তবে আপনি একটি নতুন " ট্রেন " বোতাম দেখতে পাবেন। আপনি ডেটা পুনরায় সংগ্রহ করে এবং "ট্রেন" ক্লিক করে প্রশিক্ষণ পরীক্ষা করতে পারেন, অথবা আপনি ভবিষ্যদ্বাণী সহ প্রশিক্ষণ পরীক্ষা করার জন্য ধাপ 10 পর্যন্ত অপেক্ষা করতে পারেন।
ভেঙে ফেলা
উচ্চ স্তরে আমরা দুটি কাজ করছি: buildModel() মডেল আর্কিটেকচার সংজ্ঞায়িত করে এবং train() সংগৃহীত ডেটা ব্যবহার করে মডেলটিকে প্রশিক্ষণ দেয়।
মডেল স্থাপত্য
মডেলটিতে ৪টি স্তর রয়েছে: একটি কনভ্যুলশনাল স্তর যা অডিও ডেটা প্রক্রিয়া করে (একটি স্পেকট্রোগ্রাম হিসাবে উপস্থাপিত), একটি ম্যাক্স পুল স্তর, একটি সমতল স্তর এবং একটি ঘন স্তর যা ৩টি ক্রিয়াকে ম্যাপ করে:
model = tf.sequential();
model.add(tf.layers.depthwiseConv2d({
depthMultiplier: 8,
kernelSize: [NUM_FRAMES, 3],
activation: 'relu',
inputShape: INPUT_SHAPE
}));
model.add(tf.layers.maxPooling2d({poolSize: [1, 2], strides: [2, 2]}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 3, activation: 'softmax'}));
মডেলটির ইনপুট আকৃতি হল [NUM_FRAMES, 232, 1] যেখানে প্রতিটি ফ্রেমে 23ms অডিও থাকে যার মধ্যে 232টি সংখ্যা থাকে যা বিভিন্ন ফ্রিকোয়েন্সির সাথে সঙ্গতিপূর্ণ (232টি বেছে নেওয়া হয়েছিল কারণ এটি মানুষের কণ্ঠস্বর ক্যাপচার করার জন্য প্রয়োজনীয় ফ্রিকোয়েন্সি বাকেটের পরিমাণ)। এই কোডল্যাবে, আমরা 3 ফ্রেম লম্বা নমুনা (~70ms নমুনা) ব্যবহার করছি কারণ আমরা স্লাইডার নিয়ন্ত্রণ করতে পুরো শব্দ বলার পরিবর্তে শব্দ তৈরি করছি।
প্রশিক্ষণের জন্য প্রস্তুত করার জন্য আমরা আমাদের মডেলটি সংকলন করি:
const optimizer = tf.train.adam(0.01);
model.compile({
optimizer,
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
আমরা অ্যাডাম অপ্টিমাইজার ব্যবহার করি, যা গভীর শিক্ষায় ব্যবহৃত একটি সাধারণ অপ্টিমাইজার, এবং ক্ষতির জন্য categoricalCrossEntropy , শ্রেণীবিভাগের জন্য ব্যবহৃত স্ট্যান্ডার্ড ক্ষতি ফাংশন। সংক্ষেপে, এটি পরিমাপ করে যে ভবিষ্যদ্বাণী করা সম্ভাব্যতা (প্রতি শ্রেণীতে একটি সম্ভাব্যতা) সত্য শ্রেণীতে 100% সম্ভাব্যতা এবং অন্যান্য সমস্ত শ্রেণীর জন্য 0% সম্ভাব্যতা থেকে কত দূরে। আমরা নিরীক্ষণের জন্য একটি মেট্রিক হিসাবে accuracy প্রদান করি, যা আমাদের প্রশিক্ষণের প্রতিটি যুগের পরে মডেলটি কত শতাংশ উদাহরণ সঠিক করে তা দেবে।
প্রশিক্ষণ
প্রশিক্ষণটি ১৬টি ব্যাচের আকার (একসাথে ১৬টি উদাহরণ প্রক্রিয়াকরণ) ব্যবহার করে ডেটার উপর ১০ বার (পর্ব) যায় এবং UI-তে বর্তমান নির্ভুলতা দেখায়:
await model.fit(xs, ys, {
batchSize: 16,
epochs: 10,
callbacks: {
onEpochEnd: (epoch, logs) => {
document.querySelector('#console').textContent =
`Accuracy: ${(logs.acc * 100).toFixed(1)}% Epoch: ${epoch + 1}`;
}
}
});
৯. রিয়েল-টাইমে স্লাইডার আপডেট করুন
এখন যেহেতু আমরা আমাদের মডেলটিকে প্রশিক্ষণ দিতে পারি, আসুন রিয়েল-টাইমে ভবিষ্যদ্বাণী করার জন্য কোড যোগ করি এবং স্লাইডারটি সরান। index.html- এ " Train " বোতামের ঠিক পরে এটি যোগ করুন:
<br/><br/>
<button id="listen" onclick="listen()">Listen</button>
<input type="range" id="output" min="0" max="10" step="0.1">
এবং index.js- এ নিম্নলিখিতগুলি:
async function moveSlider(labelTensor) {
const label = (await labelTensor.data())[0];
document.getElementById('console').textContent = label;
if (label == 2) {
return;
}
let delta = 0.1;
const prevValue = +document.getElementById('output').value;
document.getElementById('output').value =
prevValue + (label === 0 ? -delta : delta);
}
function listen() {
if (recognizer.isListening()) {
recognizer.stopListening();
toggleButtons(true);
document.getElementById('listen').textContent = 'Listen';
return;
}
toggleButtons(false);
document.getElementById('listen').textContent = 'Stop';
document.getElementById('listen').disabled = false;
recognizer.listen(async ({spectrogram: {frameSize, data}}) => {
const vals = normalize(data.subarray(-frameSize * NUM_FRAMES));
const input = tf.tensor(vals, [1, ...INPUT_SHAPE]);
const probs = model.predict(input);
const predLabel = probs.argMax(1);
await moveSlider(predLabel);
tf.dispose([input, probs, predLabel]);
}, {
overlapFactor: 0.999,
includeSpectrogram: true,
invokeCallbackOnNoiseAndUnknown: true
});
}
ভেঙে ফেলা
রিয়েল-টাইম ভবিষ্যদ্বাণী
listen() মাইক্রোফোনের কথা শোনে এবং রিয়েল টাইম ভবিষ্যদ্বাণী করে। কোডটি collect() পদ্ধতির সাথে খুব মিল, যা raw spectrogram কে স্বাভাবিক করে এবং শেষ NUM_FRAMES ফ্রেম ছাড়া বাকি সবগুলো ড্রপ করে। একমাত্র পার্থক্য হল আমরা ভবিষ্যদ্বাণী পেতে প্রশিক্ষিত মডেলকেও কল করি:
const probs = model.predict(input);
const predLabel = probs.argMax(1);
await moveSlider(predLabel);
model.predict(input) এর আউটপুট হল আকৃতির একটি টেনসর [1, numClasses] যা ক্লাসের সংখ্যার উপর সম্ভাব্যতা বন্টনকে প্রতিনিধিত্ব করে। আরও সহজভাবে বলতে গেলে, এটি প্রতিটি সম্ভাব্য আউটপুট ক্লাসের জন্য কেবল কনফিডেন্সের একটি সেট যার যোগফল 1। টেনসরের একটি বাহ্যিক মাত্রা 1 কারণ এটি ব্যাচের আকার (একটি একক উদাহরণ)।
সম্ভাব্যতা বন্টনকে সর্বাধিক সম্ভাব্য শ্রেণীর প্রতিনিধিত্বকারী একটি একক পূর্ণসংখ্যায় রূপান্তর করতে, আমরা probs.argMax(1) কল করি যা সর্বোচ্চ সম্ভাব্যতা সহ ক্লাস সূচক প্রদান করে। আমরা অক্ষ প্যারামিটার হিসাবে "1" পাস করি কারণ আমরা শেষ মাত্রা, numClasses এর উপর argMax গণনা করতে চাই।
স্লাইডার আপডেট করা হচ্ছে
লেবেল 0 ("Left") হলে moveSlider() স্লাইডারের মান হ্রাস করে, লেবেল 1 ("Right") হলে বৃদ্ধি করে এবং লেবেল 2 ("Noise") হলে উপেক্ষা করে।
টেনসর নিষ্পত্তি করা হচ্ছে
GPU মেমোরি পরিষ্কার করার জন্য আমাদের আউটপুট টেনসরগুলিতে tf.dispose() ম্যানুয়ালি কল করা গুরুত্বপূর্ণ। ম্যানুয়াল tf.dispose() এর বিকল্প হল ফাংশন কলগুলিকে tf.tidy() তে মোড়ানো, তবে এটি অ্যাসিঙ্ক ফাংশনের সাথে ব্যবহার করা যাবে না।
tf.dispose([input, probs, predLabel]);
১০. চূড়ান্ত অ্যাপটি পরীক্ষা করুন
আপনার ব্রাউজারে index.html খুলুন এবং আগের বিভাগে যেমনটি করেছিলেন, তেমনই ৩টি কমান্ডের সাথে সম্পর্কিত ৩টি বোতাম ব্যবহার করে ডেটা সংগ্রহ করুন। ডেটা সংগ্রহ করার সময় প্রতিটি বোতাম ৩-৪ সেকেন্ড ধরে রাখতে ভুলবেন না।
একবার আপনি উদাহরণ সংগ্রহ করার পরে, "প্রশিক্ষণ দিন" বোতামটি টিপুন। এটি মডেলটিকে প্রশিক্ষণ দেওয়া শুরু করবে এবং আপনি দেখতে পাবেন যে মডেলটির নির্ভুলতা 90% এর উপরে চলে গেছে। যদি আপনি ভাল মডেল পারফরম্যান্স অর্জন না করেন, তাহলে আরও তথ্য সংগ্রহ করার চেষ্টা করুন।
প্রশিক্ষণ শেষ হয়ে গেলে, মাইক্রোফোন থেকে ভবিষ্যদ্বাণী করতে এবং স্লাইডারটি নিয়ন্ত্রণ করতে "শুনুন" বোতাম টিপুন!
আরও টিউটোরিয়াল দেখুন http://js.tensorflow.org/ এ।