নিউরাল নেটওয়ার্ক গভীর শেখার (deep learning) অত্যন্ত গুরুত্বপূর্ণ মূল অংশ; এর অনেক ব্যবহারিক অ্যাপ্লিকেশন আছে বিভিন্ন ক্ষেত্রে। আজকাল এই নেটওয়ার্কগুলো চিত্র শ্রেণিবিন্যাস, বাক্যাবলী স্বীকৃতি, বস্তু সনাক্তকরণ ইত্যাদিতে ব্যবহৃত হচ্ছে।
চলুন বুঝি এটি কী এবং কীভাবে কাজ করে?
এই নেটওয়ার্কের বিভিন্ন উপাদান রয়েছে। সেগুলো হলো:
- একটি ইনপুট লেয়ার, x
- যতকিছু হিডেন লেয়ার
- একটি আউটপুট লেয়ার, ŷ
- প্রতিটি লেয়ারের মধ্যে ওয়েট এবং বায়াসের একটি সেট যা W এবং b দ্বারা সংজ্ঞায়িত
- প্রতিটি হিডেন লেয়ারের জন্য অ্যাক্টিভেশন ফাংশনের পছন্দ, σ।
এই ডায়াগ্রামে ২-লেয়ারের নিউরাল নেটওয়ার্ক দেখানো হয়েছে (ইনপুট লেয়ার সাধারণত নিউরাল নেটওয়ার্কের লেয়ার গণনায় অন্তর্ভুক্ত করা হয় না)।

এই গ্রাফে বৃত্তগুলো নিউরনকে এবং রেখাগুলো সিন্যাপসকে প্রতীকী করছে। সিন্যাপসগুলো ইনপুট এবং ওয়েট গুণ করতে ব্যবহৃত হয়। ওয়েটকে নিউরনগুলোর মধ্যে সংযোগের "শক্তি" হিসেবে ভাবা যায়। ওয়েট নিউরাল নেটওয়ার্কের আউটপুট নির্ধারণ করে।
এখানে একটি সাধারণ ফিড-ফরওয়ার্ড নিউরাল নেটওয়ার্ক কীভাবে কাজ করে তার সংক্ষিপ্ত ওভারভিউ:
ফিড-ফরওয়ার্ড নিউরাল নেটওয়ার্ক ব্যবহার করার সময় আমাদের কিছু ধাপ মেনে চলতে হয়:
প্রথমে ইনপুট নিন ম্যাট্রিক্স আকারে (সংখ্যার ২D অ্যারে)
পরবর্তী ধাপ: ইনপুটকে ওয়েটের একটি সেট দিয়ে গুণ করুন।
পরবর্তী ধাপ: একটি অ্যাক্টিভেশন ফাংশন প্রয়োগ করুন।
একটি আউটপুট ফেরত দিন।
পরবর্তী ধাপ: এরর গণনা করুন, এটি ডেটা থেকে প্রত্যাশিত আউটপুট এবং প্রেডিক্ট করা আউটপুটের মধ্যে পার্থক্য।
এবং এরর অনুযায়ী ওয়েটগুলো কিছুটা পরিবর্তন করুন।
প্রশিক্ষণের জন্য, এই প্রক্রিয়া ১,০০০+ বার পুনরাবৃত্তি করুন এবং যত বেশি ডেটায় প্রশিক্ষণ দিবেন, আউটপুট তত বেশি নির্ভুল হবে।
পড়াশোনার ঘন্টা, ঘুমের ঘন্টা (ইনপুট) - টেস্ট স্কোর (আউটপুট)
2, 992 1, 586 3, 689 4, 8?
উদাহরণ কোড
from numpy import exp, array, random, dot, tanh
class my_network():
def __init__(self):
random.seed(1)
# 3x1 ওয়েট ম্যাট্রিক্স
self.weight_matrix = 2 * random.random((3, 1)) - 1
def my_tanh(self, x):
return tanh(x)
def my_tanh_derivative(self, x):
return 1.0 - tanh(x) ** 2
# ফরওয়ার্ড প্রপাগেশন
def my_forward_propagation(self, inputs):
return self.my_tanh(dot(inputs, self.weight_matrix))
# নিউরাল নেটওয়ার্ক প্রশিক্ষণ
def train(self, train_inputs, train_outputs, num_train_iterations):
for iteration in range(num_train_iterations):
output = self.my_forward_propagation(train_inputs)
# আউটপুটের এরর গণনা
error = train_outputs - output
adjustment = dot(train_inputs.T, error * self.my_tanh_derivative(output))
# ওয়েট ম্যাট্রিক্স সমায়োজন
self.weight_matrix += adjustment
# ড্রাইভার কোড
if __name__ == "__main__":
my_neural = my_network()
print('Random weights when training has started')
print(my_neural.weight_matrix)
train_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
train_outputs = array([[0, 1, 1, 0]]).T
my_neural.train(train_inputs, train_outputs, 10000)
print('Displaying new weights after training')
print(my_neural.weight_matrix)
# নতুন পরিস্থিতিতে নিউরাল নেটওয়ার্ক টেস্ট
print("Testing network on new examples ->")
print(my_neural.my_forward_propagation(array([1, 0, 0])))
আউটপুট
Random weights when training has started [[-0.16595599] [ 0.44064899] [-0.99977125]] Displaying new weights after training [[5.39428067] [0.19482422] [0.34317086]] Testing network on new examples -> [0.99995873]