مبانی یادگیری عمیق با استفاده از Keras

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

۱- چارچوب های یادگیری عمیق

از سال ۲۰۱۲ هنگامی که Alex Krizhevsky و تیمش برنده چالش ImageNet شدند ، یادگیری عمیق بسیار مورد توجه مهندسان هوش مصنوعی قرار گرفت. ImageNet یک مسابقه بینایی رایانه ای است که در آن یک ماشین باید کلاسه بندی صحیحی از تصویر یک شی در یکی از ۱۰۰۰ دسته داشته باشد. این اشیا شامل انواع مختلفی از حیوانات ، گیاهان ، ابزار ، وسایل نقلیه می شود.

این چالش توجه بسیاری از مهندسین حوزه بینایی رایانه را به خود جلب کرد و افراد زیادی به حوزه شبکه های عصبی پرداختند. اما در آن زمان ، ابزار های مورد نیاز برای شروع به کار این حوزه نوظهور در دسترس نبود. محققان تلاش بسیاری کرده اند تا کتابخانه های مفیدی برای تسهیل کار در این زمینه جدید ایجاد کنند. برخی از چارچوب های پرطرفدار یادگیری عمیق در حال حاضرTensorflow ، Theano ، Caffe ، Pytorch ، CNTK ، MXNet ، Torch ، deeplearning4j ، Caffe2 و بسیاری دیگر هستند.

Keras یک API سطح بالا است که به زبان پایتون نوشته شده و قابلیت اجرا در TensorFlow ، Theano یا CNTK را دارد. به طور کلی کتابخانه های یادگیری عمیق فوق طوری نوشته شده اند که بتواند برای افراد مبتدی که دانش محدودی در حوزه یادگیری عمیق دارند نیز قابل استفاده باشند. Keras با ایجاد یک API ساده و ماژولار برای ایجاد و آموزش شبکه های عصبی ، بسیاری از جزئیات پیچیده را در بر دارد و شروع کار در این حوزه را آسان تر می کند.

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

۲- نصب و پیکربندی Keras

همانطور که در بالا اشاره شد ، Keras یک API سطح بالا است که از کتابخانه های یادگیری عمیق مانند Theano یا Tensorflow به عنوان backend استفاده می کند. این کتابخانه ها ، از طریق کتابخانه های سطح پایین با سخت افزار در ارتباط اند. به عنوان مثال ، اگر برنامه را روی CPU اجرا می کنید ، Tensorflow یا Theano از کتابخانه های BLAS استفاده می کنند. از طرف دیگر ، وقتی روی GPU کار می کنید ، آن ها از کتابخانه های CUDA و cuDNN استفاده می کنند.

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

توصیه می کنم همه موارد را در محیط های مجازی نصب کنید. اگر هنوز محیط مجازی بر روی سیستم شما نصب نشده است ، مرحله ۵ مقاله فوق را بررسی کنید.

ما Theano و Tensorflow را به عنوان کتابخانه پشتیبان Keras نصب خواهیم کرد ، به همراه چند کتابخانه دیگر که برای کار با داده (h5py) و تجسم و ترسیم (pydot ، graphviz و matplotlib) مفید هستند.

ایجاد محیط مجازی

محیط مجازی برای Python 3 را ایجاد کنید

mkvirtualenv virtual-py3 -p python3
# Activate the virtual environment
workon virtual-py3

نصب کتابخانه ها

pip install Theano
#If using only CPU
pip install tensorflow
#If using GPU
pip install tensorflow-gpu
pip install h5py pydot matplotlib

grafviz را هم نصب کنید

#For Ubuntu
sudo apt-get install graphviz

#For MacOs
brew install graphviz

پیکربندی  Keras

به طور پیش فرض ، Keras طوری پیکربندی شده است تا از Tensorflow به عنوان Backend استفاده کند زیرا بسیار پرطرفدار است. با این حال ، اگر می خواهید آن را به Theano تغییر دهید ، پوشه ~/.keras/keras.json را باز کنید که به صورت زیر نشان داده شده است:

{
    "epsilon": 1e-07,
    "floatx": "float32",
    "image_data_format": "channels_last",
    "backend": "tensorflow"
}

و آن را به حالت زیر تغییر دهید :

{
    "epsilon": 1e-07,
    "floatx": "float32",
    "image_data_format": "channels_first",
    "backend": "theano"
}

۳- چرخه کاری Keras

چرخه کاری Keras
چرخه کاری Keras

Keras یک چرخه کاری بسیار ساده برای آموزش و ارزیابی مدل ها ارائه می دهد که در نمودار فوق شرح داده شده است.

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

۱-۳- لایه های Keras

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

Keras شامل لایه های اصلی زیر می شود :

  • لایه های Dense که لایه Fully Connected نیز نامیده می شوند، زیرا هر گره ورودی به هر گره خروجی متصل است.
  • لایه Activation که شامل توابع فعال سازی مانند ReLU ، tanh ، sigmoid و … است.
  • لایه Dropout برای منظم سازی در حین آموزش بکار گرفته می شود.
  • Flatten, Reshape و غیره

جدا از این لایه های اصلی ، برخی از لایه های مهم دیگر نیز وجود دارند :

  • لایه های Convolution ، برای انجام کانولوشن استفاده می شود.
  • لایه های Pooling ، برای نمونه کاهی استفاده می شود.
  • لایه های Recurrent .
  • لایه های Locally-connected, normalization و غیره

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

from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D

۲-۳- مدل های Keras

Keras برای تعریف مدل دو روش ارائه می دهد :

  • Sequential ، معمولاً برای انباشتن لایه ها استفاده می شود.
  • Functional API ، برای طراحی معماری های مدل پیچیده مانند مدل هایی با چندین خروجی ، لایه های مشترک و غیره استفاده می شود.
from tensorflow.keras.models import Sequential

برای ایجاد یک مدل Sequential ، می توانیم لیستی از لایه ها را به عنوان آرگومان به سازنده منتقل کنیم یا با استفاده از تابع )(model.add لایه ها را به ترتیب اضافه کنیم.

به عنوان مثال ، هر دو قطعه کد زیر برای ایجاد یک مدل با یک لایه متراکم (Dense) با ۱۰ خروجی با هم برابر هستند.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

model = Sequential([Dense(10, input_shape=(nFeatures,)),
                    Activation('linear') ])
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(1, input_shape=(nFeatures,), kernel_initializer='uniform'))
model.add(Activation('linear'))

نکته مهمی که باید در تعریف مدل به آن توجه شود این است که باید شکل ورودی لایه اول را مشخص کنیم. این کار در قطعه کد بالا با استفاده از پارامتر input_shape همراه با اولین لایه Dense انجام می شود. شکل سایر لایه ها توسط کامپایلر استنباط می شود.

۳-۳- پیکربندی فرآیند آموزش

پس از آماده شدن مدل ، باید فرآیند یادگیری را پیکربندی کنیم. این یعنی :

  • Optimizer را تعیین کنیم که وزن شبکه را به روز رسانی کند
  • نوع تابع هزینه یا تابع زیان را مشخص کنیم
  • معیارهایی را که قصد داریم در حین آموزش و آزمایش ارزیابی کنیم ، مشخص کنیم
  • نمودار مدل را با استفاده از backend ایجاد کنیم
  • و هر پیکربندی پیشرفته دیگری

این کار در Keras با استفاده از تابع ()model.compile انجام می شود. قطعه کد زیر کاربرد آن را نشان می دهد.

model.compile(optimizer='rmsprop',  loss='mse', metrics=['mse', 'mae'])

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

بهینه سازها

Keras بهینه سازهای زیادی را برای انتخاب فراهم می کند که شامل

  • Stochastic Gradient Descent ( SGD )
  • Adam
  • RMSprop
  • AdaGrad
  • AdaDelta و غیره

RMSprop برای اکثر مسائل گزینه مناسبی است.

توابع زیان

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

  • آنتروپی متقاطع باینری (binary-cross-entropy) برای یک مسئله کلاسه بندی باینری .
  • آنتروپی متقاطع طبقه بندی شده (categorical-cross-entropy) برای یک مسئله طبقه بندی چند طبقه .
  • میانگین مربع خطا (MSE) برای یک مسئله رگرسیون و غیره .

۴-۳- آموزش

پس از پیکربندی مدل ، می توانیم مراحل آموزش را شروع کنیم. این کار را می توان با استفاده از تابع ()model.fit در Keras انجام داد. کاربرد آن به شرح زیر است :

model.fit(trainFeatures, trainLabels, batch_size=4, epochs = 100)

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

۵-۳ ارزیابی مدل

پس از آموزش مدل ، باید درستی کارکرد مدل روی داده های آزمایشی مشاهده نشده را بررسی کنیم. در Keras می توان این کار را به دو روش انجام داد.

  • ()model.evaluate : که میزان تلفات و معیارهای مشخص شده در مرحله ()model.compile را پیدا می کند. هم داده های آزمایشی و هم برچسب ها را به عنوان ورودی می گیرد و اندازه گیری کمی دقت را نشان می دهد. همچنین می توان آن را برای انجام اعتبارسنجی متقابل و ریزه کاری بیشتر پارامترها استفاده کرد تا بهترین مدل را بدست آورد.
  • ()model.predict : خروجی داده های آزمایشی داده شده را پیدا می کند که برای بررسی کیفی خروجی ها مفید است.

حال ، بیایید ببینیم چگونه از مدل ها و لایه های keras برای ایجاد یک شبکه عصبی ساده استفاده کنیم.

۴- مثال رگرسیون خطی

در این بخش می آموزیم که چگونه برای انجام رگرسیون خطی ، یک شبکه ساده با یک لایه ایجاد کنیم. به عنوان مثال ما از مجموعه داده Boston Housing موجود در Keras استفاده خواهیم کرد. نمونه ها شامل ۱۳ ویژگی از خانه در مکان های مختلف اطراف شهر بوستون در اواخر دهه ۱۹۷۰ است. اهداف (target) قیمت متوسط ​​خانه ها در یک محله هستند. با ۱۳ ویژگی ، ما باید مدلی را آموزش دهیم که قیمت خانه را در داده های آزمایشی پیش بینی کند.

۱-۴- آموزش

ما برای ایجاد نمودار شبکه از مدل Sequential استفاده می کنیم. سپس یک لایه Dense با تعداد ورودی برابر با تعداد ویژگی های داده و یک خروجی اضافه می کنیم. سپس همانطور که در بخش قبل توضیح داده شد ، مطابق گردش کار عمل می کنیم. ما مدل را کامپایل کرده و با استفاده از دستور fit آموزش می دهیم. در نهایت، از تابع ()model.summary برای بررسی پیکربندی مدل استفاده می کنیم. تمام مجموعه های داده keras دارای یک تابع ()load_data هستند که مجموعه ای از داده های آموزش و آزمایش را همانطور که در کد نشان داده شده است ، برمی گرداند.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.datasets import boston_housing

(X_train, Y_train), (X_test, Y_test) = boston_housing.load_data()

nFeatures = X_train.shape[1]

model = Sequential()
model.add(Dense(1, input_shape=(nFeatures,), kernel_initializer='uniform'))
model.add(Activation('linear'))

model.compile(optimizer='rmsprop',  loss='mse', metrics=['mse', 'mae'])

model.fit(X_train, Y_train, batch_size=4, epochs=1000)

model.summary()

خروجی ()model.summary در زیر آورده شده است که ۱۴ پارامتر را نشان می دهد ( ۱۳ پارامتر برای وزن ها و ۱ پارامتر برای بایاس )

_______________________________________________________
Layer (type)           Output Shape        Param #   
=======================================================
dense_1 (Dense)        (None, 1)             14        
=======================================================
Total params: 14
Trainable params: 14
Non-trainable params: 0

۲-۴- استنباط

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

model.evaluate(X_test, Y_test, verbose=True)

Y_pred = model.predict(X_test)

print(Y_test[:5])
print(Y_pred[:5,0])

که خروجی برابر است با :

[  ۷٫۲  ۱۸٫۸  ۱۹٫   ۲۷٫   ۲۲٫۲]
[  ۷٫۲  ۱۸٫۲۶  ۲۱٫۳۸  ۲۹٫۲۸  ۲۳٫۷۲]

ملاحظه می شود که پیش بینی ها با مقادیر درستی مبنا مطابقت دارند، اما در پیش بینی ها خطاهایی وجود دارد.

بیشتر بخوانید :

منبع Learn OpenCV

درباره‌ی امیر اقتدائی

همچنین ببینید

دوره یادگیری عمیق به زبان ساده

دوره تصویری یادگیری عمیق به زبان ساده

در این دوره شما با مفهوم یادگیری عمیق آشنا می شوید. سپس به صورت جزئی …

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *