টেনসর (Tensor) হল একটি মৌলিক গাণিতিক গঠন যা থিয়ানো, PyTorch, TensorFlow এর মতো লাইব্রেরি গুলিতে ডিপ লার্নিং এবং গাণিতিক কম্পিউটেশন কার্যক্রমে ব্যবহৃত হয়। টেনসরগুলি মূলত মাল্টি-ডাইমেনশনাল অ্যারে (Multi-dimensional array) হিসেবে কাজ করে এবং Indexing, Slicing, এবং Broadcasting এর মাধ্যমে তাদের উপাদানগুলির সাথে কাজ করা যায়। এই ধারণাগুলি বিশেষভাবে ডিপ লার্নিং মডেলগুলির প্রশিক্ষণ এবং বিশ্লেষণের জন্য গুরুত্বপূর্ণ।
১. টেনসর Indexing
টেনসর Indexing এর মাধ্যমে নির্দিষ্ট উপাদান (element) বা উপাদানগুলোর সাবসেট (subset) অ্যাক্সেস করা যায়। এটি একক উপাদান থেকে শুরু করে, একাধিক উপাদান বা সেগমেন্ট পর্যন্ত কাজ করতে পারে।
উদাহরণ:
ধরা যাক, আমাদের একটি 2D টেনসর (ম্যাট্রিক্স) আছে:
import numpy as np
tensor = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
এখন, বিভিন্ন ধরনের Indexing করা যেতে পারে:
একটি নির্দিষ্ট উপাদান অ্যাক্সেস:
- [row, column] এর মাধ্যমে আমরা নির্দিষ্ট উপাদান অ্যাক্সেস করতে পারি:
print(tensor[1, 2]) # আউটপুট: 6 (দ্বিতীয় রো, তৃতীয় কলাম)একটি রো (Row) নির্বাচন করা:
- নির্দিষ্ট রো অ্যাক্সেস করতে:
print(tensor[0]) # আউটপুট: [1 2 3] (প্রথম রো)একটি কলাম (Column) নির্বাচন করা:
- কলাম নির্বাচনের জন্য:
print(tensor[:, 1]) # আউটপুট: [2 5 8] (দ্বিতীয় কলাম)
২. টেনসর Slicing
Slicing এর মাধ্যমে টেনসর থেকে একাধিক উপাদান একত্রে নির্বাচন করা সম্ভব। এটি ঠিক একটি সেগমেন্ট (sub-array) নির্বাচনের মতো কাজ করে, যেখানে আপনি শুরু এবং শেষ ইনডেক্স নির্ধারণ করতে পারেন।
উদাহরণ:
একটি সাবসেট নির্বাচন:
- টেনসরের একটি নির্দিষ্ট অংশ বা সেগমেন্ট নির্বাচন করতে স্লাইস ব্যবহার করা হয়:
print(tensor[0:2, 1:3]) # আউটপুট: [[2 3] [5 6]] (প্রথম দুটি রো এবং দ্বিতীয় ও তৃতীয় কলাম)কলামগুলোর স্লাইসিং:
- স্লাইসিংয়ের মাধ্যমে একটি কলামের অংশ নির্বাচন করা:
print(tensor[:, 0:2]) # আউটপুট: [[1 2] [4 5] [7 8]] (প্রথম দুটি কলাম)সব রো এবং কলাম সিলেক্ট করা:
- পুরো টেনসর নির্বাচনের জন্য:
print(tensor[:]) # আউটপুট: [[1 2 3] [4 5 6] [7 8 9]] (পুরো টেনসর)
৩. টেনসর Broadcasting
Broadcasting হল একটি শক্তিশালী বৈশিষ্ট্য যা কমপ্লেক্স অপারেশনগুলির জন্য ব্যবহার করা হয়, যেমন ছোট আকারের টেনসরের উপাদানগুলিকে বড় আকারের টেনসরের সাথে প্রয়োগ করা। এটি টেনসরের আকারের অমিল থাকা সত্ত্বেও উপাদানগুলোকে একসাথে অপারেট করতে সাহায্য করে।
উদাহরণ:
ধরা যাক, আমাদের একটি 2D টেনসর এবং একটি 1D টেনসর আছে:
import numpy as np
tensor2d = np.array([[1, 2, 3], [4, 5, 6]])
tensor1d = np.array([10, 20, 30])
এখন, broadcasting এর মাধ্যমে আমরা এই দুইটি টেনসরের উপর অপারেশন করতে পারব:
অপারেশন চালানো (Broadcasting):
tensor1dকেtensor2dএর সাথে যোগ করা, এখানেtensor1dএর আকার 1D হলেও এটি broadcast হয়েtensor2dএর সাথে যোগ হবে:
result = tensor2d + tensor1d print(result) # আউটপুট: [[11 22 33] [14 25 36]]একটি স্কালার যোগ করা:
- আপনি broadcasting ব্যবহার করে একটি স্কালার মানকে সমস্ত উপাদানে যোগ করতে পারেন:
result = tensor2d + 5 print(result) # আউটপুট: [[6 7 8] [9 10 11]]
Broadcasting এর কাজের প্রক্রিয়া:
- একই আকারের টেনসর: যদি দুইটি টেনসরের আকার একই হয়, তবে সহজেই তাদের সাথে অপারেশন করা যায়।
- একটি টেনসর বড় এবং অন্যটি ছোট: যদি একটি টেনসর বড় এবং অন্যটি ছোট হয় (যেমন 1D টেনসর আর 2D টেনসর), তবে ছোট টেনসরটির আকার বড় টেনসরের আকারে সম্প্রসারিত হয়, তবে তাদের মধ্যে একই উপাদান রেখে।
টেনসর Broadcasting এর নিয়মাবলী:
- যদি আকার একে অপরের সাথে সামঞ্জস্যপূর্ণ না হয়, তবে সবচেয়ে ছোট আকার সম্প্রসারিত হয়।
- এটি শুধুমাত্র তখন কাজ করে যখন একটি টেনসরের আকার একটির সাথে আরেকটি টেনসরের আকারের সাথে মিলে যায়।
সারাংশ:
- Indexing: নির্দিষ্ট উপাদান বা অংশ নির্বাচন করার জন্য ব্যবহৃত হয়।
- Slicing: টেনসরের একাধিক উপাদান বা সেগমেন্ট নির্বাচনের জন্য ব্যবহৃত হয়।
- Broadcasting: একটি ছোট টেনসরকে একটি বড় টেনসরের সাথে সঠিকভাবে সমন্বয় করার প্রক্রিয়া, যাতে অপারেশনগুলো কার্যকরভাবে সম্পন্ন করা যায়।
এই তিনটি ধারণা ডিপ লার্নিং মডেল তৈরিতে খুবই গুরুত্বপূর্ণ, কারণ আপনি বিভিন্ন আকারের টেনসরের সাথে অপারেশন করার মাধ্যমে মডেল প্রশিক্ষণ, ডাটা প্রসেসিং এবং বিভিন্ন ক্যালকুলেশন করতে পারবেন।
Read more