থিয়ানো (Theano) এর মাধ্যমে একটি সিম্পল নিউরাল নেটওয়ার্ক তৈরি করা একটি চমৎকার উপায় হতে পারে ডিপ লার্নিং এবং নিউরাল নেটওয়ার্কের কাজ বুঝতে। নিচে একটি বেসিক নিউরাল নেটওয়ার্ক তৈরি করার প্রক্রিয়া দেওয়া হলো, যেখানে আমরা একটি সিম্পল লেয়ার ব্যবহার করব এবং গুণিতক রেট (Learning Rate) এবং অ্যাডাম অপটিমাইজার (Adam Optimizer) সহ ট্রেনিং করব।
প্রয়োজনীয় লাইব্রেরি ইনস্টলেশন:
প্রথমে, থিয়ানো এবং অন্যান্য প্রয়োজনীয় লাইব্রেরি ইনস্টল করতে হবে:
pip install theano numpy
সিম্পল নিউরাল নেটওয়ার্ক তৈরি (Theano):
এখানে আমরা একটি সিম্পল ফিডফরোয়ার্ড নিউরাল নেটওয়ার্ক তৈরি করব যা ইনপুট থেকে একটি একক আউটপুট ন্যূনতম ত্রুটি সহ প্রদান করবে।
ধাপ ১: প্রয়োজনীয় লাইব্রেরি ইম্পোর্ট করুন:
import numpy as np
import theano
import theano.tensor as T
ধাপ ২: ডেটা তৈরি করা:
এখানে আমরা একটি সিমুলেটেড ডেটাসেট তৈরি করব, যেখানে ইনপুট হবে দুটি ভেক্টর এবং আউটপুট হবে তাদের গুণফল।
# ইনপুট এবং আউটপুট ডেটা তৈরি করা
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y = np.array([[0], [1], [1], [0]], dtype=np.float32) # XOR গেট
ধাপ ৩: থিয়ানো টেনসর ডিফাইন করা:
# ইনপুট এবং আউটপুট টেনসর ডিফাইন করা
X_theano = T.matrix('X')
y_theano = T.matrix('y')
ধাপ ৪: নিউরাল নেটওয়ার্কের লেয়ার ডিফাইন করা:
এখানে আমরা একটি খুব সিম্পল নিউরাল নেটওয়ার্ক তৈরি করছি, যার মধ্যে ২টি লেয়ার থাকবে:
- একটি হিডেন লেয়ার (যার আউটপুট সিগময়েড অ্যাকটিভেশন ফাংশন ব্যবহার করবে)
- একটি আউটপুট লেয়ার (যার আউটপুট একটি সিগময়েড ফাংশন ব্যবহার করবে)
# হিডেন লেয়ার এবং আউটপুট লেয়ারের জন্য ওয়েট (weights) এবং বাইয়াস (bias) ডিফাইন করা
n_in = 2 # ইনপুট ডেটার আকার
n_hidden = 3 # হিডেন লেয়ারের নিউরনের সংখ্যা
n_out = 1 # আউটপুট নিউরন সংখ্যা
W1 = theano.shared(np.random.randn(n_in, n_hidden) * 0.1, name='W1') # হিডেন লেয়ারের জন্য ওয়েট
b1 = theano.shared(np.zeros(n_hidden), name='b1') # হিডেন লেয়ারের জন্য বাইয়াস
W2 = theano.shared(np.random.randn(n_hidden, n_out) * 0.1, name='W2') # আউটপুট লেয়ারের জন্য ওয়েট
b2 = theano.shared(np.zeros(n_out), name='b2') # আউটপুট লেয়ারের জন্য বাইয়াস
ধাপ ৫: মডেল তৈরি করা:
# হিডেন লেয়ারের অ্যাকটিভেশন
hidden_layer = T.nnet.sigmoid(T.dot(X_theano, W1) + b1)
# আউটপুট লেয়ারের অ্যাকটিভেশন
output_layer = T.nnet.sigmoid(T.dot(hidden_layer, W2) + b2)
ধাপ ৬: কস্ট ফাংশন (Cost Function) ডিফাইন করা:
আমরা বাইনারি ক্রস এন্ট্রপি লস (Binary Cross-Entropy Loss) ব্যবহার করব, যেটি আমাদের সমস্যার জন্য উপযুক্ত।
# কস্ট ফাংশন (লস ফাংশন)
cost = T.mean(T.nnet.binary_crossentropy(output_layer, y_theano))
ধাপ ৭: গ্রাডিয়েন্ট এবং আপডেটের নিয়ম (Gradient and Updates):
এখানে আমরা গ্রেডিয়েন্ট বেকপ্রোপাগেশন এবং SGD (Stochastic Gradient Descent) ব্যবহার করে আপডেট করব।
# গ্রাডিয়েন্ট গণনা
grad_W1, grad_b1, grad_W2, grad_b2 = T.grad(cost, [W1, b1, W2, b2])
# গ্রেডিয়েন্ট আপডেট
learning_rate = 0.1
updates = [(W1, W1 - learning_rate * grad_W1),
(b1, b1 - learning_rate * grad_b1),
(W2, W2 - learning_rate * grad_W2),
(b2, b2 - learning_rate * grad_b2)]
ধাপ ৮: থিয়ানো ফাংশন তৈরি করা (Training Function):
# ট্রেনিং ফাংশন
train_model = theano.function(
inputs=[X_theano, y_theano],
outputs=cost,
updates=updates
)
ধাপ ৯: মডেল ট্রেনিং:
এখানে আমরা ১০০০ ইটারেশন (Epochs) পর্যন্ত মডেলটিকে ট্রেনিং দেব এবং প্রতিটি ইটারেশনে কস্ট (লস) মূল্য পরিমাপ করব।
# মডেল ট্রেনিং
for epoch in range(1000):
cost_value = train_model(X, y)
if epoch % 100 == 0:
print(f'Epoch {epoch}, Cost: {cost_value}')
ধাপ ১০: মডেল মূল্যায়ন:
ট্রেনিংয়ের পর মডেলটি ইনপুটের উপর ভিত্তি করে আউটপুট দিতে সক্ষম হবে। আমরা পরীক্ষামূলকভাবে এটি যাচাই করতে পারি।
# আউটপুট পরীক্ষা
predictions = output_layer.eval({X_theano: X})
print(predictions)
সারাংশ:
এটি একটি সিম্পল ফিডফরোয়ার্ড নিউরাল নেটওয়ার্ক যা XOR সমস্যা সমাধান করে। এখানে আমরা Theano ব্যবহার করে নিউরাল নেটওয়ার্কের জন্য ওয়েট, বাইয়াস, এ্যাকটিভেশন ফাংশন এবং গ্রাডিয়েন্ট বেকপ্রোপাগেশন প্রক্রিয়া তৈরি করেছি।
- আমরা স্টোকাস্টিক গ্র্যাডিয়েন্ট ডিসেন্ট (SGD) ব্যবহার করে কস্ট ফাংশন অপটিমাইজ করেছি।
- Sigmoid অ্যাকটিভেশন ফাংশন ব্যবহার করা হয়েছে এবং একটি Binary Cross-Entropy কস্ট ফাংশন ব্যবহার করা হয়েছে, যা বাইনারি আউটপুটের জন্য উপযুক্ত।
এই প্রক্রিয়াটি কেবল একেবারে মৌলিক এবং শিক্ষামূলক উদ্দেশ্যে তৈরি করা হয়েছে, এবং বাস্তব জীবনের সমস্যাগুলির জন্য আরো জটিল এবং উন্নত মডেলগুলি তৈরি করতে হবে।
Read more