کی میز کے مندرجات[چھپائیں][دکھائیں]
دماغ کا موازنہ عصبی نیٹ ورکس سے کیا جاسکتا ہے۔ یہ وہ مشابہت ہے جو عام طور پر اس موضوع میں کسی نئے شخص کی مشین لرننگ اور مصنوعی عصبی نیٹ ورکس کے پیچھے خیالات کو سمجھنے میں مدد کرنے کے لیے استعمال ہوتی ہے۔
چونکہ پردے کے پیچھے ریاضیاتی اور شماریاتی کمپیوٹیشنز کی کئی پرتیں چل رہی ہیں، اس لیے ان نیٹ ورکس کو ریاضیاتی فنکشن کے طور پر بیان کرنا ایک زیادہ جدید طریقہ ہے۔
یہ ان لوگوں کے لیے ہے جو دراصل مشین لرننگ میں دلچسپی رکھتے ہیں اور یہ دیکھنا چاہتے ہیں کہ Python نیورل نیٹ ورک کوڈ کیسے لکھا جاتا ہے۔
اس آرٹیکل میں، ہم یہ ظاہر کریں گے کہ کس طرح شروع سے مکمل طور پر منسلک ڈیپ نیورل نیٹ ورک (DNN) بنایا جائے۔ ازگر 3.
ہمارے Python نیورل نیٹ ورک کوڈ کے لیے فائل کی ساخت کا ایک جائزہ
یہاں تین فائلیں بنیں گی۔ پہلی سادہ nn.py فائل ہے، جس پر "ہیلپر فنکشنز کو سیٹ کرنا" اور "شروع سے نیورل نیٹ ورک کی تعمیر" میں بحث کی جائے گی۔
ہمارے پاس ٹیسٹ ڈیٹا لوڈ کرنے کے لیے mnist loader.py نام کی ایک فائل بھی ہوگی، جیسا کہ "MNIST ڈیٹا لوڈ کرنا" میں بیان کیا گیا ہے۔
آخر میں، ہمارے پاس test.py نام کی ایک فائل ہوگی جو ہمارے نیورل نیٹ ورک کو جانچنے کے لیے ٹرمینل میں لانچ کی جائے گی۔
اس فائل کو "رننگ ٹیسٹ" میں تفصیل سے بیان کیا گیا ہے۔
تنصیب
اس ٹیوٹوریل کی پیروی کرنے کے لیے NumPy Python لائبریری کو ڈاؤن لوڈ کرنا ضروری ہے۔ آپ ٹرمینل پر درج ذیل کمانڈ کا استعمال کرکے اسے پورا کرسکتے ہیں:
ماڈیولز درآمد کرنا اور ہیلپر فنکشن کو ترتیب دینا
ہمیں صرف دو لائبریریوں کی ضرورت ہے بے ترتیب اور NumPy، جنہیں ہم فوراً درآمد کریں گے۔ ہمارے عصبی نیٹ ورک کے ابتدائی وزن کے لیے، ہم بے ترتیب لائبریری کا استعمال کرتے ہوئے انہیں بدل دیں گے۔
اپنے حسابات کو تیز کرنے کے لیے، ہم NumPy یا np استعمال کریں گے (کنونشن کے مطابق، یہ اکثر np کے طور پر درآمد کیا جاتا ہے)۔ ہمارے دو مددگار کام ہماری درآمدات کے بعد کیے جائیں گے۔ دو سگمائیڈ افعال: ایک اور سگمائیڈ پرائم۔
لاجسٹک ریگریشن سگمائیڈ فنکشن کا استعمال کرتے ہوئے ڈیٹا کی درجہ بندی کرے گا، جبکہ بیک پروپیگیشن سگمائیڈ پرائم فنکشن کا استعمال کرتے ہوئے ڈیلٹا یا گریڈینٹ کا حساب لگائے گی۔
نیٹ ورک کلاس بنانا
مکمل طور پر منسلک نیورل نیٹ ورک کی تعمیر اس سیکشن کا واحد فوکس ہے۔ نیٹ ورک کلاس اس کے بعد آنے والے تمام فنکشنز کو گھیرے گی۔ فنکشن Object() { [مقامی کوڈ] } ابتدائی طور پر ہمارے نیٹ ورک کلاس میں بنایا جائے گا۔
ایک دلیل، سائز، فنکشن Object() { [مقامی کوڈ] } کے لیے درکار ہے۔ سائز متغیر عددی اقدار کا مجموعہ ہے جو ہمارے نیورل نیٹ ورک کی ہر تہہ میں موجود ان پٹ نوڈس کی تعداد کو ظاہر کرتا ہے۔
ہم اپنے __init__ طریقہ میں چار خصوصیات شروع کرتے ہیں۔ ان پٹ متغیرات، سائز، بالترتیب پرتوں کے سائز اور تہوں کی تعداد، نمبر تہوں کی فہرست ترتیب دینے کے لیے استعمال ہوتے ہیں۔
پہلا قدم تصادفی طور پر اپنے نیٹ ورک کے ابتدائی تعصبات کو ان پٹ پرت کے بعد آنے والی ہر پرت کو تفویض کرنا ہے۔
آخر میں، ان پٹ اور آؤٹ پٹ پرتوں کے درمیان ہر ایک لنک کا وزن تصادفی طور پر پیدا ہوتا ہے۔ Np.Random.Randn() سیاق و سباق کے لیے عام تقسیم سے اخذ کردہ ایک بے ترتیب نمونہ دیتا ہے۔
فیڈ فارورڈ فنکشن
نیورل نیٹ ورک میں، معلومات کو فیڈ فارورڈ فنکشن کے ذریعے آگے بھیجا جاتا ہے۔ اس فنکشن کے لیے ایک دلیل، a، موجودہ ایکٹیویشن ویکٹر کی نشاندہی کرنے کی ضرورت ہوگی۔
یہ فنکشن نیٹ ورک میں موجود تمام تعصبات اور وزنوں کو دہراتے ہوئے ہر پرت پر ایکٹیویشن کا تخمینہ لگاتا ہے۔ دیا گیا جواب پیشین گوئی ہے، جو کہ آخری پرت کی ایکٹیویشن ہے۔
منی بیچ گریڈینٹ ڈیسنٹ
ہمارے نیٹ ورک کلاس کا ورک ہارس گریڈینٹ ڈیسنٹ ہے۔ اس ورژن میں، ہم منی بیچ (اسٹاکسٹک) گریڈیئنٹ ڈیسنٹ کا استعمال کرتے ہیں، جو کہ تدریجی نزول کا ایک تبدیل شدہ تغیر ہے۔
اس سے ظاہر ہوتا ہے کہ ڈیٹا پوائنٹس کا ایک چھوٹا بیچ ہمارے ماڈل کو اپ ڈیٹ کرنے کے لیے استعمال کیا جائے گا۔ اس طریقہ پر چار مطلوبہ اور ایک اختیاری دلیل دی جاتی ہے۔ چار مطلوبہ متغیرات تربیتی ڈیٹا سیٹ، عہدوں کی تعداد، منی بیچوں کا سائز، اور سیکھنے کی شرح (ای ٹی اے) ہیں۔
ٹیسٹ کا ڈیٹا درخواست پر دستیاب ہے۔ جب ہم بالآخر اس نیٹ ورک کا جائزہ لیں گے تو ہم ٹیسٹ ڈیٹا فراہم کریں گے۔ اس فنکشن میں نمونوں کی تعداد ابتدائی طور پر فہرست کی لمبائی پر سیٹ کی جاتی ہے جب تربیتی ڈیٹا کو فہرست کی قسم میں تبدیل کر دیا جاتا ہے۔
ہم اسی عمل کو جانچنے کے لیے بھی لاگو کرتے ہیں جو ڈیٹا دیا گیا ہے۔ جب ہم بعد میں MNIST ڈیٹا کے نمونے لوڈ کریں گے، تو ہم اس کے بارے میں مزید جانیں گے۔
اگر ہم اس بات کو یقینی بناسکتے ہیں کہ ہم دونوں قسم کے ڈیٹا کو فہرست کے طور پر فراہم کرتے ہیں، تو اس قسم کی کاسٹنگ ضروری نہیں ہے۔
ایک بار جب ہمارے پاس ڈیٹا ہو جاتا ہے، تو ہم تربیتی دور کو ایک لوپ میں دیکھتے ہیں۔ تربیت کی مدت اعصابی نیٹ ورک کی تربیت کا صرف ایک دور ہے۔ ہم منی بیچوں کی فہرست بنانے سے پہلے بے ترتیب ہونے کو یقینی بنانے کے لیے پہلے ہر دور میں ڈیٹا کو شفل کرتے ہیں۔
اپ ڈیٹ منی بیچ فنکشن، جس پر ذیل میں بات کی گئی ہے، ہر منی بیچ کے لیے بلایا جائے گا۔ اگر ٹیسٹ کا ڈیٹا دستیاب ہو تو ٹیسٹ کی درستگی بھی واپس کر دی جائے گی۔
لاگت سے ماخوذ مددگار فنکشن
آئیے ہم واقعی بیک پروپیگیشن کوڈ بنانے سے پہلے ایک مددگار فنکشن تیار کرتے ہیں جسے لاگت سے اخذ کیا جاتا ہے۔ اگر ہم اپنی آؤٹ پٹ پرت میں غلطی کرتے ہیں، تو قیمت اخذ کرنے والا فنکشن اسے دکھائے گا۔
اس کے لیے دو ان پٹ کی ضرورت ہوتی ہے: آؤٹ پٹ ایکٹیویشن سرنی اور متوقع آؤٹ پٹ ویلیوز کے y- کوآرڈینیٹس۔
بیک پروپیگیشن فنکشن
ہمارے موجودہ ایکٹیویشن ویکٹر، ایکٹیویشن، نیز کسی بھی دوسرے ایکٹیویشن ویکٹر، ایکٹیویشن، اور z-ویکٹرز، zs، سب کو ذہن میں رکھنا چاہیے۔ ایک پرت جسے ان پٹ لیئر کہتے ہیں سب سے پہلے چالو کیا جاتا ہے۔
ہم ان کو ڈالنے کے بعد ہر تعصب اور وزن کے ذریعے لوپ کریں گے۔ ہر لوپ میں وزن اور ایکٹیویشن کے ڈاٹ پروڈکٹ کے طور پر z ویکٹر کا حساب لگانا، اسے zs کی فہرست میں شامل کرنا، ایکٹیویشن کا دوبارہ حساب لگانا، اور ایکٹیویشن کی فہرست میں اپ ڈیٹ کردہ ایکٹیویشن کو شامل کرنا شامل ہے۔
آخر میں، ریاضی. ڈیلٹا، جو zs ویکٹرز کے آخری عنصر کے سگمائیڈ پرائم سے ضرب کردہ پچھلی پرت کی غلطی کے برابر ہے، اس سے پہلے کہ ہم اپنا پسماندہ پاس شروع کریں، شمار کیا جاتا ہے۔
نابلا بی کی آخری پرت ڈیلٹا کے لیے سیٹ کی گئی ہے، اور نابلا ڈبلیو کی آخری پرت ڈیلٹا کی ڈاٹ پروڈکٹ اور ایکٹیویشن کی دوسری سے آخری پرت کے لیے سیٹ کی گئی ہے (ٹرانسپوز کیا گیا تاکہ ہم حقیقت میں ریاضی کر سکیں) .
ہم پہلے کی طرح آگے بڑھتے ہیں، دوسری تہہ سے شروع کرتے ہیں اور آخری پر ختم کرتے ہیں، اور ان آخری تہوں کو مکمل کرنے کے بعد اس عمل کو دہراتے ہیں۔ اس کے بعد نابلس کو ٹپل کے طور پر واپس دیا جاتا ہے۔
منی بیچ گریڈینٹ ڈیسنٹ کو اپ ڈیٹ کرنا
ہمارے SGD (اسٹاکسٹک گریڈینٹ ڈیسنٹ) کا طریقہ پہلے سے منی بیچ اپڈیٹنگ کو شامل کرتا ہے۔ چونکہ یہ SGD میں استعمال ہوتا ہے لیکن بیک پراپ کی بھی ضرورت ہوتی ہے، میں نے بحث کی کہ اس فنکشن کو کہاں رکھنا ہے۔
آخر میں، میں نے اسے یہاں پوسٹ کرنے کا انتخاب کیا۔ یہ تعصبات اور وزن کے نابلاس کے 0 ویکٹر پیدا کرنے سے شروع ہوتا ہے، بالکل اسی طرح جیسے ہمارے بیک پروپ فنکشن نے کیا تھا۔
اسے منی بیچ اور ایٹا سیکھنے کی شرح اس کے دو ان پٹ کے طور پر درکار ہے۔ منی بیچ میں، پھر ہم بیک پروپ فنکشن کا استعمال کرتے ہیں تاکہ ہر ان پٹ، x، اور آؤٹ پٹ، y کے لیے ہر نابلا سرنی کا ڈیلٹا حاصل کیا جا سکے۔ نابلا کی فہرستیں پھر ان ڈیلٹا کے ساتھ اپ ڈیٹ کی جاتی ہیں۔
آخر میں، ہم نیٹ ورک کے وزن اور تعصبات کو اپ ڈیٹ کرنے کے لیے سیکھنے کی شرح اور نابلاس کا استعمال کرتے ہیں۔ ہر قدر کو تازہ ترین قدر میں اپ ڈیٹ کیا جاتا ہے، سیکھنے کی شرح سے کم، منی بیچ کے سائز سے ضرب کیا جاتا ہے، اور پھر نابلا قدر میں شامل کیا جاتا ہے۔
فنکشن کا اندازہ کریں۔
evaluate فنکشن حتمی ہے جسے ہمیں لکھنے کی ضرورت ہے۔ ٹیسٹ ڈیٹا اس فنکشن کے لیے واحد ان پٹ ہے۔ اس فنکشن میں، ہم نیٹ ورک کے آؤٹ پٹس کا صرف متوقع نتیجہ کے ساتھ موازنہ کرتے ہیں، y۔ ان پٹ کو کھلانے سے، ایکس، فارورڈ، نیٹ ورک کے آؤٹ پٹس کا تعین کیا جاتا ہے۔
مکمل کوڈ
جب ہم تمام کوڈ کو یکجا کرتے ہیں تو یہ اس طرح ظاہر ہوتا ہے۔
اعصابی نیٹ ورک کی جانچ
MNIST ڈیٹا لوڈ ہو رہا ہے۔
۔ MNIST ڈیٹا pkl.gz فارمیٹ میں ہے، جسے ہم GZIP استعمال کرکے کھولیں گے اور اچار کے ساتھ لوڈ کریں گے۔ آئیے اس ڈیٹا کو تین سائز کے ٹپل کے طور پر لوڈ کرنے کے لیے ایک فوری طریقہ لکھتے ہیں، جسے تربیت، توثیق، اور ٹیسٹ ڈیٹا میں تقسیم کیا گیا ہے۔
اپنے ڈیٹا کو منظم کرنے میں آسانی پیدا کرنے کے لیے، ہم y کو 10 آئٹم کی صف میں انکوڈ کرنے کے لیے ایک اور فنکشن لکھیں گے۔ صف تمام 0s کی ہوگی سوائے اس 1 کے جو تصویر کے صحیح ہندسے سے میل کھاتا ہے۔
ہم اپنے ڈیٹا کو پڑھنے کے قابل فارمیٹ میں لوڈ کرنے کے لیے بنیادی لوڈ ڈیٹا اور ایک ہاٹ انکوڈ طریقہ استعمال کریں گے۔ ایک اور فنکشن لکھا جائے گا جو ہماری x ویلیوز کو سائز 784 کی فہرست میں تبدیل کر دے گا، جو تصویر کے 784 پکسلز سے مماثل ہے، اور ہماری y ویلیوز کو ان کے سنگل ہاٹ انکوڈ شدہ ویکٹر فارم میں تبدیل کر دے گا۔
پھر ہم x اور y کی قدروں کو اس طرح جوڑیں گے کہ ایک انڈیکس دوسرے سے مماثل ہو۔ یہ تربیت، توثیق، اور ٹیسٹ ڈیٹا سیٹ پر لاگو ہوتا ہے۔ پھر ہم تبدیل شدہ ڈیٹا واپس کرتے ہیں۔
رننگ ٹیسٹ
ہم "mnist loader" کے نام سے ایک نئی فائل بنائیں گے جو جانچ شروع کرنے سے پہلے ہمارے قائم کردہ نیورل نیٹ ورک (سادہ nn) اور MNIST ڈیٹا سیٹ لوڈر دونوں کو درآمد کرے گی۔
اس فائل میں، ہمیں صرف ڈیٹا امپورٹ کرنا ہے، 784 کی ان پٹ لیئر سائز اور 10 کی آؤٹ پٹ لیئر سائز کے ساتھ نیٹ ورک بنانا ہے، ٹریننگ ڈیٹا پر نیٹ ورک کے SGD فنکشن کو چلائیں، پھر ٹیسٹ ڈیٹا کا استعمال کرتے ہوئے اس کی جانچ کریں۔
ذہن میں رکھیں کہ ہماری ان پٹ تہوں کی فہرست کے لیے، اس سے کوئی فرق نہیں پڑتا کہ 784 اور 10 کے درمیان کوئی بھی نمبر کیا ہے۔ ہم دوسری تہوں کو اپنی مرضی کے مطابق تبدیل کر سکتے ہیں۔ صرف ان پٹ اور آؤٹ پٹ سائز طے شدہ ہیں۔
تین پرتیں ضروری نہیں ہیں۔ ہم چار، پانچ، یا صرف دو استعمال کر سکتے ہیں۔ اس کے ساتھ تجربہ کرنے میں مزہ آئے۔
نتیجہ
یہاں، Python 3 کا استعمال کرتے ہوئے، ہم شروع سے ایک نیورل نیٹ ورک بناتے ہیں۔ اعلیٰ سطحی ریاضی کے ساتھ ساتھ، ہم نے نفاذ کی تفصیلات پر بھی تبادلہ خیال کیا۔
ہم نے مددگار افعال کو نافذ کرکے شروع کیا۔ نیوران کے کام کرنے کے لیے، سگمائیڈ اور سگمائڈ پرائم فنکشنز بہت اہم ہیں۔ اس کے بعد ہم فیڈ فارورڈ فنکشن کو عملی جامہ پہناتے ہیں، جو کہ نیورل نیٹ ورک میں ڈیٹا فیڈ کرنے کا بنیادی عمل ہے۔
اس کے بعد، ہم نے Python میں گریڈینٹ ڈیسنٹ فنکشن بنایا، وہ انجن جو ہمارے نیورل نیٹ ورک کو چلاتا ہے۔ "لوکل منیما" کو تلاش کرنے اور ان کے وزن اور تعصبات کو بہتر بنانے کے لیے، ہمارا نیورل نیٹ ورک گریڈینٹ ڈیسنٹ کا استعمال کرتا ہے۔ ہم نے بیک پروپیگیشن فنکشن کا استعمال کرتے ہوئے تخلیق کیا۔ تدریجی نزول.
جب آؤٹ پٹ مناسب لیبلز سے مماثل نہیں ہوتے ہیں تو اپ ڈیٹس فراہم کرکے، یہ فنکشن نیورل نیٹ ورک کو "سیکھنے" کے قابل بناتا ہے۔
آخر میں، ہم نے اپنا بالکل نیا Python رکھا عصبی نیٹ ورک MNIST ڈیٹا سیٹ کا استعمال کرتے ہوئے ٹیسٹ کے لیے۔ سب کچھ آسانی سے کام کرتا تھا۔
کوڈنگ مبارک ہو!
جواب دیجئے