آموزش هوش مصنوعی با پایتون - یادگیری عمیق

شبکه عصبی مصنوعی (ANN) یک سیستم محاسباتی کارآمد است که ایده اصلی آن از شبکه‌های عصبی زیستی الهام گرفته شده است. شبکه‌های عصبی یکی از انواع مدل‌های یادگیری ماشین هستند. در اواسط دهه ۱۹۸۰ و اوایل دهه ۱۹۹۰، پیشرفت‌های معماری مهمی در شبکه‌های عصبی صورت گرفت. در این فصل، درباره یادگیری عمیق، رویکردی در هوش مصنوعی، اطلاعات بیشتری کسب خواهید کرد.

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

یادگیری ماشین در مقابل یادگیری عمیق

یادگیری عمیق این روزها قدرتمندترین تکنیک یادگیری ماشین است. دلیل قدرت بالای آن این است که هم‌زمان با یادگیری نحوه حل مسئله، بهترین روش برای بازنمایی مسئله را نیز می‌آموزد. مقایسه‌ای بین یادگیری عمیق و یادگیری ماشین در ادامه آمده است −

وابستگی به داده

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

وابستگی به سخت‌افزار

الگوریتم‌های یادگیری عمیق برای کارکرد کاملاً درست به سیستم‌های قدرتمند نیاز دارند. از سوی دیگر، الگوریتم‌های یادگیری ماشین روی سیستم‌های معمولی و ضعیف‌تر نیز می‌توانند کار کنند.

استخراج ویژگی

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

زمان اجرا

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

رویکرد حل مسئله

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

شبکه عصبی کانولوشنی (CNN)

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

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

بررسی اجمالی معماری CNNها

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

معماری شبکه CNN دارای نورون‌هایی است که در ۳ بعد به نام‌های عرض، ارتفاع و عمق سازمان‌دهی شده‌اند. هر نورون در لایه فعلی به بخش کوچکی از خروجی لایه قبلی متصل است. این کار شبیه قرار دادن یک فیلتر روی تصویر ورودی است. این شبکه از M فیلتر استفاده می‌کند تا از دریافت تمام جزییات مطمئن شود. این M فیلتر، استخراج‌کننده‌های ویژگی هستند که ویژگی‌هایی مانند لبه‌ها، گوشه‌ها و غیره را استخراج می‌کنند.

لایه‌های مورد استفاده برای ساخت CNNها

لایه‌های زیر برای ساخت CNNها استفاده می‌شوند −

  • لایه ورودی (Input Layer) − داده‌های خام تصویر را همان‌طور که هستند دریافت می‌کند.

  • لایه کانولوشنی (Convolutional Layer) − این لایه بلوک اصلی و هسته CNNها است که بیشتر محاسبات را انجام می‌دهد. این لایه کانولوشن‌ها را بین نورون‌ها و بخش‌های مختلف ورودی محاسبه می‌کند.

  • لایه یکسوساز خطی (ReLU) − یک تابع فعال‌سازی را روی خروجی لایه قبلی اعمال می‌کند. این لایه غیرخطی‌بودن را به شبکه اضافه می‌کند تا بتواند تعمیم‌دهی خوبی روی هر نوع تابعی داشته باشد.

  • لایه ادغام (Pooling Layer) − ادغام به ما کمک می‌کند تا با پیشرفت در شبکه، فقط بخش‌های مهم را نگه داریم. لایه ادغام به‌طور مستقل روی هر برش عمق ورودی عمل کرده و اندازه فضایی آن را تغییر می‌دهد. این لایه از تابع MAX استفاده می‌کند.

  • لایه کاملاً متصل / لایه خروجی (Fully Connected Layer) − این لایه امتیازهای خروجی را در لایه آخر محاسبه می‌کند. خروجی حاصل به اندازه است که L تعداد کلاس‌های مجموعه داده آموزشی است.

نصب پکیج‌های کاربردی پایتون

می‌توانید از Keras استفاده کنید که یک API سطح بالای شبکه‌های عصبی است که به زبان پایتون نوشته شده و قادر است روی TensorFlow، CNTK یا Theano اجرا شود. این API با پایتون 2.7 تا 3.6 سازگار است. می‌توانید اطلاعات بیشتری درباره آن را از https://keras.io/ کسب کنید.

از دستورات زیر برای نصب Keras استفاده کنید −

pip install keras

در محیط conda می‌توانید از دستور زیر استفاده کنید −

conda install c conda-forge keras

ساخت رگرسور خطی با استفاده از ANN

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

تمام پکیج‌های مورد نیاز را به صورت زیر وارد کنید −

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold

اکنون مجموعه داده خود را که در مسیر محلی ذخیره شده است بارگذاری کنید.

dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values

اکنون داده‌ها را به متغیرهای ورودی و خروجی یعنی X و Y تقسیم کنید −

X = dataset[:,0:13]
Y = dataset[:,13]

از آنجا که از شبکه عصبی پایه (Baseline) استفاده می‌کنیم، مدل را تعریف کنید −

def baseline_model():

اکنون مدل را به صورت زیر ایجاد کنید −

model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal', 
   activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))

سپس مدل را کامپایل کنید −

model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor

اکنون مقدار seed تصادفی را برای بازتولیدپذیری به صورت زیر تنظیم کنید −

seed = 7
numpy.random.seed(seed)

شیء رابط Keras برای استفاده در scikit-learn به عنوان تخمین‌گر رگرسیون، KerasRegressor نامیده می‌شود. در این بخش، این مدل را با مجموعه داده استانداردسازی‌شده ارزیابی خواهیم کرد.

estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))

خروجی کد نشان‌داده‌شده در بالا، تخمینی از عملکرد مدل روی مسئله برای داده‌های دیده نشده خواهد بود. این خروجی، میانگین مربعات خطا (MSE)، شامل میانگین و انحراف معیار در تمام ۱۰ بخش ارزیابی اعتبارسنجی متقابل خواهد بود.

طبقه بندی کننده تصویر: کاربردی از یادگیری عمیق

شبکه‌های عصبی کانولوشنی (CNNs) مسئله طبقه‌بندی تصویر را حل می‌کنند، یعنی مشخص می‌کنند که تصویر ورودی متعلق به کدام کلاس است. می‌توانید از کتابخانه یادگیری عمیق Keras استفاده کنید. توجه داشته باشید که ما از مجموعه داده‌های آموزشی و آزمایشی تصاویر گربه‌ها و سگ‌ها از لینک زیر استفاده می‌کنیم: https://www.kaggle.com/c/dogs-vs-cats/data.

کتابخانه‌ها و پکیج‌های مهم Keras را همان‌طور که نشان داده شده وارد کنید −

پکیج زیر به نام Sequential، شبکه‌های عصبی را به عنوان شبکه ترتیبی مقداردهی اولیه می‌کند.

from keras.models import Sequential

پکیج زیر به نام Conv2D برای انجام عملیات کانولوشن، اولین گام CNN، استفاده می‌شود.

from keras.layers import Conv2D

پکیج زیر به نام MaxPooling2D برای انجام عملیات ادغام، دومین گام CNN، استفاده می‌شود.

from keras.layers import MaxPooling2D

پکیج زیر به نام Flatten فرآیند تبدیل تمام آرایه‌های ۲ بعدی حاصل به یک بردار خطی پیوسته و بلند است.

from keras.layers import Flatten

پکیج زیر به نام Dense برای انجام اتصال کامل شبکه عصبی، گام چهارم CNN، استفاده می‌شود.

from keras.layers import Dense

اکنون یک شیء از کلاس Sequential ایجاد کنید.

S_classifier = Sequential()

مرحله بعدی کدنویسی بخش کانولوشن است.

S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

در اینجا relu همان تابع یکسوساز است.

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

S-classifier.add(MaxPooling2D(pool_size = (2, 2)))

اکنون با استفاده از تسطیح (Flattening) تمام تصاویر ادغام‌شده را به یک بردار پیوسته تبدیل کنید −

S_classifier.add(Flatten())

سپس یک لایه کاملاً متصل ایجاد کنید.

S_classifier.add(Dense(units = 128, activation = 'relu'))

در اینجا ۱۲۸ تعداد واحدهای پنهان است. تعریف تعداد واحدهای پنهان به صورت توانی از ۲ یک روش رایج است.

اکنون لایه خروجی را به صورت زیر مقداردهی اولیه کنید −

S_classifier.add(Dense(units = 1, activation = 'sigmoid'))

اکنون شبکه CNN را که ساخته‌ایم کامپایل کنید −

S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

در اینجا پارامتر optimizer برای انتخاب الگوریتم گرادیان کاهشی تصادفی، پارامتر loss برای انتخاب تابع زیان و پارامتر metrics برای انتخاب معیار ارزیابی عملکرد است.

اکنون افزودن داده‌های تصویر (Image Augmentation) را انجام داده و سپس تصاویر را به شبکه‌های عصبی برازش دهید −

train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = 
   train_datagen.flow_from_directory(/Users/admin/training_set,target_size = 
      (64, 64),batch_size = 32,class_mode = 'binary')

test_set = 
   test_datagen.flow_from_directory('test_set',target_size = 
      (64, 64),batch_size = 32,class_mode = 'binary')

اکنون داده‌ها را با مدلی که ساخته‌ایم برازش دهید −

classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs = 
25,validation_data = test_set,validation_steps = 2000)

در اینجا steps_per_epoch حاوی تعداد تصاویر آموزشی است.

حال که مدل آموزش دیده است، می‌توانیم از آن برای پیش‌بینی به صورت زیر استفاده کنیم −

from keras.preprocessing import image

test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', 
target_size = (64, 64))

test_image = image.img_to_array(test_image)

test_image = np.expand_dims(test_image, axis = 0)

result = classifier.predict(test_image)

training_set.class_indices

if result[0][0] == 1:
prediction = 'dog'

else:
   prediction = 'cat'

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.