সুচিপত্র[লুকান][দেখান]
মস্তিষ্ক নিউরাল নেটওয়ার্কের সাথে তুলনীয়। এটি সেই সাদৃশ্য যা সাধারণত এই বিষয়ে নতুন কাউকে মেশিন লার্নিং এবং কৃত্রিম নিউরাল নেটওয়ার্কের পিছনের ধারণাগুলি বুঝতে সহায়তা করার জন্য ব্যবহৃত হয়।
কারণ পর্দার আড়ালে গাণিতিক এবং পরিসংখ্যানগত গণনার বিভিন্ন স্তর চলছে, এই নেটওয়ার্কগুলিকে একটি গাণিতিক ফাংশন হিসাবে সংজ্ঞায়িত করা আরও উন্নত পদ্ধতি।
এটি এমন লোকদের জন্য যারা আসলে মেশিন লার্নিংয়ে আগ্রহী এবং পাইথন নিউরাল নেটওয়ার্ক কোড কীভাবে লেখা হয় তা দেখতে চান।
এই প্রবন্ধে, আমরা দেখাব কিভাবে স্ক্র্যাচ থেকে একটি সম্পূর্ণ সংযুক্ত গভীর নিউরাল নেটওয়ার্ক (DNN) তৈরি করা যায়। পাইথন 3.
আমাদের পাইথন নিউরাল নেটওয়ার্ক কোডের জন্য ফাইল স্ট্রাকচারের একটি ওভারভিউ
এখানে তিনটি ফাইল তৈরি হবে। প্রথমটি হল সাধারণ nn.py ফাইল, যা "সেটিং আপ হেল্পার ফাংশন" এবং "স্ক্র্যাচ থেকে নিউরাল নেটওয়ার্ক তৈরি করা" এ আলোচনা করা হবে।
পরীক্ষার ডেটা লোড করার জন্য আমাদের কাছে mnist loader.py নামে একটি ফাইলও থাকবে, যেমনটি "MNIST ডেটা লোড হচ্ছে" এ বর্ণিত আছে।
অবশেষে, আমাদের কাছে test.py নামে একটি ফাইল থাকবে যা আমাদের নিউরাল নেটওয়ার্ক পরীক্ষা করার জন্য টার্মিনালে চালু করা হবে।
এই ফাইলটি "চলমান পরীক্ষা" এ বিশদভাবে বর্ণনা করা হয়েছে।
স্থাপন
এই টিউটোরিয়ালটি অনুসরণ করার জন্য NumPy পাইথন লাইব্রেরিটি অবশ্যই ডাউনলোড করতে হবে। আপনি টার্মিনালে নিম্নলিখিত কমান্ড ব্যবহার করে এটি সম্পন্ন করতে পারেন:
মডিউল আমদানি করা এবং হেল্পার ফাংশন সেট আপ করা
আমাদের প্রয়োজন শুধুমাত্র দুটি লাইব্রেরি হল র্যান্ডম এবং NumPy, যা আমরা এখনই আমদানি করব। আমাদের নিউরাল নেটওয়ার্কের প্রাথমিক ওজনের জন্য, আমরা এলোমেলো লাইব্রেরি ব্যবহার করে সেগুলিকে এলোমেলো করে দেব।
আমাদের গণনার গতি বাড়ানোর জন্য, আমরা NumPy বা np ব্যবহার করব (প্রথা অনুসারে, এটি প্রায়শই np হিসাবে আমদানি করা হয়)। আমাদের আমদানির পর আমাদের দুটি সহায়ক ফাংশন করা হবে। দুটি সিগময়েড ফাংশন: একটি এবং সিগময়েড প্রাইম।
লজিস্টিক রিগ্রেশন সিগময়েড ফাংশন ব্যবহার করে ডেটা শ্রেণীবদ্ধ করবে, যখন ব্যাকপ্রোপগেশন সিগময়েড প্রাইম ফাংশন ব্যবহার করে ডেল্টা বা গ্রেডিয়েন্ট গণনা করবে।
নেটওয়ার্ক ক্লাস তৈরি করা
একটি সম্পূর্ণ লিঙ্কযুক্ত নিউরাল নেটওয়ার্ক তৈরি করা এই বিভাগের একমাত্র ফোকাস। নেটওয়ার্ক ক্লাস পরবর্তীতে আসা সমস্ত ফাংশনকে অন্তর্ভুক্ত করবে। অবজেক্ট() { [নেটিভ কোড] } ফাংশনটি আমাদের নেটওয়ার্ক ক্লাসে প্রাথমিকভাবে তৈরি করা হবে।
অবজেক্ট() { [নেটিভ কোড] } ফাংশনের জন্য একটি আর্গুমেন্ট, সাইজ প্রয়োজন। সাইজ ভেরিয়েবল হল সাংখ্যিক মানের একটি সংগ্রহ যা আমাদের নিউরাল নেটওয়ার্কের প্রতিটি স্তরে উপস্থিত ইনপুট নোডের সংখ্যা উপস্থাপন করে।
আমরা আমাদের __init__ পদ্ধতিতে চারটি বৈশিষ্ট্য শুরু করি। ইনপুট ভেরিয়েবল, মাপ, যথাক্রমে স্তরের আকারের তালিকা এবং স্তরের সংখ্যা, স্তর সংখ্যা সেট করতে ব্যবহৃত হয়।
প্রথম ধাপটি হল ইনপুট স্তর অনুসরণকারী প্রতিটি স্তরে এলোমেলোভাবে আমাদের নেটওয়ার্কের প্রাথমিক পক্ষপাতগুলি বরাদ্দ করা৷
অবশেষে, ইনপুট এবং আউটপুট স্তরগুলির মধ্যে প্রতিটি লিঙ্কের ওজন এলোমেলোভাবে তৈরি হয়। Np.Random.Randn() প্রসঙ্গের জন্য স্বাভাবিক বন্টন থেকে আঁকা একটি এলোমেলো নমুনা দেয়।
ফিড ফরোয়ার্ড ফাংশন
একটি নিউরাল নেটওয়ার্কে, ফিডফরওয়ার্ড ফাংশন দ্বারা তথ্য পাঠানো হয়। একটি যুক্তি, a, বর্তমান সক্রিয়করণ ভেক্টর নির্দেশ করে, এই ফাংশনের জন্য প্রয়োজন হবে।
এই ফাংশন নেটওয়ার্কের সমস্ত পক্ষপাত এবং ওজনের উপর পুনরাবৃত্তি করে প্রতিটি স্তরে সক্রিয়করণের অনুমান করে। প্রদত্ত উত্তর হল ভবিষ্যদ্বাণী, যা শেষ স্তরের সক্রিয়করণ।
মিনি-ব্যাচ গ্রেডিয়েন্ট ডিসেন্ট
আমাদের নেটওয়ার্ক ক্লাসের ওয়ার্কহরস হল গ্রেডিয়েন্ট ডিসেন্ট। এই সংস্করণে, আমরা মিনি-ব্যাচ (স্টোকাস্টিক) গ্রেডিয়েন্ট ডিসেন্ট ব্যবহার করি, গ্রেডিয়েন্ট ডিসেন্টের একটি পরিবর্তিত পরিবর্তন।
এটি নির্দেশ করে যে আমাদের মডেল আপডেট করতে ডেটা পয়েন্টের একটি ছোট ব্যাচ ব্যবহার করা হবে। চারটি প্রয়োজনীয় এবং একটি ঐচ্ছিক যুক্তি এই পদ্ধতিতে পাস করা হয়। চারটি প্রয়োজনীয় ভেরিয়েবল হল প্রশিক্ষণের ডেটা সেট, যুগের সংখ্যা, মিনি-ব্যাচের আকার এবং শেখার হার (ইটা)।
পরীক্ষার ডেটা অনুরোধের ভিত্তিতে উপলব্ধ। আমরা শেষ পর্যন্ত এই নেটওয়ার্কের মূল্যায়ন করার সময় আমরা পরীক্ষার ডেটা সরবরাহ করব। এই ফাংশনে নমুনার সংখ্যা প্রাথমিকভাবে তালিকার দৈর্ঘ্যে সেট করা হয় একবার প্রশিক্ষণের ডেটা একটি তালিকার প্রকারে রূপান্তরিত হয়ে গেলে।
আমরা একই প্রক্রিয়া প্রয়োগ করি যে ডেটা দেওয়া হয়েছে তা পরীক্ষা করার জন্য। এর কারণ হল আমাদের কাছে তালিকা হিসাবে ফেরত দেওয়ার পরিবর্তে, এগুলি সত্যিই তালিকার জিপ। যখন আমরা MNIST ডেটা নমুনাগুলি পরে লোড করব, আমরা এই সম্পর্কে আরও জানব৷
যদি আমরা নিশ্চিত করতে পারি যে আমরা তালিকা হিসাবে উভয় ধরণের ডেটা সরবরাহ করি, তাহলে এই টাইপ-কাস্টিং অগত্যা অপরিহার্য নয়।
একবার আমাদের কাছে ডেটা হয়ে গেলে, আমরা একটি লুপে প্রশিক্ষণের যুগের উপর যাই। একটি প্রশিক্ষণ সময়কাল নিউরাল নেটওয়ার্ক প্রশিক্ষণের মাত্র এক রাউন্ড। মিনি-ব্যাচগুলির একটি তালিকা তৈরি করার আগে এলোমেলোতা নিশ্চিত করতে আমরা প্রথমে প্রতিটি যুগে ডেটা শাফেল করি।
আপডেট মিনি ব্যাচ ফাংশন, যা নীচে আলোচনা করা হয়েছে, প্রতিটি মিনি-ব্যাচের জন্য কল করা হবে। পরীক্ষার তথ্য পাওয়া গেলে পরীক্ষার নির্ভুলতাও ফেরত দেওয়া হবে।
কস্ট-ডেরিভেটিভ হেল্পার ফাংশন
আমরা সত্যিই ব্যাকপ্রোপগেশন কোড তৈরি করার আগে প্রথমে খরচ ডেরিভেটিভ নামে একটি সহায়ক ফাংশন বিকাশ করি। যদি আমরা আমাদের আউটপুট লেয়ারে ভুল করি, তবে খরচ ডেরিভেটিভ ফাংশন তা দেখাবে।
এটির জন্য দুটি ইনপুট প্রয়োজন: আউটপুট অ্যাক্টিভেশন অ্যারে এবং প্রত্যাশিত আউটপুট মানগুলির y-স্থানাঙ্ক।
ব্যাকপ্রপাগেশন ফাংশন
আমাদের বর্তমান অ্যাক্টিভেশন ভেক্টর, অ্যাক্টিভেশন, সেইসাথে অন্য যেকোন অ্যাক্টিভেশন ভেক্টর, অ্যাক্টিভেশন এবং z-ভেক্টর, zs, সবই মাথায় রাখতে হবে। ইনপুট স্তর নামে একটি স্তর প্রথমে সক্রিয় করা হয়।
আমরা প্রতিটি পক্ষপাতের মধ্য দিয়ে লুপ করব এবং তাদের স্থাপন করার পরে ওজন। প্রতিটি লুপে z ভেক্টরকে ওজন এবং অ্যাক্টিভেশনের ডট প্রোডাক্ট হিসেবে গণনা করা, এটিকে zs-এর তালিকায় যোগ করা, অ্যাক্টিভেশনের পুনঃগণনা করা এবং অ্যাক্টিভেশনের তালিকায় আপডেট করা অ্যাক্টিভেশন যোগ করা জড়িত।
অবশেষে, গণিত। ডেল্টা, যা zs ভেক্টরের শেষ উপাদানের সিগমায়েড প্রাইম দ্বারা গুণিত পূর্ববর্তী স্তর থেকে ত্রুটির সমান, আমরা আমাদের ব্যাকওয়ার্ড পাস শুরু করার আগে গণনা করা হয়।
নাবলা বি-এর শেষ স্তরটি ডেল্টা হিসাবে সেট করা হয়েছে এবং নাবলা ডব্লিউ এর চূড়ান্ত স্তরটি ব-দ্বীপের ডট পণ্য এবং সক্রিয়করণের দ্বিতীয় থেকে শেষ স্তর হিসাবে সেট করা হয়েছে (ট্রান্সপোজ করা হয়েছে যাতে আমরা আসলে গণিতটি করতে পারি) .
আমরা আগের মতোই এগিয়ে যাই, দ্বিতীয় স্তর দিয়ে শুরু করে শেষ দিয়ে শেষ করি এবং এই শেষ স্তরগুলি সম্পূর্ণ করার পরে প্রক্রিয়াটি পুনরাবৃত্তি করি। তারপর নাবলাগুলিকে টিপল হিসাবে ফিরিয়ে দেওয়া হয়।
মিনি-ব্যাচ গ্রেডিয়েন্ট ডিসেন্ট আপডেট করা হচ্ছে
আমাদের SGD (স্টোকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট) পদ্ধতিতে মিনি-ব্যাচ আপডেট করা হয়েছে। যেহেতু এটি SGD তে ব্যবহার করা হয় তবে ব্যাকপ্রপেরও প্রয়োজন হয়, আমি এই ফাংশনটি কোথায় রাখতে হবে তা নিয়ে বিতর্ক করেছি।
অবশেষে, আমি এখানে পোস্ট করার পছন্দ করেছি। এটি আমাদের ব্যাকপ্রপ ফাংশনের মতোই বায়েসস এবং ওয়েটস নাব্লাসের 0 ভেক্টর তৈরি করে শুরু হয়।
এটির দুটি ইনপুট হিসাবে মিনি-ব্যাচ এবং ইটা শেখার হার প্রয়োজন। মিনি-ব্যাচে, আমরা প্রতিটি ইনপুট, x, এবং আউটপুট, y-এর জন্য প্রতিটি নাবলা অ্যারের ডেল্টা পেতে ব্যাকপ্রপ ফাংশন ব্যবহার করি। নাবলা তালিকাগুলি তারপর এই ডেল্টাগুলির সাথে আপডেট করা হয়।
অবশেষে, নেটওয়ার্কের ওজন এবং পক্ষপাত আপডেট করতে আমরা শেখার হার এবং নাবলা ব্যবহার করি। প্রতিটি মান সবচেয়ে সাম্প্রতিক মান, কম শেখার হার, মিনিব্যাচ আকার দ্বারা গুণিত, এবং তারপর nabla মান যোগ করা হয় আপডেট করা হয়।
ফাংশন মূল্যায়ন
মূল্যায়ন ফাংশনটি চূড়ান্ত যা আমাদের লিখতে হবে। পরীক্ষার ডেটা এই ফাংশনের জন্য একমাত্র ইনপুট। এই ফাংশনে, আমরা শুধুমাত্র প্রত্যাশিত ফলাফলের সাথে নেটওয়ার্কের আউটপুট তুলনা করি, y। ইনপুট খাওয়ানোর মাধ্যমে, x, ফরোয়ার্ড, নেটওয়ার্কের আউটপুট নির্ধারণ করা হয়।
সম্পূর্ণ কোড
যখন আমরা সমস্ত কোড একত্রিত করি, এটি এইভাবে প্রদর্শিত হয়।
নিউরাল নেটওয়ার্ক পরীক্ষা করা
MNIST ডেটা লোড হচ্ছে
সার্জারির MNIST ডেটা .pkl.gz ফরম্যাটে আছে, যা আমরা GZIP ব্যবহার করে খুলব এবং আচার দিয়ে লোড করব। প্রশিক্ষণ, বৈধতা, এবং পরীক্ষার ডেটাতে বিভক্ত এই তথ্যটি তিন আকারের একটি টিপল হিসাবে লোড করার জন্য একটি দ্রুত পদ্ধতি লিখুন।
আমাদের ডেটা পরিচালনা করা সহজ করতে, আমরা 10-আইটেম অ্যারেতে y এনকোড করার জন্য অন্য একটি ফাংশন লিখব। চিত্রের সঠিক অঙ্কের সাথে মেলে এমন একটি 0 ব্যতীত অ্যারেটি সমস্ত 1 সেকেন্ড হবে৷
আমাদের ডেটা পাঠযোগ্য বিন্যাসে লোড করতে আমরা মৌলিক লোড ডেটা এবং একটি হট এনকোড পদ্ধতি ব্যবহার করব। আরেকটি ফাংশন লেখা হবে যা আমাদের x মানগুলিকে 784 আকারের একটি তালিকায় রূপান্তর করবে, চিত্রের 784 পিক্সেলের সাথে মিলে যাবে এবং আমাদের y মানগুলিকে তাদের একক হট এনকোডেড ভেক্টর ফর্মে পরিণত করবে।
তারপর আমরা x এবং y মানগুলিকে একত্রিত করব যাতে একটি সূচক অন্যটির সাথে মেলে। এটি প্রশিক্ষণ, বৈধতা এবং পরীক্ষার ডেটা সেটের ক্ষেত্রে প্রযোজ্য। আমরা তারপর পরিবর্তিত তথ্য ফেরত.
চলমান টেস্ট
আমরা "mnist লোডার" নামে একটি নতুন ফাইল তৈরি করব যা আমরা পরীক্ষা শুরু করার আগে আমাদের পূর্বে প্রতিষ্ঠিত নিউরাল নেটওয়ার্ক (সাধারণ nn) এবং MNIST ডেটা সেট লোডার উভয়ই আমদানি করবে।
এই ফাইলটিতে, আমাদের যা করতে হবে তা হ'ল ডেটা আমদানি করতে হবে, 784 এর একটি ইনপুট স্তর এবং 10 এর আউটপুট স্তরের আকার সহ একটি নেটওয়ার্ক তৈরি করতে হবে, প্রশিক্ষণ ডেটাতে নেটওয়ার্কের SGD ফাংশনটি চালাতে হবে, তারপর পরীক্ষার ডেটা ব্যবহার করে এটি পরীক্ষা করতে হবে।
মনে রাখবেন যে আমাদের ইনপুট স্তরগুলির তালিকার জন্য, 784 এবং 10 এর মধ্যে যেকোন সংখ্যার মধ্যে কোন পার্থক্য নেই। আমরা অন্য স্তরগুলিকে আমাদের পছন্দ মতো পরিবর্তন করতে পারি; শুধু ইনপুট এবং আউটপুট আকার স্থির করা হয়.
তিনটি স্তর প্রয়োজনীয় নয়; আমরা চার, পাঁচ বা এমনকি মাত্র দুটি ব্যবহার করতে পারি। এটা নিয়ে পরীক্ষা করে মজা নিন।
উপসংহার
এখানে, পাইথন 3 ব্যবহার করে, আমরা স্ক্র্যাচ থেকে একটি নিউরাল নেটওয়ার্ক তৈরি করি। উচ্চ-স্তরের গণিতের পাশাপাশি, আমরা বাস্তবায়নের সুনির্দিষ্ট বিষয়েও আলোচনা করেছি।
আমরা সহায়ক ফাংশন বাস্তবায়ন করে শুরু করেছি। নিউরনগুলির কাজ করার জন্য, সিগময়েড এবং সিগময়েড প্রাইম ফাংশনগুলি অত্যন্ত গুরুত্বপূর্ণ। তারপরে আমরা ফিডফরওয়ার্ড ফাংশনটি অনুশীলন করি, যা নিউরাল নেটওয়ার্কে ডেটা খাওয়ানোর জন্য মৌলিক প্রক্রিয়া।
এর পরে, আমরা পাইথনে গ্রেডিয়েন্ট ডিসেন্ট ফাংশন তৈরি করেছি, ইঞ্জিন যা আমাদের নিউরাল নেটওয়ার্ক চালায়। "স্থানীয় মিনিমা" সনাক্ত করতে এবং তাদের ওজন এবং পক্ষপাতগুলি অপ্টিমাইজ করার জন্য, আমাদের নিউরাল নেটওয়ার্ক গ্রেডিয়েন্ট ডিসেন্ট ব্যবহার করে। আমরা ব্যাকপ্রোপগেশন ফাংশন ব্যবহার করে তৈরি করেছি গ্রেডিয়েন্ট বংশধর.
যখন আউটপুট সঠিক লেবেলের সাথে মেলে না তখন আপডেট প্রদান করে, এই ফাংশনটি নিউরাল নেটওয়ার্ককে "শিখতে" সক্ষম করে।
অবশেষে, আমরা আমাদের একেবারে নতুন পাইথন রাখলাম স্নায়বিক নেটওয়ার্ক MNIST ডেটা সেট ব্যবহার করে পরীক্ষা করতে। সবকিছু মসৃণভাবে কাজ করে।
শুভ কোডিং!
নির্দেশিকা সমন্ধে মতামত দিন