تا حالا به این فکر کردی که هوش مصنوعی چطور میتونه کارهایی رو انجام بده که قبلاً غیرممکن به نظر میرسید؟ تشخیص چهره، ترجمه زبان، رانندگی خودکار، و هزاران کار شگفتانگیز دیگه که همه با الهام از مغز انسان و به کمک یادگیری عمیق انجام میشن.
یادگیری عمیق یه شاخه از هوش مصنوعیه که با تقلید از عملکرد مغز انسان، مسائل پیچیده رو حل میکنه. تو این روش، از شبکههای عصبی مصنوعی استفاده میشه که با بهکارگیری مجموعهای از الگوریتمها تو لایههای مختلف، مغز انسان رو شبیهسازی میکنن. اما پیادهسازی این شبکههای عصبی کار راحتی نیست و نیاز به دانش عمیق برنامهنویسی داره.
اینجاست که Keras به عنوان یه ناجی وارد میشه! Keras یه کتابخونه قدرتمند برای یادگیری عمیقه که بهت این امکان رو میده بدون نیاز به دانش تخصصی، مدلهای پیچیده یادگیری عمیق رو طراحی و پیادهسازی کنی.
تو این مقاله، میخوایم با هم به دنیای شگفتانگیز Keras سفر کنیم و بگیم چرا این کتابخونه اینقدر بین برنامهنویسا و متخصصای هوش مصنوعی محبوب شده.
همراه ما باش تا با Keras، قدرت هوش مصنوعی رو تو دستات بگیری و به حل مسائل پیچیده با روشی نوین و کارآمد بپردازی!
Keras یه API سطح بالای یادگیری عمیقه که توسط گوگل توسعه داده شده و هدفش اینه که پیادهسازی شبکههای عصبی رو به آسونترین شکل ممکن انجام بدی. این ابزار به زبان پایتون نوشته شده و استفاده ازش، ساختن مدلهای یادگیری عمیق رو خیلی راحت میکنه. Keras از چندین بکاند مختلف برای محاسبات شبکه عصبی پشتیبانی میکنه.
تصور کن میخوای یه مدل هوش مصنوعی بسازی که بتونه بین گربه و سگ توی تصاویر تفاوت قائل بشه. با Keras، نیازی به نوشتن کدهای گیجکننده و دست و پا گیر نداری. فقط کافیه با دستورات ساده و روان، مثل دستور پخت غذا، به Keras بگی که مدلت باید چیکار کنه و هر بخش چه وظیفهای داره. Keras مثل یه مترجم عمل میکنه و دستوراتت رو به زبان قابل فهم برای کامپیوترها تبدیل میکنه. به این ترتیب، میتونی بدون غرق شدن توی جزئیات فنی، روی هدف اصلیت یعنی حل مسئله با کمک هوش مصنوعی تمرکز کنی.
در این بخش میخوایم مزایا و معایب این کتابخونه رو بررسی کنیم تا بتونی تصمیم بگیری که آیا این ابزار برای پروژههات مناسب هست یا نه.
"سادگی، نهایت کمال است." – لئوناردو داوینچی
در این بخش میخوایم Keras رو با معروفترین رقباش مقایسه کنیم.
TensorFlow محصول گوگله و یکی از معروفترین ابزارهای یادگیری عمیق به حساب میاد. این فریمورک خیلی قدرتمنده و ازش برای پروژههای بزرگ و پیچیده استفاده میشه. البته، کار کردن با TensorFlow میتونه برای تازهکارها یه مقدار گیجکننده باشه، چون پیچیدگیهای زیادی داره. Keras به عنوان یه رابط کاربری سطح بالا روی TensorFlow سوار میشه و کار باهاش رو خیلی آسونتر میکنه. با Keras میتونی بدون درگیر شدن با جزئیات پیچیده، از قدرت TensorFlow استفاده کنی.
PyTorch یه فریمورک دیگهست که خیلی بین محققان و دانشگاهیها محبوبه. این فریمورک انعطافپذیری زیادی داره و اجازه میده تا مدلها رو به صورت داینامیک تعریف کنی. یعنی میتونی هر لحظه شبکه عصبیت رو تغییر بدی و این خیلی برای پروژههای تحقیقاتی مفیده. PyTorch هم مثل Keras رابط کاربری خوبی داره ولی به نسبت Keras یه کم پیچیدهتره. اگه تازهکاری، Keras گزینه بهتریه، اما اگه دنبال انعطافپذیری بیشتری هستی، PyTorch رو امتحان کن.
اگه دوست داری بیشتر در مورد TensorFlow و PyTorch بدونی یه سری به مقالههای "آموزش TENSORFLOW" و "PyTorch چیست؟" بزن.
Scikit-Learn بیشتر برای یادگیری ماشین کلاسیک استفاده میشه. یعنی اگه بخوای مدلهای سادهتری مثل رگرسیون، دستهبندی و کلاسترینگ بسازی، Scikit-Learn عالیه. این ابزار خیلی ساده و کاربرپسنده، ولی برای یادگیری عمیق به قدرت Keras یا PyTorch نمیرسه. میتونی از Scikit-Learn برای پیشپردازش دادهها استفاده کنی و بعد از Keras برای ساخت مدلهای عمیقتر بهره ببری.
در مقاله جامع "آموزش Scikit-Learn در پایتون" به صورت کاربردی و عملی این کتابخونه رو بهت آموزش دادیم. پیشنهاد میکنم از دستش ندی!😉
Theano یه کتابخونه قدیمیتره که توی دانشگاه مونترال ساخته شده. این ابزار برای محاسبات عددی خیلی خوبه و از GPU برای سرعت بخشیدن به محاسبات استفاده میکنه. با این حال، Theano دیگه آپدیت نمیشه و توسعهدهندهها به ابزارهای جدیدتری مثل TensorFlow و PyTorch روی آوردن. Keras از Theano هم پشتیبانی میکنه، ولی بهتره از TensorFlow به عنوان بکاند استفاده کنی.
Microsoft Cognitive Toolkit (CNTK) یه فریمورک دیگهست که توسط مایکروسافت توسعه داده شده. این فریمورک هم قدرت زیادی داره و میتونه مدلهای پیچیده رو آموزش بده. CNTK بیشتر توی پروژههای مایکروسافت استفاده میشه ولی به اندازه TensorFlow یا PyTorch محبوبیت نداره. Keras با CNTK هم سازگاره و میتونی از این بکاند هم استفاده کنی.
حالا که تفاوتهای Keras با بقیه فریمورکها رو فهمیدی، آمادهای که بیشتر باهاش کار کنی؟ Keras به خاطر سادگی و قدرتش یه انتخاب عالیه، ولی اگه پروژت پیچیدهتر بشه یا نیاز به انعطاف بیشتری داشته باشی، میتونی سراغ فریمورکهای دیگه هم بری. پس ادامه مقاله رو بخون تا بیشتر با قابلیتهای Keras آشنا بشی و ببینی چطور میتونی از این ابزار فوقالعاده برای پروژههای یادگیری عمیقت استفاده کنی!
فرض میکنم که TensorFlow، Theano یا CNTK رو نصب کردید.
Keras رو میتونی با pip یا conda نصب کنی:
pip install keras
یا
conda install keras
Keras هفت دیتاست مختلف ارائه میده که میتونی مستقیم از خود Keras بارگذاری کنی. این دیتاها شامل دیتاستهای تصویری، قیمت خونه و نقد فیلم هستن.
توی این مقاله، ما از دیتاست MNIST استفاده میکنیم که شامل 70000 تصویر 28x28 خاکستری با 10 کلاس مختلفه. Keras این دیتا رو به یک مجموعه آموزشی با 60000 نمونه و یک مجموعه تست با 10000 نمونه تقسیم میکنه.
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
برای این که تصاویر رو به یه شبکه عصبی کانولوشنی بدیم، باید دادهها رو به چهار بعد تبدیل کنیم. این کار رو میتونیم با روش reshape توی numpy انجام بدیم. همچنین دادهها رو به float تبدیل و نرمالسازی میکنیم.
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
برچسبها رو هم با استفاده از متد to_categorical از Keras به one-hot encoding تبدیل میکنیم.
from keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
سادهترین راه برای ساخت مدل توی Keras استفاده از API ترتیبیه که بهت اجازه میده لایهها رو یکی پس از دیگری بچینی. مشکل API ترتیبی اینه که اجازه نمیده مدلهایی با ورودی یا خروجیهای متعدد بسازی، که برای بعضی مسائل نیازه.
با این حال، API ترتیبی برای بیشتر مسائل انتخابی عالیه.
برای ساخت یه شبکه عصبی کانولوشنی، فقط کافیه یه شیء Sequential بسازی و از تابع add برای اضافه کردن لایهها استفاده کنی.
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=x_train.shape[1:]))
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(10, activation='softmax'))
کد بالا اول یه شیء Sequential میسازه و چند تا لایه کانولوشنی، مکس پولینگ و دراپآوت اضافه میکنه. سپس خروجی رو تخت میکنه و اونو به یه لایه چگال و دراپآوت میفرسته قبل از این که به لایه خروجی برسه.
اگر میخوای مدلی بسازی که انعطافپذیری بیشتری داشته باشه، API تابعی Keras بهترین انتخابه. این API بهت اجازه میده مدلهای پیچیدهتری با چندین ورودی و خروجی و لایههای مشترک بسازی. با این حال، استفاده از API تابعی ممکنه کمی پیچیدهتر و کمتر قابل خواندن باشه.
وقتی از API تابعی استفاده میکنی، باید هر لایه رو به لایه قبلی متصل کنی. این یعنی باید خروجی هر لایه رو به عنوان ورودی به لایه بعدی پاس بدی. همچنین، حتماً باید با یه لایه ورودی (Input layer) شروع کنی.
from keras.models import Model
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout, Input
inputs = Input(shape=x_train.shape[1:])
x = Conv2D(filters=32, kernel_size=(5,5), activation='relu')(inputs)
x = Conv2D(filters=32, kernel_size=(5,5), activation='relu')(x)
x = MaxPool2D(pool_size=(2, 2))(x)
x = Dropout(rate=0.25)(x)
x = Conv2D(filters=64, kernel_size=(3,3), activation='relu')(x)
x = Conv2D(filters=64, kernel_size=(3,3), activation='relu')(x)
x = MaxPool2D(pool_size=(2, 2))(x)
x = Dropout(rate=0.25)(x)
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(rate=0.5)(x)
predictions = Dense(10, activation='softmax')(x)
model = Model(inputs=inputs, outputs=predictions)
قبل از این که بتونیم مدل رو آموزش بدیم، باید فرآیند یادگیری رو تنظیم کنیم. برای این کار باید یه بهینهساز (optimizer)، یه تابع خطا (loss function) و به صورت اختیاری چند معیار (metrics) مثل دقت رو مشخص کنیم.
تابع خطا معیاریه برای اندازهگیری این که مدل چقدر در رسیدن به هدف مشخص شده موفق بوده.
بهینهساز برای کمینهسازی تابع خطا با بهروزرسانی وزنها با استفاده از گرادیانها استفاده میشه.
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
افزایش دادهها یه فرایند برای ایجاد دادههای بیشتر از دادههای موجوده. برای تصاویر میتونی تغییرات کوچیکی مثل چرخوندن تصویر، زوم کردن، افزودن نویز و خیلی چیزای دیگه انجام بدی.
این کار کمک میکنه مدل مقاومتر بشه و مشکل کمبود دادهها رو حل میکنه. Keras یه متد به اسم ImageDataGenerator داره که میتونی ازش برای افزایش تصاویر استفاده کنی.
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=10,
zoom_range=0.1,
width_shift_range=0.1,
height_shift_range=0.1
)
این ImageDataGenerator تصاویر جدیدی ایجاد میکنه که چرخونده شدن، زوم شدن یا در عرض و ارتفاع تغییر مکان دادن.
حالا که مدل رو تعریف و کامپایل کردیم، وقت آموزش دادنه. معمولاً از متد fit استفاده میکنیم ولی چون از یه تولیدکننده داده استفاده میکنیم، از fit_generator استفاده میکنیم و تولیدکننده، دادههای X و y، تعداد epochها و اندازه batch رو بهش پاس میدیم. همچنین یه مجموعه اعتبارسنجی هم بهش میدیم تا خطا و دقت روی هر دو مجموعه رو بررسی کنیم.
epochs = 3
batch_size = 32
history = model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size), epochs=epochs,
validation_data=(x_test, y_test), steps_per_epoch=x_train.shape[0]//batch_size)
Epoch 1/5
1875/1875 [==============================] - 22s 12ms/step - loss: 0.1037 - acc: 0.9741 - val_loss: 0.0445 - val_acc: 0.9908
Epoch 2/5
1875/1875 [==============================] - 22s 12ms/step - loss: 0.0879 - acc: 0.9781 - val_loss: 0.0259 - val_acc: 0.9937
Epoch 3/5
1875/1875 [==============================] - 22s 12ms/step - loss: 0.0835 - acc: 0.9788 - val_loss: 0.0321 - val_acc: 0.9926
Epoch 4/5
1875/1875 [==============================] - 22s 12ms/step - loss: 0.0819 - acc: 0.9792 - val_loss: 0.0264 - val_acc: 0.9936
Epoch 5/5
1875/1875 [==============================] - 22s 12ms/step - loss: 0.0790 - acc: 0.9790 - val_loss: 0.0220 - val_acc: 0.9938
میتونیم دقت و خطای آموزش و تست رو برای هر epoch بصورت نموداری نمایش بدیم تا درک بهتری از عملکرد مدل داشته باشیم. دقت و خطا در طول epochها در متغیر history که هنگام آموزش دریافت کردیم ذخیره میشه و از Matplotlib برای نمایش این دادهها استفاده میکنیم.
import matplotlib.pyplot as plt
plt.plot(history.history['acc'], label='training accuracy')
plt.plot(history.history['val_acc'], label='testing accuracy')
plt.title('Accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.plot(history.history['loss'], label='training loss')
plt.plot(history.history['val_loss'], label='testing loss')
plt.title('Loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()
توی نمودارهای بالا میبینیم که مدل ما بیشبرازش نمیکنه و هنوز میتونیم epochهای بیشتری رو آموزش بدیم چون خطای اعتبارسنجی هنوز در حال کاهشه.
حالا که با نصب و راهاندازی Keras آشنا شدی، وقتشه دست به کار بشی و اولین مدل یادگیری عمیق خودت رو بسازی!
در این بخش، قدم به قدم نحوه ساخت یه مدل ساده با استفاده از Keras رو یاد میگیری.
مدل Sequential سادهترین نوع مدل توی Keras هست. این مدل بهت اجازه میده لایهها رو به ترتیب به هم متصل کنی.
برای شروع، از دیتاست MNIST استفاده میکنیم که شامل تصاویر دستنوشته اعداد هست. این دیتاست به دو مجموعه آموزشی و تست تقسیم شده.
from keras.datasets import mnist
# بارگذاری دیتاست
(x_train, y_train), (x_test, y_test) = mnist.load_data()
تصاویر باید به فرمت مناسب برای شبکه عصبی تبدیل بشن. این شامل تغییر شکل تصاویر به چهار بعد، تبدیل دادهها به نوع float32 و نرمالسازی اوناست.
# تبدیل دادهها به float32 و نرمالسازی
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
# تغییر شکل تصاویر به چهار بعد
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
همچنین باید برچسبها رو به فرمت one-hot encoding تبدیل کنیم.
from keras.utils import to_categorical
# تبدیل برچسبها به one-hot encoding
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
حالا وقتشه که مدل رو بسازیم. از مدل Sequential استفاده میکنیم و لایههای مختلف رو یکی یکی به مدل اضافه میکنیم.
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
# ساخت مدل Sequential
model = Sequential()
# اضافه کردن لایههای کانولوشنی، مکس پولینگ و دراپآوت
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=x_train.shape[1:]))
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(10, activation='softmax'))
توضیح کد:
قبل از این که مدل رو آموزش بدیم، باید اون رو کامپایل کنیم. برای این کار، یه بهینهساز (optimizer)، یه تابع خطا (loss function) و معیار دقت (accuracy) رو مشخص میکنیم.
# کامپایل کردن مدل
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
حالا وقتشه که مدل رو با دادههای آموزشی تمرین بدیم. از متد fit برای آموزش مدل استفاده میکنیم.
# آموزش مدل
model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=200, verbose=2)
توضیح کد:
در نهایت، مدل رو با دادههای تست ارزیابی میکنیم تا دقت اون رو ببینیم.
# ارزیابی مدل
scores = model.evaluate(x_test, y_test, verbose=0)
print(f'Accuracy: {scores[1] * 100}%')
این کد دقت مدل رو روی دادههای تست چاپ میکنه.
دیدی چقدر راحت میتونی با Keras یه مدل یادگیری عمیق بسازی؟😉 این فقط یکی از روشهای ساخت مدل بود. با Keras میتونی مدلهای پیچیدهتر و انعطافپذیرتری هم بسازی. حالا وقتشه که دست به کار بشی و مدلهای خودت رو بسازی!
Keras برای پروژههایی که نیاز به ساخت و آموزش مدلهای یادگیری عمیق دارن و همچنین برای کسانی که تازه وارد دنیای یادگیری ماشین شدن خیلی مناسبه.
خیر، Keras به طور مستقیم با PyTorch کار نمیکنه. Keras بیشتر با TensorFlow، Theano و CNTK سازگاره.
میتونی از روش model.save برای ذخیره مدل استفاده کنی. مثلاً:
model.save('my_model.h5')
برای بارگذاری مدل ذخیره شده میتونی از keras.models.load_model استفاده کنی:
from keras.models import load_model
model = load_model('my_model.h5')
Keras بیشتر برای یادگیری عمیق مناسبه، ولی میتونی از اون برای برخی پروژههای یادگیری ماشین کلاسیک هم استفاده کنی.
Keras یکی از بهترین ابزارها برای ورود به دنیای یادگیری ماشین و ساخت مدلهای یادگیری عمیق هست. با سادگی و انعطافپذیریش، به شما این امکان رو میده که بدون سردرگمی و پیچیدگیهای اضافی، مدلهای خودتون رو بسازید و آزمایش کنید. چه تازهکار باشید و چه یک حرفهای، Keras ابزاریست که به شما کمک میکنه تا سریعتر و بهتر مدلهای خودتون رو توسعه بدید.
یادت باشه که یادگیری ماشین یک سفره و Keras میتونه بهترین همراه برای این سفر باشه. پس شروع کن و از این ابزار فوقالعاده برای ساختن آیندهای هوشمندتر استفاده کن.
"یادگیری ماشین آیندهی دنیای تکنولوژی است و Keras یکی از دروازههای ورود به این آینده است." – ناشناس