وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مقدمه ای بر شبکه های عصبی با Scikit-Learn

0 28
زمان لازم برای مطالعه: 9 دقیقه


شبکه عصبی چیست؟

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

در این مقاله، ما فقط به طور خلاصه مرور می‌کنیم که شبکه‌های عصبی چیست، مراحل محاسباتی که یک شبکه عصبی طی می‌کند (بدون اینکه وارد ریاضیات پیچیده پشت آن شویم) چیست و چگونه می‌توان با استفاده از Scikit-Learn پیاده‌سازی کرد. یک کتابخانه محبوب هوش مصنوعی برای پایتون.

سیستم عصبی انسان

سیستم عصبی انسان از میلیاردها نورون تشکیل شده است. این نورون ها در مجموع process ورودی دریافتی از اندام های حسی، process اطلاعات، و تصمیم بگیرید که در واکنش به ورودی چه کاری انجام دهید. یک نورون معمولی در سیستم عصبی انسان دارای سه بخش اصلی است: دندریت، هسته و آکسون. اطلاعات ارسال شده به یک نورون توسط دندریت ها دریافت می شود. هسته مسئول پردازش این اطلاعات است. خروجی یک نورون از طریق آکسون به نورون های دیگر ارسال می شود که به دندریت های دیگر نورون ها در پایین تر شبکه متصل می شود.

نورون

پرسپترون ها

شبکه های عصبی مصنوعی از معماری شبکه های عصبی انسان الهام گرفته شده اند. ساده ترین شبکه عصبی تنها از یک نورون تشکیل شده است و a نامیده می شود پرسپترون، همانطور که در شکل زیر نشان داده شده است:

پرسپترون

یک پرسپترون یک لایه ورودی و یک نورون دارد. لایه ورودی به عنوان دندریت عمل می کند و وظیفه دریافت ورودی ها را بر عهده دارد. تعداد گره ها در لایه ورودی برابر با تعداد ویژگی های مجموعه داده ورودی است. هر ورودی با یک وزن (که معمولاً با مقداری تصادفی مقداردهی اولیه می شود) ضرب می شود و نتایج با هم جمع می شوند. سپس مجموع از طریق یک منتقل می شود عملکرد فعال سازی. عملکرد فعال پرسپترون شبیه هسته نورون سیستم عصبی انسان است. این اطلاعات را پردازش می کند و یک خروجی به دست می دهد. در مورد پرسپترون، این خروجی نتیجه نهایی است. با این حال، در مورد پرسپترون های چندلایه، خروجی از نورون های لایه قبلی به عنوان ورودی به نورون های لایه پیشرو عمل می کند.

شبکه عصبی مصنوعی (پرسپترون چند لایه)

اکنون که می دانیم پرسپترون تک لایه چیست، می توانیم این بحث را به پرسپترون های چندلایه یا بیشتر به عنوان شبکه های عصبی مصنوعی بسط دهیم. یک پرسپترون تک لایه می تواند مشکلات ساده ای را حل کند که در آن داده ها به صورت خطی در ابعاد ‘n’ قابل تفکیک هستند، جایی که ‘n’ تعداد ویژگی های مجموعه داده است. با این حال، در مورد داده های غیر خطی قابل تفکیک، دقت پرسپترون های تک لایه به طور قابل توجهی کاهش می یابد. پرسپترون های چند لایه، روی از سوی دیگر، می تواند با داده های غیرخطی قابل تفکیک کارآمد کار کند.

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

لایه پنهان شبکه عصبی

یک شبکه عصبی در دو فاز اجرا می شود: Feed-Forward و Back Propagation.

فید فوروارد

مراحل زیر در مرحله فید فوروارد انجام می شود:

  1. مقادیر دریافتی در لایه ورودی با وزن ها ضرب می شوند. یک سوگیری به جمع ورودی ها و وزن ها اضافه می شود تا از مقادیر صفر جلوگیری شود.
  2. هر نورون در اولین لایه پنهان، بسته به وزن و بایاس، مقادیر متفاوتی از لایه ورودی دریافت می کند. نورون ها یک تابع فعال سازی دارند که بر اساس مقدار دریافتی از لایه ورودی عمل می کند. تابع فعال سازی می تواند انواع مختلفی داشته باشد، مانند تابع گام، تابع سیگموئید، relu تابع، یا tanh تابع. به عنوان یک قاعده کلی، تابع ReLU در نورون های لایه پنهان و تابع سیگموئید برای نورون لایه خروجی استفاده می شود.
  3. خروجی های نورون های لایه پنهان اول با وزن لایه پنهان دوم ضرب می شوند. نتایج با هم جمع می‌شوند و به نورون‌های لایه‌های پیشرو منتقل می‌شوند. این process تا رسیدن به لایه بیرونی ادامه می یابد. مقادیر محاسبه شده در لایه بیرونی خروجی های واقعی الگوریتم هستند.

فاز فید فوروارد شامل این سه مرحله است. با این حال، خروجی پیش بینی شده لزوماً درست نیست. ممکن است اشتباه باشد و ما باید آن را اصلاح کنیم. هدف یک الگوریتم یادگیری این است که پیش بینی هایی را انجام دهد که تا حد امکان دقیق باشد. برای بهبود این نتایج پیش‌بینی‌شده، یک شبکه عصبی سپس از مرحله انتشار برگشتی عبور می‌کند. در طول انتشار به عقب، وزن نورون های مختلف به گونه ای به روز می شوند که اختلاف بین خروجی مورد نظر و پیش بینی شده تا حد امکان کم باشد.

انتشار پشت

مرحله انتشار برگشتی شامل مراحل زیر است:

  1. خطا با کمی کردن تفاوت بین خروجی پیش بینی شده و خروجی مورد نظر محاسبه می شود. به این تفاوت «ضرر» و تابعی که برای محاسبه اختلاف استفاده می شود «تابع ضرر» می گویند. توابع زیان می توانند انواع مختلفی داشته باشند، به عنوان مثال توابع میانگین مربعات خطا یا توابع آنتروپی متقاطع. به یاد داشته باشید، شبکه های عصبی هستند یادگیری تحت نظارت الگوریتم‌هایی که برای مجموعه‌ای از ورودی‌ها به خروجی‌های مورد نظر نیاز دارند، که به آن اجازه می‌دهد از داده‌ها یاد بگیرد.
  2. پس از محاسبه خطا، مرحله بعدی به حداقل رساندن آن خطا است. برای انجام این کار، مشتق جزئی تابع خطا با توجه به تمام وزن ها و بایاس ها محاسبه می شود. به این حالت نزول گرادیان می گویند. از مشتقات می توان برای یافتن شیب تابع خطا استفاده کرد. اگر شیب مثبت باشد، می توان مقدار وزن ها را کاهش داد و یا اگر شیب منفی بود، مقدار وزن را افزایش داد. این خطای کلی را کاهش می دهد. تابعی که برای کاهش این خطا استفاده می شود تابع بهینه سازی نامیده می شود.

این یک چرخه انتشار به جلو و عقب را یک “دوران” می نامند. این process تا رسیدن به دقت معقول ادامه می یابد. هیچ استانداردی برای دقت معقول وجود ندارد، در حالت ایده آل شما باید برای دقت 100 درصد تلاش کنید، اما دستیابی به این امر برای هر مجموعه داده غیر پیش پا افتاده بسیار دشوار است. در بسیاری از موارد دقت 90% قابل قبول در نظر گرفته می شود، اما واقعا بستگی دارد روی مورد استفاده شما

پیاده سازی شبکه عصبی با Scikit-Learn

اکنون می دانیم که شبکه های عصبی چیست و چه مراحل مختلفی را باید انجام دهیم تا بتوانیم یک شبکه عصبی ساده و متراکم را بسازیم. در این بخش سعی خواهیم کرد یک شبکه عصبی ساده بسازیم که کلاسی را که گیاه عنبیه معین به آن تعلق دارد را پیش بینی می کند. ما از پایتون استفاده خواهیم کرد Scikit-Learn کتابخانه ای برای ایجاد شبکه عصبی ما که این وظیفه طبقه بندی را انجام می دهد. دستورالعمل های دانلود و نصب برای کتابخانه Scikit-Learn در این آدرس موجود است: http://scikit-learn.org/stable/install.html

توجه داشته باشید: اسکریپت های ارائه شده به همراه این آموزش در پایتون اجرا و تست شده اند Jupyter notebook.

مجموعه داده

مجموعه داده ای که می خواهیم برای این آموزش استفاده کنیم مجموعه داده محبوب Iris است که در دسترس است https://archive.ics.uci.edu/ml/datasets/iris. جزئیات مجموعه داده در لینک فوق در دسترس است.

بیایید مستقیماً به سراغ کد برویم. اولین قدم این است که import این مجموعه داده را وارد برنامه ما کنید. برای این کار از پایتون استفاده می کنیم پانداها کتابخانه

دستور زیر را برای بارگذاری مجموعه داده iris در یک دیتافریم پایتون اجرا کنید:

import pandas as pd


url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"


names = ('sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class')


irisdata = pd.read_csv(url, names=names)

اسکریپت بالا به سادگی داده های عنبیه را دانلود می کند، نام ها را به عنوان مثال اختصاص می دهد sepal-length، sepal-width، petal-length، petal-width، و Class به ستون های مجموعه داده، و سپس آن را در بارگذاری می کند irisdata چارچوب داده

برای اینکه ببینید این مجموعه داده در واقع چه شکلی است، دستور زیر را اجرا کنید:

irisdata.head()

با اجرای اسکریپت فوق، پنج ردیف اول مجموعه داده ما، مانند شکل زیر نمایش داده می شود:

به طول کاسبرگ عرض کاسبرگ طول گلبرگ عرض گلبرگ کلاس
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa

پیش پردازش

می بینید که مجموعه داده ما پنج ستون دارد. وظیفه پیش بینی کلاس (که مقادیر ستون پنجم هستند) است که گیاه زنبق به آن تعلق دارد، که بر اساس sepal-length، sepal-width، petal-length و petal-width (چهار ستون اول). مرحله بعدی این است که مجموعه داده های خود را به ویژگی ها و برچسب ها تقسیم کنیم. برای این کار اسکریپت زیر را اجرا کنید:


X = irisdata.iloc(:, 0:4)


y = irisdata.select_dtypes(include=(object))

تا ببینم چیه y به نظر می رسد، کد زیر را اجرا کنید:

y.head()
کلاس
0 Iris-setosa
1 Iris-setosa
2 Iris-setosa
3 Iris-setosa
4 Iris-setosa

می توانید ببینید که مقادیر موجود در y سریال ها دسته بندی هستند با این حال، شبکه های عصبی با داده های عددی بهتر کار می کنند. وظیفه بعدی ما تبدیل این مقادیر مقوله ای به مقادیر عددی است. اما ابتدا بیایید ببینیم که چقدر ارزش های منحصر به فرد در خود داریم y سلسله. اسکریپت زیر را اجرا کنید:

y.Class.unique()

خروجی:

array(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'), dtype=object)

ما سه کلاس منحصر به فرد داریم: “Iris-setosa”، “Iris-versicolor” و “Iris-virginica”. بیایید این مقادیر مقوله ای را به مقادیر عددی تبدیل کنیم. برای این کار از Scikit-Learn استفاده خواهیم کرد LabelEncoder کلاس

اسکریپت زیر را اجرا کنید:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

y = y.apply(le.fit_transform)

حالا اگر دوباره مقادیر منحصر به فرد را در قسمت بررسی کنید y سری، نتایج زیر را مشاهده خواهید کرد:

array((0, 1, 2), dtype=int64)

می بینید که مقادیر مقوله ای به مقادیر عددی یعنی 0، 1 و 2 کدگذاری شده اند.

تقسیم تست قطار

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

برای ایجاد تقسیمات آموزشی و تست، اسکریپت زیر را اجرا کنید:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

اسکریپت بالا 80 درصد از مجموعه داده را به مجموعه آموزشی ما و 20 درصد دیگر را به داده های آزمایشی تقسیم می کند.

مقیاس بندی ویژگی ها

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

اسکریپت زیر مقیاس بندی ویژگی ها را انجام می دهد:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

آموزش و پیش بینی

و اکنون بالاخره زمان انجام کاری است که منتظرش بودید، آموزش شبکه عصبی که در واقع می تواند پیش بینی کند. برای این کار اسکریپت زیر را اجرا کنید:

from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(hidden_layer_sizes=(10, 10, 10), max_iter=1000)
mlp.fit(X_train, y_train.values.ravel())

بله، با Scikit-Learn، می توانید یک شبکه عصبی با این سه خط کد ایجاد کنید، که همگی بخش زیادی از کار را برای شما انجام می دهند. بیایید ببینیم در اسکریپت بالا چه اتفاقی می افتد. اولین قدم این است که import را MLPClassifier کلاس از sklearn.neural_network کتابخانه در خط دوم، این کلاس با دو پارامتر مقداردهی اولیه می شود.

پارامتر اول، hidden_layer_sizes، برای تنظیم اندازه لایه های پنهان استفاده می شود. در اسکریپت ما سه لایه 10 گره ایجاد خواهیم کرد. هیچ فرمول استانداردی برای انتخاب تعداد لایه ها و گره ها برای یک شبکه عصبی وجود ندارد و بسته به مقدار کمی متفاوت است. روی مشکل در دست بهترین راه این است که ترکیب های مختلف را امتحان کنید و ببینید چه چیزی بهترین کار را می کند.

پارامتر دوم به MLPClassifier تعداد تکرارها یا دوره هایی را که می خواهید شبکه عصبی شما اجرا کند را مشخص می کند. به یاد داشته باشید، یک دوره ترکیبی از یک چرخه فاز انتشار به جلو و عقب است.

به طور پیش‌فرض از تابع فعال‌سازی ReLU استفاده می‌شود adam بهینه ساز هزینه با این حال، می توانید این توابع را با استفاده از activation و solver پارامترها به ترتیب

در خط سوم fit تابع برای آموزش الگوریتم استفاده می شود روی داده های آموزشی ما به عنوان مثال X_train و y_train.

مرحله آخر پیش بینی است روی داده های تست ما برای انجام این کار، اسکریپت زیر را اجرا کنید:

predictions = mlp.predict(X_test)

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

ما الگوریتم خود را ایجاد کردیم و پیش بینی هایی انجام دادیم روی مجموعه داده آزمایشی اکنون زمان ارزیابی عملکرد الگوریتم ما است. برای ارزیابی یک الگوریتم، متداول ترین معیارهای مورد استفاده عبارتند از: ماتریس سردرگمی، دقت، فراخوانی و امتیاز f1. را confusion_matrix و classification_report روش های sklearn.metrics کتابخانه می تواند به ما در یافتن این نمرات کمک کند. اسکریپت زیر گزارش ارزیابی الگوریتم ما را تولید می کند:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test,predictions))
print(classification_report(y_test,predictions))

این کد بالا نتیجه زیر را ایجاد می کند:

((11  0  0)
   0  8  0)
   0  1 10))
             precision   recall   f1-score   support
          0       1.00     1.00       1.00        11
          1       0.89     1.00       0.94         8
          2       1.00     0.91       0.95        11

avg / total       0.97     0.97       0.97        30

می‌توانید از ماتریس سردرگمی ببینید که شبکه عصبی ما از 30 گیاهی که شبکه را آزمایش کردیم، فقط یک گیاه را اشتباه طبقه‌بندی کرد. روی. همچنین امتیاز f1 0.97 بسیار خوب است، با توجه به اینکه ما فقط 150 نمونه برای آموزش داشتیم.

نتایج شما می تواند کمی متفاوت از این باشد زیرا train_test_split به طور تصادفی داده ها را به مجموعه های آموزشی و آزمایشی تقسیم می کند، بنابراین شبکه های ما ممکن است آموزش / آزمایش نشده باشند روی همان داده ها اما به طور کلی، دقت باید بیشتر از 90٪ باشد روی مجموعه داده های شما نیز

بیشتر بدانید

این مقاله به سختی سطح آنچه را که با شبکه های عصبی و کتابخانه Scikit-Learn Python امکان پذیر است را بررسی می کند. اگر می خواهید درک بهتری از این موضوعات کسب کنید، توصیه می کنم منابع زیر را بررسی کنید:

نتیجه

در این مقاله مروری کوتاه بر چیستی شبکه‌های عصبی ارائه دادیم و روش ایجاد یک شبکه عصبی بسیار ساده را توضیح دادیم که آموزش داده شده است. روی مجموعه داده عنبیه من به شما توصیه می کنم سعی کنید با تعداد لایه های پنهان، توابع فعال سازی و اندازه تقسیم آموزشی و آزمایشی بازی کنید تا ببینید آیا می توانید نتایج بهتری نسبت به آنچه در اینجا ارائه کردیم به دست آورید یا خیر.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-28 10:58:06

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید