নিচে একটি বেসিক নিউরাল নেটওয়ার্কের উদাহরণ দেওয়া হলো যা একটি ছোট ডেটাসেটের ওপর ভিত্তি করে তৈরি করা হয়েছে। আমরা Python এর Chainer লাইব্রেরি ব্যবহার করে এটি তৈরি করবো, যাতে আপনি Forward Propagation এবং Backward Propagation বোঝার জন্য কোড এবং তার সাথে ব্যাখ্যা দেখতে পারেন।
উদাহরণ: XOR ফাংশনের জন্য একটি নিউরাল নেটওয়ার্ক
আমরা এমন একটি নিউরাল নেটওয়ার্ক তৈরি করবো যা XOR ফাংশন (যেমন, দুটি ইনপুটের XOR আউটপুট) শিখতে পারবে। XOR ফাংশনের জন্য ইনপুট এবং আউটপুট এই রকমঃ
| Input (x1, x2) | Output (y) |
|---|---|
| (0, 0) | 0 |
| (0, 1) | 1 |
| (1, 0) | 1 |
| (1, 1) | 0 |
কোড
import chainer
import chainer.functions as F
import chainer.links as L
from chainer import Chain, optimizers, Variable
# ডেটাসেট ডিফাইন করা হচ্ছে
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [[0], [1], [1], [0]]
# বেসিক নিউরাল নেটওয়ার্ক ডিফাইন করা হচ্ছে
class XORNetwork(Chain):
def __init__(self):
super(XORNetwork, self).__init__()
# 2-ইনপুট এবং 3-হিডেন নিউরন
with self.init_scope():
self.l1 = L.Linear(2, 3) # হিডেন লেয়ার
self.l2 = L.Linear(3, 1) # আউটপুট লেয়ার
# Forward Propagation
def __call__(self, x):
h = F.sigmoid(self.l1(x)) # প্রথম লেয়ারের এক্টিভেশন
y = F.sigmoid(self.l2(h)) # দ্বিতীয় লেয়ারের এক্টিভেশন
return y
# মডেল, অপটিমাইজার সেটআপ করা হচ্ছে
model = XORNetwork()
optimizer = optimizers.SGD(lr=0.1)
optimizer.setup(model)
# প্রশিক্ষণ লুপ
epochs = 10000
for epoch in range(epochs):
loss = 0
for i in range(len(x_data)):
# ইনপুট ডেটা ভ্যারিয়েবল হিসেবে তৈরি
x = Variable(chainer.backends.cuda.to_cpu(x_data[i]))
y = Variable(chainer.backends.cuda.to_cpu(y_data[i]))
# Forward Propagation
y_pred = model(x)
# লস হিসাব করা হচ্ছে
loss += F.mean_squared_error(y_pred, y)
# Backward Propagation
model.cleargrads() # গ্রেডিয়েন্ট ক্লিয়ার করা হচ্ছে
loss.backward() # ব্যাকওয়ার্ড পাস
optimizer.update() # ওজন আপডেট
if epoch % 1000 == 0:
print(f'Epoch {epoch}, Loss: {loss.data}')
# পরীক্ষার জন্য মডেল চালানো
print("Testing the trained model:")
for x in x_data:
y_pred = model(Variable(chainer.backends.cuda.to_cpu(x)))
print(f'Input: {x}, Predicted Output: {y_pred.data > 0.5}') # >0.5 মানে 1, না হলে 0
ব্যাখ্যা
ডেটাসেট: x_data এবং y_data হলো ইনপুট এবং আউটপুট। এই ডেটা XOR ফাংশন শিখতে মডেলকে সাহায্য করবে।
মডেল নির্মাণ: XORNetwork নামে একটি ক্লাস তৈরি করা হয়েছে, যেখানে l1 হলো হিডেন লেয়ার (৩টি নিউরন সহ) এবং l2 হলো আউটপুট লেয়ার (১টি নিউরন সহ)।
Forward Propagation: __call__() মেথডে Forward Propagation সম্পন্ন হয়। প্রথম লেয়ারে ইনপুট পাস করার পর সিগময়েড ফাংশন ব্যবহার করা হয়েছে, যা এক্টিভেশন হিসেবে কাজ করে। এরপর দ্বিতীয় লেয়ারে পাস হয়ে আউটপুট তৈরি হয়।
Backward Propagation: loss.backward() ফাংশনটি গ্রেডিয়েন্ট হিসাব করে এবং optimizer.update() ফাংশনটি মডেলের ওজনগুলো আপডেট করে, যাতে লস কম হয়।
আউটপুট দেখা: প্রশিক্ষণ শেষে মডেলটিকে কিছু ইনপুট দিয়ে পরীক্ষা করা হয়েছে। যদি আউটপুট 0.5-এর বেশি হয়, তবে সেটিকে 1 এবং কম হলে 0 হিসাবে ধরেছি।
আউটপুট
প্রশিক্ষণের পরে মডেলটি XOR ফাংশন শিখে যাবে এবং আমরা নিচের মত আউটপুট পাবোঃ
Input: [0, 0], Predicted Output: False
Input: [0, 1], Predicted Output: True
Input: [1, 0], Predicted Output: True
Input: [1, 1], Predicted Output: False
এই উদাহরণটি দেখাচ্ছে কিভাবে Forward Propagation এবং Backward Propagation মিলে মডেলটিকে প্রশিক্ষণ দেয় এবং XOR ফাংশন শিখতে সহায়ক হয়।
Read more