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

محبوبیت پایتون هر روز رو به افزایش است و کاربران به این نتیجه رسیده اند که پایتون زبانی بسیار قدرتمند و ساده برای استفاده است. در این مقاله به انجام یک پروژه دیپ لرنینگ در پایتون با کراس (Keras )می پردازیم. کراس یک کتابخانه منبع آزاد پایتون به منظور تهیه و ارزیابی مدل های دیپ لرنینگ است. این کتابخانه به شما این امکان را می دهد که مدل های شبکه عصبی را تنها در چند خط کد تعریف و آموزش دهید.آنچه در این نوشته خواهیم داشتبررسی اجمالی آموزش کراس١. بارگیری داده ها٢. تعریف مدل کراس٣. کامپایل مدل کراس۴. فیت کردن مدل کراس۵. ارزیابی مدل کراس۶. ادغامبررسی اجمالی آموزش کراسما قصد داریم به آرامی و قدم به قدم توضیح دهیم تا شما بدانید که چگونه می توانید در آینده مدل های خود را ایجاد کنید.مراحلی این آموزش به شرح زیر است:• بارگیری داده ها• تعریف مدل کراس• کامپایل مدل کراس• فیت کردن مدل کراس• ارزیابی مدل کراس• ادغاماین آموزش کراس چند پیش نیاز لازم دارد:• پایتون ٢ یا ٣ را نصب و پیکربندی کنید.• SciPy (شامل NumPy) را نصب و پیکربندی کنید.• کراس و یک بک-اند (Theano یا TensorFlow) نصب و پیکربندی کنید.فایل جدیدی به نام keras_first_network.py ایجاد کنید و کدها را در آن وارد کنید.١. بارگیری داده هااولین قدم، تعریف توابع و کلاس هایی است که قصد استفاده از آن ها را در این آموزش داریم. ما از کتابخانه NumPy برای بارگذاری مجموعه داده و برای تعریف مدل از دو کلاس از کتابخانه Keras استفاده خواهیم کرد.بارگذاری های مورد نیاز عبارتند از:# first neural network with keras tutorialfrom numpy import loadtxtfrom keras.models import Sequentialfrom keras.layers import Dense…اکنون می توانیم مجموعه داده خود را بارگیری کنیم.در این آموزش کراس قصد داریم از مجموعه داده های دیابت Pima Indians استفاده کنیم. این یک مجموعه داده استاندارد یادگیری ماشین از منبع UCI Machine Learning است. این مجموعه داده، اطلاعات مربوط به سابقه پزشکی بیماران و اینکه آیا آن ها در طی پنج سال اخیر به دیابت مبتلا شده اند یا خیر را، توصیف می کند.طبقه بندی به صورت باینری است (دیابت مثبت به عنوان 1 و دیابت منفی به عنوان 0). همه متغیرهای ورودی که توصیف بیماران است به صورت عددی هستند. همین امر استفاده مستقیم از شبکه های عصبی را آسان تر می کند.مجموعه داده های ما در لینک های زیر قابل دسترس می باشند:• Dataset CSV File (pima-indians-diabetes.csv)• Dataset Detailsداده ها را دانلود کرده و آن را در دایرکتوری خود، جایی که فایل پایتون قرار دارد، قرار دهید.آن را با نام زیر ذخیره کنید: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 datasetdataset = loadtxt(‘pima-indians-diabetes.csv’, delimiter=’,’)# split into input (X) and output (y) variablesX = dataset[:,0:8]y = dataset[:,8]اکنون زمان تعریف مدل شبکه عصبی است.٢. تعریف مدل کراسمدل ها در کراس به عنوان دنباله ای از لایه ها تعریف می شوند. ما یک مدل Sequential ایجاد کرده و لایه ها را اضافه می کنیم. اطمینان حاصل می کنیم که لایه ورودی از تعداد ورودی های مناسب برخوردار است.غالبا بهترین نوع ساختار از نظر تعداد لایه ها و انواع آن، از طریق سعی و خطا مشخص می شود. در این پروژه، ما از یک ساختار شبکه کاملا متصل (fully-connected) با سه لایه استفاده خواهیم کرد. لایه های کاملا متصل با استفاده از کلاس Dense تعریف می شوند. ما می توانیم تعداد نورون ها یا گره ها را در لایه به عنوان اولین آرگومان مشخص کرده و با استفاده از آرگومان فعال سازی، عملکرد فعال سازی را تعیین کنیم.ما از تابع فعال سازی واحد خطی اصلاح شده که به آن ReLU گفته می شود در دو لایه اول و از تابع Sigmoid در لایه خروجی استفاده خواهیم کرد. پیش از این توابع فعال سازی Sigmoid و Tanh برای همه لایه ها ارجحیت داشتند؛ اما امروزه با استفاده از تابع فعال سازی ReLU عملکرد بهتری حاصل می شود. ما از Sigmoid روی لایه خروجی استفاده می کنیم تا اطمینان حاصل کنیم که خروجی شبکه ما بین ٠ تا ١ است.# define the keras modelmodel = 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 modelmodel.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])۴. فیت کردن مدل کراسما می توانیم با فراخوانی تابع fit()، مدل خود را آموزش داده یا فیت کنیم. قبل از شروع این مرحله به تعریف دو مفهوم epoch و batch می پردازیم:Epoch: دوره: یک دور به روز رسانی شبکه برای مجموعه داده آموزشBatch: دسته: یک یا چند نمونه در نظر گرفته شده توسط مدل در یک دوره قبل از به روزرسانی وزن.روند آموزش برای تعداد مشخصی از تکرارها در مجموعه داده به نام epochs اجرا می شود، که ما باید با استفاده از آرگومان epochs آن را مشخص کنیم. ما همچنین می بایست تعداد ردیف های مجموعه داده را قبل از به روزرسانی وزن مدل در هر دوره، تنظیم کنیم. برای این منظور از آرگومان batch_size استفاده می کنیم. دوره و دسته در این پروژه به ترتیب برابر با ١۵٠ و ١٠ می باشد.این پیکربندی ها می توانند به صورت آزمایشی با سعی و خطا انتخاب شوند. مدل همیشه دارای خطا خواهد بود، اما میزان خطا پس از مدتی یکنواخت می شود. به این فرایند “همگرایی مدل” گفته می شود.# fit the keras model on the datasetmodel.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 tutorialfrom numpy import loadtxtfrom keras.models import Sequentialfrom keras.layers import Dense# load the datasetdataset = loadtxt(‘pima-indians-diabetes.csv’, delimiter=’,’)# split into input (X) and output (y) variablesX = dataset[:,0:8]y = dataset[:,8]# define the keras modelmodel = 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 modelmodel.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])# fit the keras model on the datasetmodel.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.7708Epoch 147/150768/768 [==============================] – 0s 63us/step – loss: 0.4764 – acc: 0.7747Epoch 148/150768/768 [==============================] – 0s 63us/step – loss: 0.4737 – acc: 0.7682Epoch 149/150768/768 [==============================] – 0s 64us/step – loss: 0.4730 – acc: 0.7747Epoch 150/150768/768 [==============================] – 0s 63us/step – loss: 0.4754 – acc: 0.7799768/768 [==============================] – 0s 38us/stepAccuracy: 76.56شبکه عصبی یک الگوریتم تصادفی است؛ به این معنی که همان الگوریتم روی داده های یکسان می تواند هر بار مدل متفاوتی را آموزش دهد. این یکی از ویژگی های شبکه عصبی است، نه یک اشکال.واریانس عملکرد مدل بدان معنی است که برای بدست آوردن تقریبی معقول از عملکرد مدل، ممکن است لازم باشد شما بارها و بارها آن را متناسب کرده و میانگین دقت را محاسبه کنید. برای مثال در زیر شاهد دقت های متفاوت از پنج اجرای مختلف همین مثال را مشاهده می کنید:Accuracy: 75.00Accuracy: 77.73Accuracy: 77.60Accuracy: 78.12Accuracy: 76.17آکادمی آمانج