در نوشته های  درباره شبکه عصبی پرسپترون و همچنین درباره کتابخانه Keras و Tensorflow سخن گفتیم. در اینجا می خواهیم طبقه بندی چند کلاسی با کتابخانه Keras را آموزش دهیم. طبقه بندی چند کلاسی، دسته ای از طبقه بندی است که در آن، با ورود داده ها به مدل ساخته شده، پاسخ از میان یکی از سه یا بیشتر کلاس برگزیده می شود. برای نمونه، تشخیص شماره دست نویس (Digit Handwritten)، یکی از این نمونه ها است که در آن، شمارگان (تعداد) کلاس ها برابر 10 است که برابر با 10 شماره 0 تا 9 هستند.

طبقه بندی داده ها در یادگیری ماشین

Iris نام یکی از محموعه داده های رایج است که درآن 120 نمونه از 4 ویژگی سه گونه گیاهی هست، بنابراین در این مجموعه داده سه کلاس هست و با داشتن 4 ویژگی، یکی از این سه کلاس در پاسخ شبکه عصبی خواهند بود. این سه کلاس یا گونه کلاسی، Setosa و  Versicolor و Verginica نام دارند. در پیوند زیر، درباره بارگذاری داده های Iris در کتابخانه Scikit-Learn سخن گفته ایم، بنابراین پیشنهاد می کنم آن را پیش از هر چیز بخوانید.

در اینجا می خواهیم به کمک Keras یک شبکه با سه لایه ورودی، پنهان و خروجی را بسازیم. با توجه به آنچه که در نوشته های پیشین گفته شده است، شمارگان (تعداد) نورون های لایه ورودی و لایه خروجی چندتا است؟ با توجه به این مسئله، چون مجموعه داده دارای 4 ویژگی هست، پس لایه ورودی باید دارای چهار نورون باشد، بهتر است بگوییم ورودی شبکه، یک بردار 4 درایه ای است. همچنین چون، مجموعه داده دارای سه کلاس هست، پس لایه خروجی باید دارای سه نورون باشد. همچنین یک لایه پنهان نیز داریم که این لایه را در اینجا می توانیم با پنج یا شش نورون بسازیم.

در یادگیری ماشین و یادگیری ژرف، نیاز به دو مجموعه داده به نام داده یادگیری و داده آزمایش داریم. با مجموعه داده یادگیری مدل را آموزش می دهیم که اصطلاحا می گوییم مدل را Train می کنیم. پس از ساخت مدل، باید داده های آزمایش را برای ارزیابی مدل به کار ببریم. به طور کلی در Keras باید گام های زیر را برای ساخت مدل، تا انجام پیش بینی، انجام دهیم.

  • آماده سازی داده ها، زیرا باید به یک بردار دگرگون شوند. این به ویژه در ماتریس تصویرها مهم است.
  • ساخت معماری شبکه، که شامل تعیین شمار لایه ها و شمار نورون ها است. در اینجا همان مدل Sequential را به کار می بریم.
  • پارامتر دیگری که باید مشخص کنیم، تابع فعال ساز است.
  • همانگونه که گفتیم وزن ها تصادفی برگزیده می شوند ولی در شبکه های عصبی مفهوم دیگری به نام بازگشت به عقب است که آن برای بهبود شبکه به کار می رود، به این گونه که شماره وزن ها بروز می شوند.
  • سپس باید مدل را با متد ()compile، کامپایل کنیم.
  • پس از آن باید، متد ()fit را برای انجام آموزش مدل یا همان Train کردن مدل به کار ببریم.
  • در پایان، باید با ورود مقدارهای تازه، پیش بینی را با متد ()predict انجام دهیم.

بارگذاری داده های Iris از کتابخانه Scikit Learn درون یک پروژه Keras

توجه کنید که مجموعه Keras در فرمت CSV از روی وب قابل دریافت است و شما می توانید فایل CSV را درون پروژه خود بارگذاری کنید. ولی در اینجا برای یادآوری کتابخانه Scikit Learn می خواهیم از نوشته بار گذاری داده ها در کتابخانه Scikit-Learn کمک بگیریم، تا بتوانیم داده های Iris را درون پروژه Keras داشته باشیم. پس برای درک کدهای زیر، پیش از هر چیز باید نوشته بار گذاری داده ها در کتابخانه Scikit Learn را بخوانید. همچنین کدهای زیر، همه کلاس هایی که برای انجام طبقه بندی چند کلاسی نیاز داریم را فهرست کرده اند.

در پنج بَند (خط) نخست، داده ها به کمک متد ()load_iris خوانده شده و سپس در متغیری به نام iris نگهداری می شوند. خود داده ها یا همان 120 سطر چهار ویژگی، در اندیسی به نام data و 120 سطر برچسب ها (Label) در اندیسی به نام target هستند، پس بندهای 2 و 3 این دو سری داده را در متغیرهای جدا نگهداری می کنند. در نهایت نام برچسب ها یا همان کلاس ها و نام ویژگی ها دردو متغیر جدا نگهداری می شوند. برای فهمیدن بهتر درباره واژه های ویژگی (Feature) و برچسب می توانید پیوند زیر را بخوانید.

مفاهیم و واژگان در یادگیری ماشین

پس از این باید داده ها را برای به کار بردن در Keras آماده کنیم، پس دو کلاس ()OneHotEncoder و ()StandardScaler را به کار می بریم. توجه کنید بر پایه نخستین خروجی زیر، داده های target (یا همان برچسب) شماره های 0 و 1 و 2 هستند و انگیزه از ()OneHotEncoder در این است که می خواهیم شماره های 0 و 1 و 2 را به بردارهای دودویی دگرگون کنیم. دومین خروجی شکل زیر این دگرگونی را نشان می دهد که در آن شماره صفر در همه سطرها به شماره دودویی 1.0.0 نگاشت داده شده است.

اداره کردن داده های رسته ای – کد گذاری One-Hot

کلاس های LabelEncoder و OneHotEncoder در ماژول Scikit-Learn

توجه کنید که تا کنون، دو متغیر Y در برگیرنده شماره دودویی برچسب ها و X_scale دربرگیرنده سطرهایی است که هر سطر چهار ویژگی را در خودش نگه می دارد. اکنون می خواهیم با متد ()train_test_split، مجموعه داده های نخستین (اولیه) را به دو زیر مجموعه یادگیری و آزمایش بشکنیم. این متد در نوشته ایجاد داده های یادگیری و آزمایش در Scikit-Learn زیر آموزش داده شده است.

نمایش دادن داده ها

Data Visualization یا نمایش دادن (مصور سازی) داده، خودش یکی از زمینه های پژوهشی است که می توانید آن را برای پایانامه خود برگزینید ولی در اینجا تنها می خواهیم با کمک کتابخانه matplotlib.pyplot به شما مفهوم طبقه بندی چند کلاسی را آموزش دهیم. کدهای زیر چگونگی نمایش دادن داده ها، برای دو ویژگی sepal length و petal length را نشان می دهد. توجه کنید هر چهار ویژگی، به یک کلاس تعلق دارد بنابراین صرف نظر از دو ویژگی دیگر، در شکل های زیر، می بینید که داده های سطرهای متفاوت، مربوط به کدام کلاس ها هستند که با نقطه های رنگی گوناگون نشان داده شده اند. بنابراین انگیزه از Multiple Classification این است که بدانیم با داشتن داده های تازه برای هر چهار ویژگی، مدل ساخته شده کدام کلاس را پیش بینی می کند.

پیکربندی شبکه عصبی

نخستین گام در به کارگیری شبکه عصبی، پیکربندی شبکه است. همچنین پیش از این گفتیم که Sequential ساده ترین شیوه پیکربندی شبکه عصبی در Keras است که هر لایه، پس از دیگری افزوده می شود. در کدهای زیر، نخست نمونه به نام model از کلاس Sequential ساخته ایم. سپس باید لایه های ورودی، پنهان و خروجی را در شبکه عصبی بشناسانیم (معرفی کنیم). در کد زیر، نخسین متد ()add، لایه ورودی با 4 نورون را پیاده سازی می کند، زیرا در تابع سازنده کلاس Dense، آرگومان input_dim برابر 4 تعیین شده است. شمار نورون ها در لایه ورودی، برابر شمار ویژگی ها (در اینجا 4) است.

اگر خوب دقت از میان سه متد ()add، تنها نخستین است که مقدار آرگومان input_dim تعیین شده است، زیرا این نخستین فراخوانی متد ()add همان لایه ورودی را می سازد و تنها همین لایه است که آشکارا از بیرون شبکه عصبی، داده ها را دریافت می کنند. گفتیم که مدل Sequential، مدلی است که هر لایه در پی لایه پیشین افزوده می شود، پس در اینجا ()add نخست، لایه ورودی و ()add پایانی، لایه خروجی را می سازند.

پس از آنکه ساختار مدل را شناساندیم (تعریف کردیم)، باید مدل را کامپایل کنیم که برای این، باید متد ()compile فراخوانی شود. در ساده ترین گفتار، کامپایل، برگردان کدهای Keras به کدهای فریم ورک Backend است که در اینجا، ما TensorFlow را به کار برده ایم. دو آرگومان optimizer و loss، شیوه بهینه سازی و تابع هزینه را نشان می دهند که پس از کامپایل، متد ()fit می داند چگونه و با کدامین ویژگی ها، مدل را آموزش دهید (یا Train کند). برای طبقه بندی چند کلاسی، تابع هزینه categorical_crossentropy به کار می رود ولی می توانید mean_squared_error را نیز به کار ببرید. در متد ()cmpile، آرگومان metrics اختیاری است و برای نمونه در کد بالا، یک لیست که تنها دارای یک رشته به نام accuracy هست به آرگومان فرستاده شده است.

ارزیابی الگوریتم طبقه بندی در Scikit-Learn

یادگیری و ارزیابی مدل

دو آرگومان نخست متد ()fit، داده های ویژگی و داده های برچسب (یا کلاس ها) هستند. پیش از این به کمک ()OneHotEncoder دگرگونی بر روی برچسب های نخستین y ((خط 3 از دومین قطعه کد) انجام دادیم و نتیجه را در متغیر تازه ای به نام Y (خط 8 از دومین قطعه کد) نگهداری کردیم. همچنین پس از نرمال سازی داده های ویژگی ها که در متغیر X (خط 2 از دومین قطعه کد) بودند، نتیجه برگشتی در متغیر تازه ای به نام X_scaled (خط 11 از دومین قطعه کد) نگهداری شد. همچنین نتیجه برگشتی متد ()train_test_split از Scikt-Learn نیز در چهار متغیر زیر نگهداریمی شود که جایگاه به کارگیری هر یک را گفته ایم:

  • X_train: این متغیر برای ساخت مدل و به عنوان آرگومان یکم به متد ()fit در زیر فرستاده می شود.
  • X_test: این آرگومان برای اریابی مدل و به عنوان آرگومان یکم به متد ()evaluate فرستاده می شود.
  • Y_train: این متغیر برای ساخت مدل و به عنوان آرگومان دوم به متد ()fit در زیر فرستاده می شود.
  • Y_test: این آرگومان برای اریابی مدل و به عنوان آرگومان دوم به متد ()evaluate فرستاده می شود.

در کد زیر این دو متغیر آرگومان های یکم و دوم متد ()fit هستند. دو آرگومان دیگر، epoch و batch_size هستند که مقدار آنها به ترتیب در متغیرهای max_epoch و batch_size نگهداری می شود. شکل زیرخروجی متد ()fit برای 10 epoch را نشان می دهد و همانگونه که می بینید، خطا یا loss در آغاز 0.9089 و در دهمین، 0.3081 است، بنابراین می بینید در هر epoch، اندازه خطا کاهش و اندازه دقت یا acc بالا رفته است.

مفاهیم Epoch و Batch Size در شبکه عصبی و یادگیری ژرف

بنابراین در این نوشته، خواستیم بررسی دوباره ای بر روی مفاهیم پیش از این داشته باشیم و به شما چگونگی پیاده سازی یک شبکه عصبی ساده پرسپترون را نشان دهیم. بازهم برای یادآوری، در پایان فهرست برخی از موردها را یادآوری می کنیم که دانستن و یاد سپاری آنها سودمند است.

  • شبکه عصبی که چندین لایه پنهان باشند را یادگیری ژرف می گوییم. در این نوشته، ما شبکه ساده پرسپترون را پیاده سازی کردیم.
  • شمارگان ورودی لایه پنهان برابر با شمارگان ویژگی ها و شمارگان خروجی های لایه خروجی، برابر با شمارگان کلاس ها است.
  • آرگومان input_dim شمارگان ورودی را برای یک لایه در تابع سازنده Dense نشان می دهد و این باید برای لایه ورودی نشان داده شود. بنابراین در لایه ورودی، این آرگومان برابر با شمارگان ویژگی ها است.
  • آرگومان unit شمارگان خروجی یک لایه را نشان می دهد. بنابراین در لایه خروجی، این آرگومان برابر با شمارگان کلاس ها در مجموعه داده ها است. برای نمونه در شناسایی شماره های دست نویس، چون 10 شماره و از این رو 10 کلاس داریم، پس این آرگومان 10 خواهد بود.
  • اگر در متد ()fit اندازه آرگومان batch_size برابر با 1 باشد، این را Online Training می گوییم. بنابراین می توانیم همانند کد زیر، شماره دیگری برای آن برگزینیم.

ارزیابی مدل

پس از ساخت و آموزش مدل، پیش از انجام پیش بینی، باید مدل را به کمک داده های آزمایش، ارزیابی کنیم. به کمک متد ()split_train_test چهارمتغیر X_train و X_test و Y_train و Y_test را ساختیم و از دو متغیر X_train و Y_train مدل را با متد ()fit ساختیم و اکنون می خواهیم دو متغیر X_test و Y_test را در کد زیر به کار ببریم تا مدل را ارزیابی کنیم. در اینجا مقدار هزینه (loss) و دقت (accuracy) برای این مثال برابر با 0.467010 و %80.00 هستند.