فهرست مندرجات[پنهان شدن][نمایش]
مغز با شبکه های عصبی قابل مقایسه است. این تشبیهی است که معمولاً برای کمک به افراد تازه کار برای درک ایده های پشت یادگیری ماشین و شبکه های عصبی مصنوعی استفاده می شود.
از آنجایی که چندین لایه از محاسبات ریاضی و آماری در پشت صحنه در حال انجام است، تعریف این شبکه ها به عنوان یک تابع ریاضی روش پیشرفته تری است.
این برای افرادی است که واقعاً به یادگیری ماشین علاقه دارند و می خواهند ببینند کد شبکه عصبی پایتون چگونه نوشته می شود.
در این مقاله، نحوه ساخت یک شبکه عصبی عمیق کاملا متصل (DNN) را از ابتدا نشان خواهیم داد. پــایتــون 3.
مروری بر ساختار فایل برای کد شبکه عصبی پایتون ما
سه فایل در اینجا ایجاد خواهد شد. اولین مورد، فایل ساده nn.py است که در «تنظیم توابع کمکی» و «ساخت شبکه عصبی از ابتدا» مورد بحث قرار خواهد گرفت.
ما همچنین فایلی به نام mnist loader.py خواهیم داشت تا داده های آزمایشی را بارگیری کنیم، همانطور که در «بارگیری داده های MNIST» توضیح داده شده است.
در نهایت، فایلی به نام test.py خواهیم داشت که برای آزمایش شبکه عصبی ما در ترمینال راه اندازی می شود.
این فایل به تفصیل در "آزمایشات در حال اجرا" توضیح داده شده است.
نصب و راه اندازی
برای دنبال کردن این آموزش، کتابخانه NumPy Python باید دانلود شود. با استفاده از دستور زیر در ترمینال می توانید این کار را انجام دهید:
وارد کردن ماژول ها و راه اندازی تابع Helper
تنها دو کتابخانه ای که ما نیاز داریم تصادفی و NumPy هستند که بلافاصله وارد می کنیم. برای وزن های اولیه شبکه عصبی خود، آنها را با استفاده از کتابخانه تصادفی به هم می زنیم.
به منظور سرعت بخشیدن به محاسبات خود، از NumPy یا np استفاده می کنیم (طبق قرارداد، اغلب به صورت np وارد می شود). دو تابع کمکی ما پس از واردات ما ساخته خواهد شد. دو تابع سیگموئید: یک و سیگموئید اول.
رگرسیون لجستیک داده ها را با استفاده از تابع sigmoid طبقه بندی می کند، در حالی که پس انتشار دلتا یا گرادیان را با استفاده از تابع sigmoid prime محاسبه می کند.
ایجاد کلاس شبکه
ساخت یک شبکه عصبی کاملاً مرتبط تنها تمرکز این بخش است. کلاس شبکه تمام توابع بعدی را در بر می گیرد. تابع Object() { [کد بومی] } در ابتدا در کلاس شبکه ما ایجاد خواهد شد.
یک آرگومان، اندازه ها، توسط تابع Object() { [کد بومی] } مورد نیاز است. متغیر اندازه ها مجموعه ای از مقادیر عددی است که تعداد گره های ورودی موجود در هر لایه از شبکه عصبی ما را نشان می دهد.
ما چهار ویژگی را در متد __init__ خود مقداردهی اولیه می کنیم. متغیرهای ورودی، اندازه ها، به ترتیب برای تنظیم لیست اندازه لایه ها و تعداد لایه ها، تعداد لایه ها استفاده می شوند.
اولین قدم این است که به طور تصادفی بایاس های اولیه شبکه خود را به هر لایه ای که از لایه ورودی می آید اختصاص دهیم.
در نهایت، هر پیوند بین لایه های ورودی و خروجی وزن خود را به طور تصادفی تولید می کند. Np.Random.Randn() یک نمونه تصادفی می دهد که از توزیع نرمال برای متن گرفته شده است.
عملکرد فید فوروارد
در یک شبکه عصبی، اطلاعات توسط تابع پیشخور ارسال می شود. یک آرگومان، a، که بردار فعال سازی فعلی را نشان می دهد، توسط این تابع مورد نیاز خواهد بود.
این تابع با تکرار بر روی تمامی بایاس ها و وزن های شبکه، فعال سازی ها را در هر لایه تخمین می زند. پاسخ داده شده پیش بینی است که فعال سازی آخرین لایه است.
مینی دسته ای گرادیان نزول
اسب کاری کلاس شبکه ما Gradient Descent است. در این نسخه، ما از شیب نزول مینی دسته ای (استوکاستیک) استفاده می کنیم که یک تغییر تغییر یافته از گرادیان نزول است.
این نشان می دهد که دسته کوچکی از نقاط داده برای به روز رسانی مدل ما استفاده خواهد شد. چهار آرگومان الزامی و یک آرگومان اختیاری به این روش ارسال می شود. چهار متغیر مورد نیاز عبارتند از مجموعه داده های آموزشی، تعداد دوره ها، اندازه مینی دسته ها و نرخ یادگیری (eta).
داده های تست در صورت درخواست در دسترس هستند. زمانی که در نهایت این شبکه را ارزیابی کنیم، داده های آزمایشی را ارائه خواهیم کرد. تعداد نمونه ها در این تابع در ابتدا به طول لیست تنظیم می شود، زمانی که داده های آموزشی به یک نوع لیست تبدیل شد.
ما همچنین فرآیند مشابهی را برای آزمایش دادههای ارائه شده اعمال میکنیم. این به این دلیل است که بهجای اینکه بهعنوان فهرست به ما بازگردانده شوند، آنها واقعاً فهرستهای فشرده هستند. هنگامی که نمونه داده های MNIST را بعداً بارگذاری می کنیم، بیشتر در مورد این موضوع یاد خواهیم گرفت.
اگر بتوانیم مطمئن شویم که هر دو نوع داده را به عنوان فهرست ارائه می کنیم، این نوع ریخته گری لزوما ضروری نیست.
هنگامی که داده ها را در اختیار داریم، دوره های آموزشی را در یک حلقه مرور می کنیم. دوره آموزشی تنها یک دور آموزش شبکه عصبی است. ما ابتدا داده ها را در هر دوره به هم می زنیم تا از تصادفی بودن قبل از تهیه لیستی از مینی دسته ها اطمینان حاصل کنیم.
تابع mini batch به روز رسانی، که در زیر مورد بحث قرار گرفته است، برای هر mini-batch فراخوانی می شود. در صورت در دسترس بودن داده های تست، دقت تست نیز برگردانده می شود.
تابع کمکی مشتق هزینه
بیایید ابتدا یک تابع کمکی به نام مشتق هزینه ایجاد کنیم قبل از اینکه واقعاً کد پس انتشار را ایجاد کنیم. اگر در لایه خروجی خود اشتباه کنیم، تابع مشتق هزینه آن را نشان می دهد.
به دو ورودی نیاز دارد: آرایه فعال سازی خروجی و مختصات y مقادیر خروجی پیش بینی شده.
تابع پس انتشار
بردار فعال سازی فعلی ما، فعال سازی، و همچنین هر بردار فعال سازی، فعال سازی، و بردار z، zs، همگی باید در نظر گرفته شوند. ابتدا لایه ای به نام لایه ورودی فعال می شود.
پس از قرار دادن هر سوگیری و وزن، آنها را بررسی می کنیم. هر حلقه شامل محاسبه بردار z به عنوان حاصل ضرب نقطهای وزنها و فعالسازی، افزودن آن به فهرست zs، محاسبه مجدد فعالسازی و افزودن فعالسازی بهروز شده به فهرست فعالسازیها است.
در نهایت، ریاضی. دلتا که برابر با خطای لایه قبلی ضرب در عدد اول سیگموید آخرین عنصر از بردارهای zs است، قبل از شروع عبور به عقب محاسبه می شود.
آخرین لایه nabla b به عنوان دلتا تنظیم شده است، و لایه نهایی nabla w به عنوان حاصلضرب نقطه ای دلتا و لایه دوم تا آخرین فعال سازی (تبدیل شده تا بتوانیم عملاً محاسبه را انجام دهیم) تنظیم شده است. .
مثل قبل ادامه می دهیم و از لایه دوم شروع می کنیم و با لایه آخر به پایان می رسیم و بعد از تکمیل این لایه های آخر کار را تکرار می کنیم. سپس نابلاها به صورت تاپلی پس داده می شوند.
در حال بهروزرسانی نزول گرادیان دستهای کوچک
روش SGD (نزول گرادیان تصادفی) ما از قبل شامل بهروزرسانی مینی دستهای است. از آنجایی که در SGD استفاده می شود، اما به پشتیبان نیز نیاز دارد، من بحث کردم که این تابع را کجا قرار دهم.
در نهایت تصمیم گرفتم آن را در اینجا پست کنم. با تولید 0 بردار از نابلای بایاس ها و وزن ها، درست مانند تابع backprop ما شروع می شود.
به mini-batch و نرخ یادگیری eta به عنوان دو ورودی نیاز دارد. در mini-batch، سپس از تابع backprop برای بدست آوردن دلتای هر آرایه nabla برای هر ورودی x و خروجی y استفاده می کنیم. سپس لیست های نابلا با این دلتاها به روز می شوند.
در نهایت، از نرخ یادگیری و nablas برای بهروزرسانی وزنها و سوگیریهای شبکه استفاده میکنیم. هر مقدار به جدیدترین مقدار، کمتر از نرخ یادگیری، در اندازه کوچک ضرب می شود و سپس به مقدار نابلا اضافه می شود.
عملکرد را ارزیابی کنید
تابع ارزیابی آخرین موردی است که باید بنویسیم. داده های تست تنها ورودی برای این تابع است. در این تابع فقط خروجی های شبکه را با نتیجه پیش بینی شده y مقایسه می کنیم. با تغذیه ورودی، x، فوروارد، خروجی های شبکه مشخص می شود.
کد کامل
وقتی همه کدها را با هم ترکیب می کنیم، به این شکل ظاهر می شود.
تست شبکه عصبی
در حال بارگیری داده های MNIST
La داده های MNIST با فرمت pkl.gz است که با استفاده از GZIP باز می کنیم و با ترشی بارگذاری می کنیم. بیایید یک روش سریع برای بارگذاری این دادهها بهعنوان یک تاپیک در اندازه سه بنویسیم که به دادههای آموزشی، اعتبارسنجی و آزمایشی تقسیم میشود.
برای اینکه مدیریت دادههایمان آسانتر شود، تابع دیگری را برای رمزگذاری y در یک آرایه 10 موردی مینویسیم. آرایه همه 0 ها خواهد بود به جز 1 که با رقم مناسب تصویر مطابقت دارد.
ما از دادههای بارگذاری اولیه و یک روش کدگذاری داغ برای بارگیری دادههای خود در قالبی قابل خواندن استفاده میکنیم. تابع دیگری نوشته خواهد شد که مقادیر x ما را به لیستی با اندازه 784، مطابق با 784 پیکسل تصویر، و مقادیر y ما را به شکل بردار کدگذاری شده داغ تبدیل می کند.
سپس مقادیر x و y را طوری ترکیب می کنیم که یک شاخص با دیگری مطابقت داشته باشد. این امر در مورد مجموعه داده های آموزش، اعتبار سنجی و آزمایش اعمال می شود. سپس داده های تغییر یافته را برمی گردانیم.
در حال اجرا تست ها
ما یک فایل جدید به نام "mnist loader" می سازیم که هم شبکه عصبی را که قبلا ایجاد کردیم (nn ساده) و هم بارکننده مجموعه داده MNIST را قبل از شروع آزمایش وارد می کند.
در این فایل تنها کاری که باید انجام دهیم این است که داده ها را وارد کنیم، شبکه ای با اندازه لایه ورودی 784 و اندازه لایه خروجی 10 بسازیم، تابع SGD شبکه را روی داده های آموزشی اجرا کنیم، سپس با استفاده از داده های تست آن را تست کنیم.
به خاطر داشته باشید که برای لیست لایه های ورودی ما، تفاوتی نمی کند که هر یک از اعداد بین 784 و 10 باشد. ما می توانیم لایه های دیگر را هر طور که دوست داریم تغییر دهیم. فقط اندازه ورودی و خروجی ثابت است.
سه لایه لازم نیست. ما ممکن است از چهار، پنج یا حتی فقط دو استفاده کنیم. از آزمایش کردن با آن لذت ببرید.
نتیجه
در اینجا، با استفاده از پایتون 3، یک شبکه عصبی از ابتدا ایجاد می کنیم. در کنار ریاضیات سطح بالا، در مورد ویژگی های پیاده سازی نیز بحث کردیم.
ما با اجرای توابع کمکی شروع کردیم. برای عملکرد نورون ها، توابع اول سیگموئید و سیگموئید بسیار مهم هستند. سپس تابع پیشخور را که فرآیند اساسی برای تغذیه دادهها به شبکه عصبی است، در عمل قرار میدهیم.
سپس، تابع نزول گرادیان را در پایتون، موتوری که شبکه عصبی ما را هدایت میکند، ایجاد کردیم. به منظور تعیین موقعیت «مینیمم های محلی» و بهینه سازی وزن ها و سوگیری های آنها، شبکه عصبی ما از شیب نزول استفاده می کند. ما تابع backpropagation را با استفاده از آن ایجاد کردیم نزول شیب.
با ارائه بهروزرسانیها زمانی که خروجیها با برچسبهای مناسب مطابقت ندارند، این تابع شبکه عصبی را قادر میسازد تا «یادگیری» کند.
در نهایت، ما پایتون کاملاً جدید خود را قرار دادیم شبکه های عصبی برای آزمایش با استفاده از مجموعه داده های MNIST. همه چیز به آرامی عمل کرد.
برنامه نویسی مبارک!
پاسخ دهید