رفتن به نوشته‌ها

شبکه‌های عصبی بازگشتی – قسمت دوم (پیاده‌سازی)

در قسمت قبلی با مفاهیم مربوط به شبکه بازگشتی ساده (Simple RNN) آشنا شدیم. در این قسمت اون چیزی که گفته شد رو با استفاده از تنسورفلو (در واقع کراس) پیاده‌سازی میکنیم. برای همین یک شبکه بسیار ساده برای تشخیص احساسات متن (sentiment) روی دادگان IMDB آموزش میدهیم.

خب اولین کاری که باید انجام بدید این هست که تنسورفلو رو نصب کنید. برای اینکه تنسورفلو رو چطوری نصب کنید میتونید به این لینک مراجعه کنید. ولی به طور کلی میتونید با دستور زیر تنسورفلو رو نصب کنید:

خب بعد از اینکه تنسورفلو رو نصب کردید یک پروژه پایتون درست کنید (ترجیحا پایتون ۳) و چک کنید ببینید که آیا تنسورفلو به درستی نصب شده است یا خیر. برای اینکار میتونید دستور زیر رو اجرا کنید و اگر خروجی داد یعنی اینکه موفقیت‌آمیز بوده است.

خب امیدوارم که تونسته باشید نصبش کرده‌ باشید.

در مرحله اول لازم است که دادگان IDMB رو دانلود کنید. خوشبختانه تنسورفلو این دادگان رو در ماژول dataset قرار داده است و شما به راحتی با کمک دستور زیر به داده‌های آموزش و آزمون دسترسی پیدا کنید.

معمولا در هر دادگانی تعدادی کلمه وجود دارند که فرکانس آنها بسیار کم است و عملا در شبکه آموزش نمیبیند. برای اینکه از این موضوع جلوگیری کنیم همانطور که در دستور بالا میبینید تنها ۱۰۰۰۰ کلمه پرکاربرد را انتخاب میکنیم و مابقی کلمات دور ریخته میشوند (به طور دقیق‌تر کلماتی که جز این ۱۰۰۰۰ کلمه پرکاربرد نباشد، نادیده گرفته میشوند). همچنین هر کلمه به یک آیدی نگاشت میشود و در نتیجه جمله اول داده‌های آموزش به صورت زیر خواهد بود (ورودی شبکه عصبی باید به عددی باشد و به همین خاطر ما این نگاشت را انجام میدهیم):

در شبکه‌های عصبی برای اینکه بتوانیم به صورت دسته‌ای (batch) آموزش بدهیم، لازم است تا طول جملات ما یکسان باشند (مثلا همه جملات طولشون ۲۰۰ در نظر گرفته شود). بخاطر همین باید کاری کنیم که طول تمام جملات پیکره ما یکسان شوند. کاری که معمولا صورت میگیرد این است که به انتهای یا ابتدای جمله 0 اضافه میشود. ما هم همین کارو میکنیم و همه جملات رو به طول ثابت ۲۵۶ میبریم:

که اگر حالا جملات رو چاپ کنیم چیزی شبیه زیر خواهیم داشت:

همانطور که در بالا دیدید هنگام دانلود، داده‌های ما به دو قسمت تقسیم شدند آموزش و آزمون (test و train). برای اینکه بتونیم پارامترها رو تنظیم کنیم بهتر است که داده‌های validation هم ایجاد کنیم. برای اینکار ۱۰۰۰۰ نمونه از داده‌های آموزش رو برای validation در نظر میگیریم:

خب حالا به تعریف مدل میرسیم. همانطور که در قسمت شبکه‌های عصبی بازگشتی دیدیم، اینجوری بود که ما داده‌هامون رو به بردارهای نهفته (embedding) (مثلا ورد۲وک) تبدیل میکردیم و سپس به شبکه بازگشتی میدادیم و در نهایت یک بردار چگال (dense) به دست می‌آوردیم و از اون برای دسته‌بندی استفاده میکردیم. همین کار و دقیقا میتونیم اینجا هم انجام بدیم و برای اینکار به صورت زیر عمل میکنیم:

به طور کلی کراس دو تا API برای ساختن مدل‌ها ارائه میکند که یکی Sequential و دیگری Functional است. که در اینجا ما از Sequential استفاده کردیم و یکی یکی لایه‌هامون رو بهش اضافه کردیم. و در نهایت هم مدل رو کامپایل کردیم. برای بهینه کننده از آدم و برای سنجش از معیار دقت (accuracy) استفاده کردیم. و چون تسک ما تشخیص اینکه یک کامنت مثبت است یا منفی از binary_crossentropy استفاده شده است.

تنها نکته‌ای که در بالا احتمالا براتون وجود داشته باشه لایه‌ی embedding هست. ما میتونیم از لایه‌های از قبل آموزش داده شده استفاده کنیم (که این بهتر است) و هم اینکه خودمون لایه‌ embedding تعبیه کنیم. در اینجا برای سادگی من یک لایه embedding درست کردم که اندازه اش ماتریس ۱۰۰۰۰ (تعداد کلمات) و طول هر بردارش ۱۶ است.

 

برای آموزش تنها کافی است که داده‌های آموزش و برچسب آنها را به مدل بفرستید و تعداد epochها و اندازه batch رو مشخص کنید:

و در نهایت هم میتونید روی دادگان آزمون (test) دقت مدل خودتون رو ارزیابی کنید:

شما تونستید یک شبکه عصبی بازگشتی درست کنید و آموزش بدید و روی دادگان idmb اون رو تست کنید 🙂

پیاده‌سازی کامل با کراس را میتوانید از اینجا مشاهده کنید.

پیاده‌سازی کامل با تنسورفلو را میتوانید از اینجا مشاهده کنید.

منتشر شده در آموزشتنسورفلویادگیری عمیق

اولین باشید که نظر می دهید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *