Site icon آکادمی آمانج

انجام گام به گام پروژه دیپ لرنینگ در پایتون

یادگیری عمیق و پایتون و کراس

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

 


 

بیشتر بخوانید: “چرا کتابخانه Keras در دیپ لرنینگ مهم است؟


بررسی اجمالی آموزش کراس

ما قصد داریم به آرامی و قدم به قدم توضیح دهیم تا شما بدانید که چگونه می توانید در آینده مدل های خود را ایجاد کنید.
مراحلی این آموزش به شرح زیر است:
• بارگیری داده ها
• تعریف مدل کراس
• کامپایل مدل کراس
• فیت کردن مدل کراس
• ارزیابی مدل کراس
• ادغام
این آموزش کراس چند پیش نیاز لازم دارد:
• پایتون ٢ یا ٣ را نصب و پیکربندی کنید.
• SciPy (شامل NumPy) را نصب و پیکربندی کنید.
• کراس و یک بک-اند (Theano یا TensorFlow) نصب و پیکربندی کنید.
فایل جدیدی به نام keras_first_network.py ایجاد کنید و کدها را در آن وارد کنید.

١. بارگیری داده ها

اولین قدم، تعریف توابع و کلاس هایی است که قصد استفاده از آن ها را در این آموزش داریم. ما از کتابخانه NumPy برای بارگذاری مجموعه داده و برای تعریف مدل از دو کلاس از کتابخانه Keras استفاده خواهیم کرد.
بارگذاری های مورد نیاز عبارتند از:


# first neural network with keras tutorial
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense


اکنون می توانیم مجموعه داده خود را بارگیری کنیم.
در این آموزش کراس قصد داریم از مجموعه داده های دیابت Pima Indians استفاده کنیم. این یک مجموعه داده استاندارد یادگیری ماشین از منبع UCI Machine Learning است. این مجموعه داده، اطلاعات مربوط به سابقه پزشکی بیماران و اینکه آیا آن ها در طی پنج سال اخیر به دیابت مبتلا شده اند یا خیر را، توصیف می کند.
طبقه بندی به صورت باینری است (دیابت مثبت به عنوان 1 و دیابت منفی به عنوان 0). همه متغیرهای ورودی که توصیف بیماران است به صورت عددی هستند. همین امر استفاده مستقیم از شبکه های عصبی را آسان تر می کند.
مجموعه داده های ما از طریق لینک های زیر قابل دسترس می باشند:


دانلود دیتاست pima-indians -diabetes از kaggle

دانلود دیتاست pima-indians-diabetes.csv از github

مشاهده جزییات دیتاست 


داده ها را دانلود کرده و آن را در دایرکتوری خود، جایی که فایل پایتون قرار دارد، قرار دهید.
آن را با نام زیر ذخیره کنید:
pima-indians-diabetes.csv
اکنون می توانیم با استفاده از تابع loadtxt() فایل را به عنوان ماتریس اعداد بارگذاری کنیم. هشت متغیر ورودی و یک متغیر خروجی (آخرین ستون) وجود دارد. ما در حال آموزش یک مدل برای ترسیم ردیف متغیرهای ورودی (X) به یک متغیر خروجی (y) هستیم که اغلب آن ها را بصورت y = f (X) خلاصه می کنیم.
متغیرها را می توان به شکل زیر خلاصه کرد:
متغیرهای ورودی (X):
• تعداد دفعات بارداری
• غلظت گلوکز در پلاسما
• فشار خون دیاستولیک (میلی متر جیوه)
• ضخامت پوست ماهیچه سه سر (میلی متر)
• انسولین سرم در بازه ٢ ساعته (mu U / ml)
• شاخص توده بدنی (2(قد به متر) / وزن به کیلوگرم)
• سوابق دیابت در خانواده
• سن
متغیرهای خروجی (y):
• متغیر کلاس (0 یا 1)
پس از بارگیری فایل CSV در حافظه، می توان ستون داده ها را به متغیرهای ورودی و خروجی تقسیم کرد. داده ها در آرایه های دوبعدی شامل سطر و ستون ذخیره می شوند.
می توانیم با انتخاب زیر مجموعه ستون ها توسط عملگر برش استاندارد(standard NumPy slice operator)، آرایه را به دو قسمت تقسیم کنیم. روش دیگر این است که از طریق برش 0:8، ٨ ستون اول از ٠ تا ٧ را انتخاب کنیم. سپس می توانیم ستون خروجی (متغیر نهم) را از طریق ایندکس ٨ انتخاب کنیم.


# load the dataset

 dataset = loadtxt(‘pima-indians-diabetes.csv’, delimiter=’,’)

# split into input (X) and output (y) variables

X = dataset[:,0:8]

y = dataset[:,8]


اکنون زمان تعریف مدل شبکه عصبی است.

٢. تعریف مدل کراس

مدل ها در کراس به عنوان دنباله ای از لایه ها تعریف می شوند. ما یک مدل Sequential ایجاد کرده و لایه ها را اضافه می کنیم. اطمینان حاصل می کنیم که لایه ورودی از تعداد ورودی های مناسب برخوردار است.
غالبا بهترین نوع ساختار از نظر تعداد لایه ها و انواع آن، از طریق سعی و خطا مشخص می شود. در این پروژه، ما از یک ساختار شبکه کاملا متصل (fully-connected) با سه لایه استفاده خواهیم کرد. لایه های کاملا متصل با استفاده از کلاس Dense تعریف می شوند. ما می توانیم تعداد نورون ها یا گره ها را در لایه به عنوان اولین آرگومان مشخص کرده و با استفاده از آرگومان فعال سازی، عملکرد فعال سازی را تعیین کنیم.
ما از تابع فعال سازی واحد خطی اصلاح شده که به آن ReLU گفته می شود در دو لایه اول و از تابع Sigmoid در لایه خروجی استفاده خواهیم کرد. پیش از این توابع فعال سازی Sigmoid و Tanh برای همه لایه ها ارجحیت داشتند؛ اما امروزه با استفاده از تابع فعال سازی ReLU عملکرد بهتری حاصل می شود. ما از Sigmoid روی لایه خروجی استفاده می کنیم تا اطمینان حاصل کنیم که خروجی شبکه ما بین ٠ تا ١ است.


# define the keras model

model = Sequential()

model.add(Dense(12, input_dim=8, activation=’relu’))

model.add(Dense(8, activation=’relu’))

model.add(Dense(1, activation=’sigmoid’))


٣. کامپایل مدل کراس

برای کامپایل این مدل از کتابخانه های عددی کارآمد مانند Theano یا TensorFlow استفاده می شود. بک-اند به طور خودکار بهترین راه برای آموزش مدل و اجرای آن بر روی سخت افزار شما را انتخاب می کند. حین کامپایل می بایست برخی از ویژگی های اضافی ضروری برای آموزش شبکه را مشخص کنیم. به یاد داشته باشید آموزش یک شبکه به معنای پیدا کردن بهترین مجموعه وزن ها برای ترسیم ورودی ها به خروجی در مجموعه داده است.
برای ارزیابی مجموعه ای از وزن ها باید از تابع ضرر(loss function) استفاده کنیم. همچنین از بهینه ساز برای جستجوی وزن های مختلف در شبکه استفاده می شود. در این پروژه، از آنتروپی متقاطع به عنوان آرگومان ضرر استفاده خواهیم کرد. این تابع برای طبقه بندی مسائل باینری مورد استفاده قرار گرفته و در کراس به عنوان “binary_crossentropy” تعریف شده است.
برای بهینه ساز، الگوریتم “adam”را تعریف خواهیم کرد؛ که به دلیل قابلیت تنظیم خودکار و کارآمد بودن در طیف گسترده ای از مسائل، از محبوبیت بالایی برخوردار است. در نهایت، چون این یک مساله طبقه بندی است، از آرگوکان metrics به منظور طبقه بندی و گزارش استفاده خواهیم کرد.


# compile the keras model

model.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])


۴. فیت کردن مدل کراس

ما می توانیم با فراخوانی تابع fit()، مدل خود را آموزش داده یا فیت کنیم. قبل از شروع این مرحله به تعریف دو مفهوم epoch و batch می پردازیم:
Epoch: دوره: یک دور به روز رسانی شبکه برای مجموعه داده آموزش
Batch: دسته: یک یا چند نمونه در نظر گرفته شده توسط مدل در یک دوره قبل از به روزرسانی وزن.
روند آموزش برای تعداد مشخصی از تکرارها در مجموعه داده به نام epochs اجرا می شود، که ما باید با استفاده از آرگومان epochs آن را مشخص کنیم. ما همچنین می بایست تعداد ردیف های مجموعه داده را قبل از به روزرسانی وزن مدل در هر دوره، تنظیم کنیم. برای این منظور از آرگومان batch_size استفاده می کنیم. دوره و دسته در این پروژه به ترتیب برابر با ١۵٠ و ١٠ می باشد.
این پیکربندی ها می توانند به صورت آزمایشی با سعی و خطا انتخاب شوند. مدل همیشه دارای خطا خواهد بود، اما میزان خطا پس از مدتی یکنواخت می شود. به این فرایند “همگرایی مدل” گفته می شود.


# fit the keras model on the dataset

model.fit(X, y, epochs=150, batch_size=10)


۵. ارزیابی مدل کراس

شما می توانید با استفاده از تابع evaluate()، مدل خود را ارزیابی کرده و همان ورودی و خروجی مورد استفاده برای آموزش مدل را وارد کنید. تابع ارزیابی لیستی را با دو مقدار ارائه می دهد. اولین مورد ضرر مدل و دومین مورد، دقت مدل در مجموعه داده خواهد بود. ما در این پروژه فقط به گزارش دقت نیاز داریم.


# evaluate the keras model

_, accuracy = model.evaluate(X, y)

print(‘Accuracy: %.2f’ % (accuracy*100))


۶. ادغام

اکنون همه را با هم ادغام می کنیم.


# first neural network with keras tutorial

from numpy import loadtxt

from keras.models import Sequential

from keras.layers import Dense

# load the dataset

dataset = loadtxt(‘pima-indians-diabetes.csv’, delimiter=’,’)

# split into input (X) and output (y) variables

X = dataset[:,0:8]

y = dataset[:,8]

# define the keras model

model = Sequential()

model.add(Dense(12, input_dim=8, activation=’relu’))

model.add(Dense(8, activation=’relu’))

model.add(Dense(1, activation=’sigmoid’))

# compile the keras model

model.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])

# fit the keras model on the dataset

model.fit(X, y, epochs=150, batch_size=10)

# evaluate the keras model

_, accuracy = model.evaluate(X, y)

print(‘Accuracy: %.2f’ % (accuracy*100))


می توانید کلیه کد ها را در فایل پایتون خود کپی کرده و به عنوان “keras_first_network.py” در همان فهرست داده های “pima-indians-diabet.csv” ذخیره کنید. سپس می توانید فایل پایتون را به عنوان یک اسکریپت از خط فرمان خود به شرح زیر اجرا کنید:


python keras_first_network.py


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


768/768 [==============================] – 0s 63us/step – loss: 0.4817 – acc: 0.7708

Epoch 147/150

768/768 [==============================] – 0s 63us/step – loss: 0.4764 – acc: 0.7747

Epoch 148/150

768/768 [==============================] – 0s 63us/step – loss: 0.4737 – acc: 0.7682

Epoch 149/150

768/768 [==============================] – 0s 64us/step – loss: 0.4730 – acc: 0.7747

Epoch 150/150

768/768 [==============================] – 0s 63us/step – loss: 0.4754 – acc: 0.7799

768/768 [==============================] – 0s 38us/step

Accuracy: 76.56


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


Accuracy: 75.00

Accuracy: 77.73

Accuracy: 77.60

Accuracy: 78.12

Accuracy: 76.17


شما عزیزان می توانید به منظور شرکت در دوره آموزش پایتون آکادمی آمانج با ما در ارتباط باشید.

مشاهده نسخه گرافیکی و کامل