در این نوشته هم می خواهیم کاربردی از شبکه های عصبی برای شناسایی شماره های دست نویس را بگوییم و هم این که می خواهیم مفاهیم پیشین را بررسی دوباره و برخی از ویژگی ها و مفاهیم دیگر Keras را به شما بشناسانیم. در این نوشته می خواهیم از مجموعه داده درونی و از پیش آماده mnist در Keras کمک بگیریم. همه مجموعه داده های درون Keras بدست ماژول keras.datasets در دسترس هستند.

در این نوشته خواهید دید که لایه پنهان، لایه ای اختیاری است و از میان سه لایه، تنها دو لایه ورودی و خروجی باید باشد. همچنین چگونگی بارگذاری مجموعه داده های درونی Keras و شکستن آنها به دو زیر مجموعه داده یادگیری و مجموعه داده آزمایش را نشان خواهیم داد. کد زیر همه کلاس هایی از Keras که برای پیاده سازی این پروژه نیاز داریم را به برنامه پیوست می کند.

در زیر همه متغیرهایی که در ادامه به آنها نیاز داریم، شناسانده (تعریف) شده اند. باید با برخی از آنها مانند NB_EPOCH و BATCH_SIZE آشنا باشید. NB_CLASSES برابر با 10 است، زیرا شمارگان (تعداد) کلاس های ما برابر با 10 شماره 0 تا 10 است. RESHAPED متغیری با شماره 784 است زیرا داده ها، ماتریس های تصویرهای 28x28 هستند که هر درایه ماتریس شماره پیکسل است که میان بازه 0 تا 255 است ولی بر پایه گفته های پیشین:

  • ورودی شبکه عصبی و فریم ورک Keras باید بردار (Vector) باشد، که ماتریس 28x28 یک بردار 784=28*28 درایه ای است. بنابراین ما دارای 784 ویژگی هستیم که از این رو، لایه ورودی ما دارای 784 نورون خواهد بود.
  • نرمال سازی باید بر روی آن انجام شود به گونه ای که شماره پیکسل ها میان بازه [1, 0] باشد. بنابراین همه درایه های بردار بر شماره 255 تقسیم می شوند.

کد زیر داده های mnist را درون برنامه بارگذاری می کند و دو زیر مجموعه یادگیری (متغیرهای X_train و y_train) و آزمایش (متغیرهای X_test و y_test) را می سازد. در شکل های زیر می بینید برای نمونه شکل متغیر X_test به گونه 60000 نمونه ماتریس 28 سطر و 28 ستونی است ولی y_train تنها دارای 60000 نمونه یا برداری با 60000 درایه است.

چرایی (دلیل) آنها چیست؟ برای این است که X_train داده های آموزشی یا همان ماتریس یا همان ویژگی هها هستند که در این نمونه، ماتریس های 28x28 هستند. همچنین 60000 شمارِ (تعداد) نمونه های درون مجموعه یادگیری است. ولی y_train، یک بردار (تک ستون) است که کلاس هر نمونه از X_train را نشان می دهد. در دنباله، کدهای زیر نخست هر دو مجموعه داده X_train و X_test که هر دو در برگیرنده ویژگی ها هستند را از ماتریس های دو بعدی به بردارهای 784 درایه ای نگاشت می دهند.

ولی چرا یکی دارای 60000 نمونه و دیگری دارای 10000 نمونه است؟ پاسخ آن است که X_train مجموعه داده یادگیری است که در برگیرنده ویژگی ها است و چون می خواهیم درون متد ()fit آن را برای ساختن و آموزش (Train کردن) مدل به کار ببریم، پس باید دارای نمونه های بیشتری از مجموعه داده نخستین (اولیه باشد). در برابر این، X_test مجموعه داده آزمایش است که بازهم در برگیرنده ویژگی ها است ولی با این می خواهیم مدل را با ویژگی های تازه ارزیابی کنیم، پس نیازی به نمونه های به اندازه مجموعه داده یادگیری نیست.

سپس به کمک متد ()astype از ماژول NumPy، همه شماره های بردارهای X_train و X_test را به گونه float32 می بریم. float32، گونه (Data Type) پسندیده برای پردازش GPU است. در دنباله آن با تقسیم هر دو درایه بر شماره 255، همه شمارهای پیکسل نرمال سازی شده و به بازه [1, 0] می روند. چرایی (دلیل) اینکه بر 255 تقسیم کردیم این است که این شماره بزرگترین شماره برای هر پیکسل است. شکل زیر shape متغیر X_train را نشان می دهد که می بینید 60000 نمونه داریم که هر نمونه یک بردار 784 درایه ای است.

انجام One Hot در فریم ورک Keras

در نوشته های اداره کردن داده های رسته ای – کد گذاری One-Hot و کلاس های LabelEncoder و OneHotEncoder در ماژول Scikit-Learn درباره کدگذاری One Hot و درنوشته طبقه بندی چند کلاسی در شبکه عصبی با Keras درباره به کارگیری آن، گفتیم، پس در اینجا بی آنکه به این مفهوم بپردازیم، می گوییم که متد ()to_categorical از keras.utils همین مفهوم را در فریم ورک Keras پیاده سازی می کند. به گفته دیگر، ()to_categorical یک بردار (Vector) از کلاس ها را به یک ماتریس کلاس های دودویی دگرگون (تبدیل) می کند. آرگومان نخست آن یک بردار از کلاس ها و آرگومان دوم شمارگان (تعداد) کلاس ها و آرگومان پایانی گونه یا Data Type است. توجه کنید که N_CLASSES در این نوشته شمارگان (تعداد) کلاس ها را نگه می دارد.

ساخت مدل

اکنون با کدهای زیر می خواهیم مدل دو لایه ای را بسازیم، بنابراین تنها دو لایه Input و Output داریم که چون در متد ()add یکم، چون آرگومان نخست یا همان unit برابر با N_CLASSES است، پس شمار خروجی این لایه برابر با 10 است و چون آرگومان input_shape تاپلی است که آرگومان نخست آن متغیر RESHAPED است، پس لایه ورودی دارای 784 نورون است. فراخوانی دوم ()add تابع فعال سازی softmax را به کار برده که برای طبقه بندی چند کلاسی پسندیده است. در پایان متد ()summary فراخوانی شده که خلاصه ای از مدل را نشان می دهد.

ساخت مدل

اکنون با کدهای زیر می خواهیم مدل دو لایه ای را بسازیم، بنابراین تنها دو لایه Input و Output داریم که چون در متد ()add یکم، چون آرگومان نخست یا همان unit برابر با N_CLASSES است، پس شمار خروجی این لایه برابر با 10 است و چون آرگومان input_shape تاپلی است که آرگومان نخست آن متغیر RESHAPED است، پس لایه ورودی دارای 784 نورون است. فراخوانی دوم ()add تابع فعال سازی softmax را به کار برده که برای طبقه بندی چند کلاسی پسندیده است. در پایان متد ()summary فراخوانی شده که خلاصه ای از مدل را نشان می دهد.

کامپایل و آموزش مدل

دو کد زیر به ترتیب چگونگی کامپایل کردن و آموزش دادن (یا Train کردن) مدل را نشان می دهند. کامپایل که در نوشته های پیشین گفته شده ولی در متد ()fit زیر یک آرگومان تازه و آن هم validation_split را نوشته ایم که در اینجا به آن خواهیم پرداخت. توجه کنید در آغاز متغیری به نام VALIDATION_SPLIT ساخته ایم که مقدار آن 0.2 است. مقدار این پارامتر شماره ممیز شناور دربازه [1, 0] است و اندازه ای از داده یادگیری را نشان می دهد که در زمان آموزش برای Validation به کار می رود.

ارزیابی مدل

در اینجا چون آن را 0.2 گرفتیم، پس 20 درصد از همه داده های یادگیری برای Validation به کار می روند. در پایان و درون متد ()evaluate کردن مدل، دو مجموعه داده X_test و Y_test برای ارزیابی به کار رفته اند. برای درک بهتر مفهوم Accuracy پیشنهاد می کنم نوشته ارزیابی الگوریتم طبقه بندی در Scikit-Learn را بخوانید. Accuracy و Precision و Recall سه معیار ارزیابی هستند.

دانلود سورس این مطلب Keras Recognizing Handwritten Digits

توجه کنید که در این نوشته، تنها دو لایه ورودی و خروجی را داریم و لایه پنهان را نَشناساندیم، بنابراین در نوشته پَسین درباره لایه پنهان و چگونگی کارساز (تاثیر) آن بر بهبود کارایی شبکه عصبی سخن خواهیم گفت. در نوشته پسین درباره بهبود شبکه و بهبود دهنده ها (Optimizer) بیشتر سخن خواهیم گفت. همچنین اگر فهمیده باشید، هنوز متد ()predict را برای پیش بینی با ورودی های تازه انجام نداده ایم.