البرنامج التعليمي لـ Keras: ما هو Keras؟ كيفية التثبيت في Python [مثال]

ما هو كيراس؟

Keras هي مكتبة شبكة عصبية مفتوحة المصدر مكتوبة بلغة Python الذي يعمل فوق Theano أو Tensorflow. لقد تم تصميمه ليكون معياريًا وسريعًا وسهل الاستخدام. تم تطويره بواسطة فرانسوا شوليه، أحد مهندسي Google. لا يتعامل Keras مع الحسابات ذات المستوى المنخفض. بدلاً من ذلك، فإنه يستخدم مكتبة أخرى للقيام بذلك، تسمى "Backend.

Keras عبارة عن غلاف API عالي المستوى لواجهة برمجة التطبيقات (API) ذات المستوى المنخفض، وهو قادر على العمل أعلى TensorFlow أو CNTK أو Theano. تتعامل واجهة برمجة التطبيقات Keras High-Level API مع الطريقة التي نصنع بها النماذج، أو نحدد الطبقات، أو ننشئ نماذج متعددة للمدخلات والمخرجات. في هذا المستوى، يقوم Keras أيضًا بتجميع نموذجنا مع وظائف الخسارة والمحسن، وعملية التدريب مع وظيفة الملاءمة. كيراس في Python لا يتعامل مع واجهة برمجة التطبيقات ذات المستوى المنخفض مثل إنشاء الرسم البياني الحسابي أو عمل الموترات أو المتغيرات الأخرى لأنه تم التعامل معها بواسطة محرك "الواجهة الخلفية".

ما هي الواجهة الخلفية؟

Backend هو مصطلح في Keras ينفذ جميع العمليات الحسابية ذات المستوى المنخفض مثل منتجات Tensor والتلافيفات والعديد من الأشياء الأخرى بمساعدة مكتبات أخرى مثل Tensorflow أو Theano. لذلك، سيقوم "المحرك الخلفي" بحساب النماذج وتطويرها. Tensorflow هو "المحرك الخلفي" الافتراضي ولكن يمكننا تغييره في التكوين.

Theano و Tensorflow و CNTK Backend

الخلفية للثيانو

Theano هو مشروع مفتوح المصدر تم تطويره من قبل مجموعة MILA في جامعة مونتريال، كيبيك، كندا. لقد كان أول إطار عمل مستخدمًا على نطاق واسع. إنه أ Python مكتبة تساعد في إنشاء مصفوفات متعددة الأبعاد للعمليات الحسابية باستخدام Numpy أو Scipy. يمكن لـ Theano استخدام وحدات معالجة الرسوميات لتسريع العمليات الحسابية، كما يمكنها إنشاء رسوم بيانية رمزية تلقائيًا لحساب التدرجات. على موقعها على الإنترنت، تدعي Theano أنها تستطيع التعرف على التعبيرات غير المستقرة عدديًا وحسابها باستخدام خوارزميات أكثر استقرارًا، وهذا مفيد جدًا للتعبيرات غير المستقرة.

الواجهة الخلفية لـ TensorFlow

من ناحية أخرى، Tensorflow هو النجم الصاعد في إطار التعلم العميق. تم تطويره بواسطة فريق Google Brain، وهو أداة التعلم العميق الأكثر شيوعًا. مع الكثير من الميزات، ويساهم الباحثون في المساعدة في تطوير هذا الإطار لأغراض التعلم العميق.

الواجهة الخلفية لـ CNTK

محرك خلفي آخر لـ Keras هو Microsoft مجموعة الأدوات المعرفية أو CNTK. إنه إطار عمل مفتوح المصدر للتعلم العميق تم تطويره بواسطة Microsoft فريق. يمكن تشغيله على وحدات معالجة الرسومات المتعددة أو الأجهزة المتعددة لتدريب نموذج التعلم العميق على نطاق واسع. في بعض الحالات، تم الإبلاغ عن CNTK بشكل أسرع من الأطر الأخرى مثل Tensorflow أو Theano. بعد ذلك، في هذا البرنامج التعليمي لـ Keras CNN، سنقوم بمقارنة الواجهات الخلفية لـ Theano وTensorFlow وCNTK.

مقارنة الواجهات الخلفية

نحتاج إلى إجراء اختبار مرجعي لمعرفة المقارنة بين هاتين الواجهتين الخلفيتين. كما ترون في معيار جيونج يون لي، تتم مقارنة أداء 3 واجهات خلفية مختلفة على أجهزة مختلفة. والنتيجة هي أن Theano أبطأ من الواجهة الخلفية الأخرى 50 مرات أبطأ، ولكن الدقة قريبة من بعضها البعض.

آخر اختبار القياس يتم تنفيذه بواسطة جاسميت بهاتيا. وذكر أن Theano أبطأ من Tensorflow في بعض الاختبارات. لكن الدقة الإجمالية هي نفسها تقريبًا لكل شبكة تم اختبارها.

لذلك، بين Theano وTensorflow وCTK، من الواضح أن TensorFlow أفضل من Theano. مع TensorFlow، يكون وقت الحساب أقصر بكثير وتكون CNN أفضل من غيرها.

التالي في هذا Keras Python البرنامج التعليمي، سوف نتعرف على الفرق بين Keras و TensorFlow (كيراس ضد تنسورفلو).

كيراس ضد تنسورفلو

المعلمات Keras Tensorflow
النوع غلاف API عالي المستوى واجهة برمجة التطبيقات ذات المستوى المنخفض
تعقيد سهل الاستخدام إذا كنت Python لغة أنت بحاجة إلى تعلم بناء جملة استخدام بعض وظائف Tensorflow
الهدف النشر السريع لصنع النموذج بطبقات قياسية يسمح لك بإنشاء رسم بياني حسابي أو طبقات نموذجية
الأدوات يستخدم أداة تصحيح أخطاء API أخرى مثل TFDBG يمكنك استخدام أدوات التصور Tensorboard
المجتمع مجتمعات نشطة كبيرة مجتمعات نشطة كبيرة وموارد مشتركة على نطاق واسع

مميزات كيراس

النشر السريع وسهل الفهم

Keras سريع جدًا في إنشاء نموذج للشبكة. إذا كنت تريد إنشاء نموذج شبكة بسيط يتكون من بضعة أسطر، Python يمكن أن يساعدك Keras في ذلك. انظر إلى مثال Keras أدناه:

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

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=50)) #input shape of 50
model.add(Dense(28, activation='relu')) #input shape of 50
model.add(Dense(10, activation='softmax'))

نظرًا لواجهة برمجة التطبيقات (API) الودية، يمكننا فهم العملية بسهولة. كتابة الكود بوظيفة بسيطة دون الحاجة إلى تعيين معلمات متعددة.

دعم المجتمع الكبير

هناك الكثير من مجتمعات الذكاء الاصطناعي التي تستخدم Keras في إطار التعلم العميق الخاص بها. يقوم الكثير منهم بنشر أكوادهم بالإضافة إلى البرامج التعليمية لعامة الناس.

لديك واجهات خلفية متعددة

يمكنك اختيار Tensorflow وCNTK وTheano كواجهة خلفية لك مع Keras. يمكنك اختيار واجهة خلفية مختلفة لمشاريع مختلفة حسب احتياجاتك. كل خلفية لها ميزة فريدة خاصة بها.

نشر النماذج عبر الأنظمة الأساسية والسهلة

مع مجموعة متنوعة من الأجهزة والأنظمة الأساسية المدعومة، يمكنك نشر Keras على أي جهاز مثل

  • iOS مع CoreML
  • Android مع تنسورفلو Android,
  • متصفح ويب مع دعم .js
  • المحرك السحابي
  • فطيرة التوت

دعم وحدات معالجة الرسومات المتعددة

يمكنك تدريب Keras على وحدة معالجة رسومات واحدة أو استخدام وحدات معالجة رسومات متعددة في وقت واحد. لأن Keras لديه دعم مدمج لتوازي البيانات حتى يتمكن من معالجة كميات كبيرة من البيانات وتسريع الوقت اللازم لتدريبها.

عيوب كيراس

لا يمكن التعامل مع واجهة برمجة التطبيقات ذات المستوى المنخفض

يتعامل Keras فقط مع واجهة برمجة التطبيقات عالية المستوى التي تعمل على إطار عمل آخر أو محرك خلفي مثل Tensorflow أو Theano أو CNTK. لذا، فهو ليس مفيدًا جدًا إذا كنت تريد إنشاء طبقة مجردة خاصة بك لأغراض البحث الخاصة بك لأن Keras لديها بالفعل طبقات مكونة مسبقًا.

تثبيت كيراس

في هذا القسم، سننظر في الطرق المختلفة المتاحة لتثبيت Keras

التثبيت المباشر أو البيئة الافتراضية

أيهما أفضل؟ التثبيت المباشر على الثعبان الحالي أو استخدام بيئة افتراضية؟ أقترح استخدام بيئة افتراضية إذا كان لديك العديد من المشاريع. تريد أن تعرف لماذا؟ وذلك لأن المشاريع المختلفة قد تستخدم إصدارًا مختلفًا من مكتبة keras.

على سبيل المثال، لدي مشروع يحتاج Python 3.5 باستخدام OpenCV 3.3 مع الواجهة الخلفية الأقدم لـ Keras-Theano ولكن في المشروع الآخر لا بد لي من استخدام Keras مع الإصدار الأحدث و Tensorflow كما هو الحال مع الواجهة الخلفية Python دعم 3.6.6

لا نريد أن تتعارض مكتبة Keras مع بعضها البعض، أليس كذلك؟ لذلك نستخدم بيئة افتراضية لتوطين المشروع بنوع معين من المكتبات أو يمكننا استخدام نظام أساسي آخر مثل Cloud Service لإجراء العمليات الحسابية لنا مثل Amazon خدمة ويب.

تثبيت Keras على Amazon خدمة الويب (AWS)

Amazon خدمة الويب هي منصة تقدم خدمات ومنتجات الحوسبة السحابية للباحثين أو لأي أغراض أخرى. تقوم AWS بتأجير الأجهزة والشبكات وقاعدة البيانات وما إلى ذلك حتى نتمكن من استخدامها مباشرة من الإنترنت. إحدى خدمات AWS الشهيرة لأغراض التعلم العميق هي Amazon خدمة التعلم العميق لصورة الآلة أو DL

للحصول على تعليمات مفصلة حول كيفية استخدام AWS، راجع هذا البرنامج التعليمي

ملاحظة حول AMI: سيكون لديك AMI التالي متاحًا

تثبيت Keras على AWS

AWS Deep Learning AMI هي بيئة افتراضية في خدمة AWS EC2 تساعد الباحثين أو الممارسين على العمل مع التعلم العميق. تقدم DLAMI محركات وحدات المعالجة المركزية الصغيرة حتى محركات وحدات معالجة الرسومات المتعددة عالية الطاقة مع CUDA وcuDNN التي تم تكوينها مسبقًا، وتأتي مع مجموعة متنوعة من أطر التعلم العميق.

إذا كنت تريد استخدامه على الفور، فيجب عليك اختيار Deep Learning AMI لأنه يأتي مثبتًا مسبقًا مع أطر التعلم العميق الشائعة.

ولكن إذا كنت ترغب في تجربة إطار عمل مخصص للتعلم العميق للبحث، فيجب عليك تثبيت Deep Learning Base AMI لأنه يأتي مع مكتبات أساسية مثل CUDA وcuDNN وبرامج تشغيل وحدات معالجة الرسومات والمكتبات الأخرى المطلوبة للتشغيل مع بيئة التعلم العميق الخاصة بك.

كيفية تثبيت كيراس على Amazon SageMaker

Amazon SageMaker عبارة عن منصة للتعلم العميق تساعدك في التدريب ونشر شبكة التعلم العميق باستخدام أفضل الخوارزميات.

كمبتدئ، هذه هي الطريقة الأسهل لاستخدام Keras. فيما يلي عملية حول كيفية تثبيت Keras على Amazon سيج ميكر:

الخطوة 1) افتح Amazon SageMaker

في الخطوة الأولى، افتح Amazon ساجيماكر وحدة التحكم وانقر على إنشاء مثيل دفتر الملاحظات.

قم بتثبيت Keras على Amazon SageMaker

الخطوة 2) أدخل التفاصيل

  1. أدخل اسم دفتر الملاحظات الخاص بك.
  2. قم بإنشاء دور IAM. سيتم إنشاء دور AMI Amazon دور IAM بتنسيق AmazonSageMaker-Executionrole-YYYYMMDD|HHmmSS.
  3. وأخيرًا، اختر إنشاء مثيل دفتر ملاحظات. وبعد لحظات قليلة، Amazon تطلق Sagemaker مثيلًا للكمبيوتر الدفتري.

قم بتثبيت Keras على Amazon SageMaker

ملاحظات:إذا كنت تريد الوصول إلى الموارد من VPC، فقم بتمكين الوصول المباشر إلى الإنترنت. وإلا، فلن يكون لدى مثيل الكمبيوتر المحمول هذا وصول إلى الإنترنت، وبالتالي من المستحيل تدريب النماذج أو استضافتها

الخطوة 3) إطلاق المثيل

انقر فوق "فتح" لبدء تشغيل المثيل

قم بتثبيت Keras على Amazon SageMaker

الخطوة 4) ابدأ الترميز

In Jupyter، انقر فوق جديد> conda_tensorflow_p36 وستكون جاهزًا للترميز

قم بتثبيت Keras على Amazon SageMaker

تثبيت Keras في لينكس

لتمكين Keras مع Tensorflow كمحرك خلفي، نحتاج إلى تثبيت Tensorflow أولاً. قم بتشغيل هذا الأمر لتثبيت Tensorflow مع وحدة المعالجة المركزية (بدون GPU)

pip install --upgrade tensorflow

إذا كنت تريد تمكين دعم GPU لـ Tensorflow، فيمكنك استخدام هذا الأمر

pip install --upgrade tensorflow-gpu

تثبيت Keras على نظام Linux

دعونا نتحقق Python لمعرفة ما إذا كان التثبيت ناجحًا عن طريق الكتابة

user@user:~$ python
Python 3.6.4 (default, Mar 20 2018, 11:10:20) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>>

إذا لم تكن هناك رسالة خطأ، فإن عملية التثبيت ناجحة

قم بتثبيت كيراس

بعد أن قمنا بتثبيت Tensorflow، لنبدأ في تثبيت keras. اكتب هذا الأمر في المحطة

pip install keras

سيبدأ في تثبيت Keras وأيضًا جميع تبعياته. يجب أن ترى شيئًا كهذا:

قم بتثبيت كيراس

الآن تم تثبيت Keras في نظامنا!

التحقق

قبل أن نبدأ في استخدام Keras، يجب علينا التحقق مما إذا كان Keras الخاص بنا يستخدم Tensorflow كواجهة خلفية عن طريق فتح ملف التكوين:

gedit ~/.keras/keras.json

يجب أن نرى شيئا من هذا القبيل

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

كما ترى، تستخدم "الواجهة الخلفية" Tensorflow. هذا يعني أن keras تستخدم Tensorflow كواجهة خلفية كما توقعنا

والآن قم بتشغيله على الجهاز عن طريق الكتابة

user@user:~$ python3
Python 3.6.4 (default, Mar 20 2018, 11:10:20) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> 

كيفية تثبيت كيراس على Windows

قبل أن نقوم بالتثبيت Tensorflow وKeras، يجب علينا تثبيت Pythonو pip و virtualenv. إذا قمت بالفعل بتثبيت هذه المكتبات، فيجب عليك الانتقال إلى الخطوة التالية، وإلا فافعل ما يلي:

تثبيت Python 3 عن طريق التحميل من هذا الصفحة

تثبيت النقطة عن طريق التشغيل

قم بتثبيت virtualenv باستخدام هذا الأمر

pip3 install –U pip virtualenv

تثبيت Microsoft مرئي C++ التحديث القابل لإعادة التوزيع لعام 2015 3

ثم قم بتشغيل هذا البرنامج النصي

pip3 install virtualenv

إعداد البيئة الافتراضية

يستخدم هذا لعزل نظام العمل عن النظام الرئيسي.

virtualenv –-system-site-packages –p python3 ./venv

تفعيل البيئة

.\venv\Scripts\activate

بعد إعداد البيئة، يظل تثبيت Tensorflow وKeras كما هو الحال في Linux. بعد ذلك في هذا البرنامج التعليمي للتعلم العميق باستخدام Keras، سنتعرف على أساسيات Keras للتعلم العميق.

أساسيات Keras للتعلم العميق

الهيكل الرئيسي في Keras هو النموذج الذي يحدد الرسم البياني الكامل للشبكة. يمكنك إضافة المزيد من الطبقات إلى نموذج موجود لإنشاء نموذج مخصص تحتاجه لمشروعك.

فيما يلي كيفية إنشاء نموذج متسلسل وبعض الطبقات الشائعة الاستخدام في التعلم العميق

1. النموذج المتسلسل

from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout

model = Sequential()

2. طبقة تلافيفية

هذا كيراس Python مثال على الطبقة التلافيفية كطبقة الإدخال مع شكل الإدخال 320x320x3، مع 48 مرشحًا بحجم 3x3 واستخدام ReLU كوظيفة تنشيط.

input_shape=(320,320,3) #this is the input shape of an image 320x320x3
model.add(Conv2D(48, (3, 3), activation='relu', input_shape= input_shape))

نوع آخر هو

model.add(Conv2D(48, (3, 3), activation='relu'))

3. ماكسPoolinطبقة ز

لاختزال تمثيل الإدخال، استخدم MaxPool2d وحدد حجم kernel

model.add(MaxPooling2D(pool_size=(2, 2)))

4. طبقة كثيفة

إضافة طبقة متصلة بالكامل مع تحديد حجم الإخراج فقط

model.add(Dense(256, activation='relu'))

5. طبقة التسرب

إضافة طبقة التسرب مع احتمال 50٪

model.add(Dropout(0.5))

التجميع والتدريب والتقييم

بعد أن حددنا نموذجنا، فلنبدأ في تدريبهم. مطلوب تجميع الشبكة أولاً باستخدام وظيفة الخسارة ووظيفة المحسن. سيسمح ذلك للشبكة بتغيير الأوزان وتقليل الخسارة.

model.compile(loss='mean_squared_error', optimizer='adam')

الآن لبدء التدريب، استخدم fit لتغذية النموذج ببيانات التدريب والتحقق من الصحة. سيسمح لك ذلك بتدريب الشبكة على دفعات وتعيين العصور.

model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))

خطوتنا الأخيرة هي تقييم النموذج باستخدام بيانات الاختبار.

score = model.evaluate(x_test, y_test, batch_size=32)

دعونا نحاول استخدام الانحدار الخطي البسيط

import keras
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import matplotlib.pyplot as plt 
 
x = data = np.linspace(1,2,200)
y = x*4 + np.random.randn(*x.shape) * 0.3


model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))

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

weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init)) 


model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))

predict = model.predict(data)

plt.plot(data, predict, 'b', data , y, 'k.')
plt.show()

بعد تدريب البيانات، يجب أن يبدو الإخراج هكذا

الانحدار الخطي

مع الوزن الأولي

Linear regression model is initialized with weights w: 0.37, b: 0.00

والوزن النهائي

Linear regression model is trained to have weight w: 3.70, b: 0.61

ضبط النماذج المدربة مسبقًا في Keras وكيفية استخدامها

لماذا نستخدم نماذج Fine Tune ومتى نستخدمها

الضبط الدقيق هو مهمة لتعديل نموذج تم تدريبه مسبقًا بحيث تتكيف المعلمات مع النموذج الجديد. عندما نريد التدريب من الصفر على نموذج جديد، نحتاج إلى كمية كبيرة من البيانات حتى تتمكن الشبكة من العثور على جميع المعلمات. لكن في هذه الحالة، سنستخدم نموذجًا تم تدريبه مسبقًا بحيث تكون المعلمات قد تم تعلمها بالفعل ويكون لها وزن.

على سبيل المثال، إذا أردنا تدريب نموذج Keras الخاص بنا لحل مشكلة التصنيف ولكن لدينا كمية صغيرة فقط من البيانات، فيمكننا حل ذلك باستخدام نقل التعلم + طريقة الضبط الدقيق.

باستخدام شبكة وأوزان مدربة مسبقًا، لا نحتاج إلى تدريب الشبكة بأكملها. نحتاج فقط إلى تدريب الطبقة الأخيرة المستخدمة لحل مهمتنا كما نسميها طريقة الضبط الدقيق.

إعداد نموذج الشبكة

بالنسبة للنموذج الذي تم تدريبه مسبقًا، يمكننا تحميل مجموعة متنوعة من النماذج التي تمتلكها Keras بالفعل في مكتبتها مثل:

  • VGG16
  • البداية V3
  • ريسنيت
  • موبايل نت
  • Xception
  • InceptionResNetV2

لكن في هذه العملية، سنستخدم نموذج الشبكة VGG16 وimageNet كثقل للنموذج. سنقوم بضبط الشبكة لتصنيف 8 أنواع مختلفة من الفئات باستخدام الصور من مجموعة بيانات الصور الطبيعية Kaggle

هندسة نموذج VGG16

هندسة نموذج VGG16

مصدر

تحميل بياناتنا إلى AWS S3 Bucket

في عملية التدريب لدينا، سوف نستخدم صورة لصور طبيعية من 8 فئات مختلفة مثل الطائرات والسيارات والقطة والكلب والزهرة والفواكه والدراجة النارية والشخص. أولاً، نحتاج إلى تحميل بياناتنا إلى Amazon دلو S3.

Amazon دلو S3

الخطوة 1) بعد تسجيل الدخول إلى حساب S3 الخاص بك، فلنقم بإنشاء مجموعة من خلال تسجيل الوقت إنشاء دلو

تحميل البيانات إلى مجموعة AWS S3

الخطوة 2) الآن اختر اسم الجرافة ومنطقتك وفقًا لحسابك. تأكد من توفر اسم الجرافة. بعد ذلك انقر خلق.

تحميل البيانات إلى مجموعة AWS S3

الخطوة 3) كما ترون، دلو الخاص بك جاهز للاستخدام. ولكن كما ترون، الوصول ليس عامًا، فهو مفيد لك إذا كنت تريد الاحتفاظ به خاصًا لنفسك. يمكنك تغيير هذه المجموعة للوصول العام في خصائص المجموعة

تحميل البيانات إلى مجموعة AWS S3

الخطوة 4) تبدأ الآن في تحميل بيانات التدريب الخاصة بك إلى مجموعتك. سأقوم هنا بتحميل ملف tar.gz الذي يتكون من صور لعملية التدريب والاختبار.

تحميل البيانات إلى مجموعة AWS S3

الخطوة 5) الآن انقر على الملف الخاص بك وانسخ الرابط حتى نتمكن من تنزيله.

تحميل البيانات إلى مجموعة AWS S3

تحضير البيانات

نحتاج إلى إنشاء بيانات التدريب الخاصة بنا باستخدام Keras ImageDataGenerator.

يجب عليك أولاً التنزيل باستخدام wget مع رابط ملفك من S3 Bucket.

!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz		
!tar -xzf images.tar.gz

بعد تنزيل البيانات لنبدأ عملية التدريب.

from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import matplotlib.pyplot as plt

train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 8


train_datagen = ImageDataGenerator(validation_split=0.3,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
                        directory=train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='categorical',
                        color_mode='rgb',
                        shuffle=True)

بيانات الصورةGenerator سيقوم بإنشاء بيانات X_training من الدليل. سيتم استخدام الدليل الفرعي في هذا الدليل كفئة لكل كائن. سيتم تحميل الصورة باستخدام وضع ألوان RGB، مع وضع الفئة الفئوية لبيانات Y_training، بحجم دفعة يبلغ 16. وأخيرًا، قم بخلط البيانات.

دعونا نرى صورنا بشكل عشوائي عن طريق رسمها باستخدام matplotlib

x_batch, y_batch = train_generator.next()

fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows):
    num = np.random.randint(batch_size)
    image = x_batch[num].astype(np.int)
    fig.add_subplot(rows, columns, i)
    plt.imshow(image)
plt.show()

تحضير البيانات

بعد ذلك، لنقم بإنشاء نموذج شبكتنا من VGG16 بوزن imageNet المُدرب مسبقًا. سنقوم بتجميد هذه الطبقات بحيث لا تكون الطبقات قابلة للتدريب لمساعدتنا في تقليل وقت الحساب.

إنشاء نموذجنا من VGG16

import keras
from keras.models import Model, load_model
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16


#Load the VGG model
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))

print(base_model.summary())

    # Freeze the layers 
for layer in base_model.layers:
    layer.trainable = False
 
# # Create the model
model = keras.models.Sequential()

# # Add the vgg convolutional base model
model.add(base_model)
 
# # Add new layers
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(num_class, activation='softmax'))
 
# # Show a summary of the model. Check the number of trainable parameters    
print(model.summary())

كما ترون أدناه، ملخص نموذج شبكتنا. من المدخلات من طبقات VGG16، نضيف بعد ذلك طبقتين متصلتين بالكامل والتي ستستخرج 2 ميزة وطبقة مخرجات ستحسب الفئات الثمانية مع تنشيط softmax.

Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Model)                (None, 7, 7, 512)         14714688  
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 1024)              25691136  
_________________________________________________________________
dense_2 (Dense)              (None, 1024)              1049600   
_________________________________________________________________
dense_3 (Dense)              (None, 8)                 8200      
=================================================================
Total params: 41,463,624
Trainable params: 26,748,936
Non-trainable params: 14,714,688

التدريب

# # Compile the model
from keras.optimizers import SGD

model.compile(loss='categorical_crossentropy',
          optimizer=SGD(lr=1e-3),
          metrics=['accuracy'])

# # Start the training process
# model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2)

# # #save the model
# model.save('catdog.h5')

history = model.fit_generator(
        train_generator,
        steps_per_epoch=train_generator.n/batch_size,
        epochs=10)
        
model.save('fine_tune.h5')

# summarize history for accuracy
import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.title('loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['loss'], loc='upper left')
plt.show()

النتائج

Epoch 1/10
432/431 [==============================] - 53s 123ms/step - loss: 0.5524 - acc: 0.9474 
Epoch 2/10
432/431 [==============================] - 52s 119ms/step - loss: 0.1571 - acc: 0.9831
Epoch 3/10
432/431 [==============================] - 51s 119ms/step - loss: 0.1087 - acc: 0.9871
Epoch 4/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0624 - acc: 0.9926
Epoch 5/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0591 - acc: 0.9938
Epoch 6/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0498 - acc: 0.9936
Epoch 7/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0403 - acc: 0.9958
Epoch 8/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0248 - acc: 0.9959
Epoch 9/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0466 - acc: 0.9942
Epoch 10/10
432/431 [==============================] - 52s 120ms/step - loss: 0.0338 - acc: 0.9947

التدريب

كما ترون، فقد انخفضت خسائرنا بشكل كبير وبلغت الدقة 100٪ تقريبًا. لاختبار نموذجنا، اخترنا صورًا عشوائيًا عبر الإنترنت ووضعناها في مجلد الاختبار مع فئة مختلفة لاختبارها

اختبار نموذجنا

model = load_model('fine_tune.h5')

test_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
                        directory=train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='categorical',
                        color_mode='rgb',
                        shuffle=True)

test_generator = test_datagen.flow_from_directory(
                        directory=test_path, 
                        target_size=(image_size, image_size),
                        color_mode='rgb',
                        shuffle=False,
                        class_mode='categorical',
                        batch_size=1)

filenames = test_generator.filenames
nb_samples = len(filenames)

fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows -1):
    x_batch, y_batch = test_generator.next()

    name = model.predict(x_batch)
    name = np.argmax(name, axis=-1)
    true_name = y_batch
    true_name = np.argmax(true_name, axis=-1)

    label_map = (test_generator.class_indices)
    label_map = dict((v,k) for k,v in label_map.items()) #flip k,v
    predictions = [label_map[k] for k in name]
    true_value = [label_map[k] for k in true_name]

    image = x_batch[0].astype(np.int)
    fig.add_subplot(rows, columns, i)
    plt.title(str(predictions[0]) + ':' + str(true_value[0]))
    plt.imshow(image)
plt.show()

واختبارنا كما هو موضح أدناه! تم توقع خطأ صورة واحدة فقط من اختبار مكون من 1 صورة!

نموذج الاختبار

الشبكة العصبية للتعرف على الوجوه باستخدام Keras

لماذا نحتاج إلى الاعتراف

نحتاج إلى التعرف ليسهل علينا التعرف على وجه الشخص أو التعرف عليه، أو نوع الأشياء، أو العمر المقدر للشخص من وجهه، أو حتى معرفة تعابير وجه ذلك الشخص.

الشبكة العصبية للتعرف على الوجوه باستخدام Keras

ربما تدرك في كل مرة تحاول فيها وضع علامة على وجه صديقك في صورة ما، فإن الميزة الموجودة في Facebook قامت بذلك نيابةً عنك، وهي وضع علامة على وجه صديقك دون الحاجة إلى وضع علامة عليه أولاً. هذه هي ميزة التعرف على الوجه التي يطبقها فيسبوك لتسهيل الإشارة إلى الأصدقاء.

فكيف يعمل؟ في كل مرة نضع علامة على وجه صديقنا، سيتعرف الذكاء الاصطناعي الخاص بفيسبوك على ذلك وسيحاول التنبؤ به حتى يحصل على النتيجة الصحيحة. نفس النظام الذي سنستخدمه في التعرف على الوجوه الخاصة بنا. لنبدأ في التعرف على الوجوه باستخدام التعلم العميق

نموذج الشبكة

سوف نستخدم نموذج الشبكة VGG16 ولكن بوزن VGGFace.

هندسة نموذج VGG16

نموذج الشبكة

ما هو VGGFace؟ إنه تطبيق Keras للتعرف العميق على الوجوه الذي قدمه Parkhi وOmkar M. وآخرون. "التعرف العميق على الوجوه". BMVC (2015). يستخدم الإطار VGG16 كهندسة للشبكة.

يمكنك تنزيل VGGFace من جيثب

from keras.applications.vgg16 import VGG16
from keras_vggface.vggface import VGGFace

face_model = VGGFace(model='vgg16', 
                weights='vggface',
                input_shape=(224,224,3)) 
face_model.summary()

كما ترون ملخص الشبكة

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792      
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928     
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 112, 112, 64)      0         
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856     
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584    
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 56, 56, 128)       0         
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168    
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 28, 28, 256)       0         
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160   
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 14, 14, 512)       0         
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc6 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc6/relu (Activation)        (None, 4096)              0         
_________________________________________________________________
fc7 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
fc7/relu (Activation)        (None, 4096)              0         
_________________________________________________________________
fc8 (Dense)                  (None, 2622)              10742334  
_________________________________________________________________
fc8/softmax (Activation)     (None, 2622)              0         
=================================================================
Total params: 145,002,878
Trainable params: 145,002,878
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):

سنفعل نقل التعلم + الضبط الدقيق لجعل التدريب أسرع باستخدام مجموعات البيانات الصغيرة. أولاً، سنقوم بتجميد الطبقات الأساسية بحيث لا تكون الطبقات قابلة للتدريب.

for layer in face_model.layers:
    layer.trainable = False

ثم نضيف طبقتنا الخاصة للتعرف على وجوه الاختبار لدينا. سنضيف طبقتين متصلتين بالكامل وطبقة إخراج مع 2 أشخاص لاكتشافهم.

from keras.models import Model, Sequential
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation

person_count = 5

last_layer = face_model.get_layer('pool5').output

x = Flatten(name='flatten')(last_layer)
x = Dense(1024, activation='relu', name='fc6')(x)
x = Dense(1024, activation='relu', name='fc7')(x)
out = Dense(person_count, activation='softmax', name='fc8')(x)

custom_face = Model(face_model.input, out)

دعونا نرى ملخص شبكتنا

Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 112, 112, 64)      0
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 56, 56, 128)       0
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 28, 28, 256)       0
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 14, 14, 512)       0
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 7, 7, 512)         0
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0
_________________________________________________________________
fc6 (Dense)                  (None, 1024)              25691136
_________________________________________________________________
fc7 (Dense)                  (None, 1024)              1049600
_________________________________________________________________
fc8 (Dense)                  (None, 5)                 5125
=================================================================
Total params: 41,460,549
Trainable params: 26,745,861
Non-trainable params: 14,714,688

كما ترون أعلاه، بعد طبقة التجمع 5، سيتم تسويتها في متجه ميزة واحد سيتم استخدامه بواسطة الطبقة الكثيفة للتعرف النهائي.

تحضير وجوهنا

الآن دعونا نجهز وجوهنا. لقد قمت بإنشاء دليل يتكون من 5 أشخاص مشهورين

  • جاك ما
  • جيسون ستاثام
  • جوني ديب
  • روبرت داوني جونيور
  • روان أتكينسون

يحتوي كل مجلد على 10 صور لكل عملية تدريب وتقييم. إنها كمية صغيرة جدًا من البيانات ولكن هذا هو التحدي، أليس كذلك؟

سوف نستخدم مساعدة أداة Keras لمساعدتنا في إعداد البيانات. سيتم تكرار هذه الوظيفة في مجلد مجموعة البيانات ثم إعدادها بحيث يمكن استخدامها في التدريب.

from keras.preprocessing.image import ImageDataGenerator
batch_size = 5
train_path = 'data/'
eval_path = 'eval/'

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

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

train_generator = train_datagen.flow_from_directory(
                        train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='sparse',
                        color_mode='rgb')

valid_generator = valid_datagen.flow_from_directory(
    directory=eval_path,
    target_size=(224, 224),
    color_mode='rgb',
    batch_size=batch_size,
    class_mode='sparse',
    shuffle=True,
)

تدريب نموذجنا

لنبدأ عملية التدريب لدينا من خلال تجميع شبكتنا مع وظيفة الخسارة والمحسن. هنا، نستخدم sparse_categorical_crossentropy كدالة الخسارة، بمساعدة SGD كمُحسِّن التعلم الخاص بنا.

from keras.optimizers import SGD

custom_face.compile(loss='sparse_categorical_crossentropy',
                         optimizer=SGD(lr=1e-4, momentum=0.9),
                         metrics=['accuracy'])

history = custom_face.fit_generator(
        train_generator,
        validation_data=valid_generator,
        steps_per_epoch=49/batch_size,
        validation_steps=valid_generator.n,
        epochs=50)

custom_face.evaluate_generator(generator=valid_generator)
        
custom_face.save('vgg_face.h5')
Epoch 25/50
10/9 [==============================] - 60s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5659 - val_acc: 0.5851
Epoch 26/50
10/9 [==============================] - 59s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5638 - val_acc: 0.5809
Epoch 27/50
10/9 [==============================] - 60s 6s/step - loss: 1.4779 - acc: 0.8597 - val_loss: 1.5613 - val_acc: 0.5477
Epoch 28/50
10/9 [==============================] - 60s 6s/step - loss: 1.4755 - acc: 0.9199 - val_loss: 1.5576 - val_acc: 0.5809
Epoch 29/50
10/9 [==============================] - 60s 6s/step - loss: 1.4794 - acc: 0.9153 - val_loss: 1.5531 - val_acc: 0.5892
Epoch 30/50
10/9 [==============================] - 60s 6s/step - loss: 1.4714 - acc: 0.8953 - val_loss: 1.5510 - val_acc: 0.6017
Epoch 31/50
10/9 [==============================] - 60s 6s/step - loss: 1.4552 - acc: 0.9199 - val_loss: 1.5509 - val_acc: 0.5809
Epoch 32/50
10/9 [==============================] - 60s 6s/step - loss: 1.4504 - acc: 0.9199 - val_loss: 1.5492 - val_acc: 0.5975
Epoch 33/50
10/9 [==============================] - 60s 6s/step - loss: 1.4497 - acc: 0.8998 - val_loss: 1.5490 - val_acc: 0.5851
Epoch 34/50
10/9 [==============================] - 60s 6s/step - loss: 1.4453 - acc: 0.9399 - val_loss: 1.5529 - val_acc: 0.5643
Epoch 35/50
10/9 [==============================] - 60s 6s/step - loss: 1.4399 - acc: 0.9599 - val_loss: 1.5451 - val_acc: 0.5768
Epoch 36/50
10/9 [==============================] - 60s 6s/step - loss: 1.4373 - acc: 0.8998 - val_loss: 1.5424 - val_acc: 0.5768
Epoch 37/50
10/9 [==============================] - 60s 6s/step - loss: 1.4231 - acc: 0.9199 - val_loss: 1.5389 - val_acc: 0.6183
Epoch 38/50
10/9 [==============================] - 59s 6s/step - loss: 1.4247 - acc: 0.9199 - val_loss: 1.5372 - val_acc: 0.5934
Epoch 39/50
10/9 [==============================] - 60s 6s/step - loss: 1.4153 - acc: 0.9399 - val_loss: 1.5406 - val_acc: 0.5560
Epoch 40/50
10/9 [==============================] - 60s 6s/step - loss: 1.4074 - acc: 0.9800 - val_loss: 1.5327 - val_acc: 0.6224
Epoch 41/50
10/9 [==============================] - 60s 6s/step - loss: 1.4023 - acc: 0.9800 - val_loss: 1.5305 - val_acc: 0.6100
Epoch 42/50
10/9 [==============================] - 59s 6s/step - loss: 1.3938 - acc: 0.9800 - val_loss: 1.5269 - val_acc: 0.5975
Epoch 43/50
10/9 [==============================] - 60s 6s/step - loss: 1.3897 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.6432
Epoch 44/50
10/9 [==============================] - 60s 6s/step - loss: 1.3828 - acc: 0.9800 - val_loss: 1.5210 - val_acc: 0.6556
Epoch 45/50
10/9 [==============================] - 59s 6s/step - loss: 1.3848 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.5975
Epoch 46/50
10/9 [==============================] - 60s 6s/step - loss: 1.3716 - acc: 0.9800 - val_loss: 1.5216 - val_acc: 0.6432
Epoch 47/50
10/9 [==============================] - 60s 6s/step - loss: 1.3721 - acc: 0.9800 - val_loss: 1.5195 - val_acc: 0.6266
Epoch 48/50
10/9 [==============================] - 60s 6s/step - loss: 1.3622 - acc: 0.9599 - val_loss: 1.5108 - val_acc: 0.6141
Epoch 49/50
10/9 [==============================] - 60s 6s/step - loss: 1.3452 - acc: 0.9399 - val_loss: 1.5140 - val_acc: 0.6432
Epoch 50/50
10/9 [==============================] - 60s 6s/step - loss: 1.3387 - acc: 0.9599 - val_loss: 1.5100 - val_acc: 0.6266

كما ترون، تصل دقة التحقق لدينا إلى 64%، وهذه نتيجة جيدة لكمية صغيرة من بيانات التدريب. يمكننا تحسين ذلك عن طريق إضافة المزيد من الطبقات أو إضافة المزيد من الصور التدريبية حتى يتمكن نموذجنا من معرفة المزيد عن الوجوه وتحقيق المزيد من الدقة.

دعونا نختبر نموذجنا من خلال صورة اختبارية

صورة الاختبار

from keras.models import load_model
from keras.preprocessing.image import load_img, save_img, img_to_array
from keras_vggface.utils import preprocess_input

test_img = image.load_img('test.jpg', target_size=(224, 224))
img_test = image.img_to_array(test_img)
img_test = np.expand_dims(img_test, axis=0)
img_test = utils.preprocess_input(img_test)
predictions = model.predict(img_test)
predicted_class=np.argmax(predictions,axis=1)

labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class]
print(predictions)
['RobertDJr']

وباستخدام صورة روبرت داوني جونيور كصورة اختبارية، تظهر أن الوجه المتوقع صحيح!

التنبؤ باستخدام Live Cam!

ماذا لو اختبرنا مهارتنا في تنفيذها من خلال مدخلات من كاميرا الويب؟ باستخدام OpenCV مع Haar Face cascade للعثور على وجهنا وبمساعدة نموذج شبكتنا، يمكننا التعرف على الشخص.

الخطوة الأولى هي تحضير وجوهك أنت وصديقك. كلما زادت البيانات المتوفرة لدينا، كانت النتيجة أفضل!

قم بإعداد شبكتك وتدريبها مثل الخطوة السابقة، وبعد اكتمال التدريب أضف هذا السطر للحصول على الصورة المدخلة من الكاميرا

#Load trained model
from keras.models import load_model
from keras_vggface import utils
import cv2

image_size = 224
device_id = 0 #camera_device id 

model = load_model('my faces.h5')

#make labels according to your dataset folder 
labels = dict(fisrtname=0,secondname=1) #and so on
print(labels)

cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(device_id)

while camera.isOpened():
    ok, cam_frame = camera.read()
    if not ok:
        break
    
    gray_img=cv2.cvtColor(cam_frame, cv2.COLOR_BGR2GRAY)
    faces= cascade_classifier.detectMultiScale(gray_img, minNeighbors=5)

    for (x,y,w,h) in faces:
        cv2.rectangle(cam_frame,(x,y),(x+w,y+h),(255,255,0),2)
        roi_color = cam_frame [y:y+h, x:x+w]
        roi color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB)
        roi_color = cv2.resize(roi_color, (image_size, image_size))
        image = roi_color.astype(np.float32, copy=False)
        image = np.expand_dims(image, axis=0)
        image = preprocess_input(image, version=1) # or version=2
        preds = model.predict(image)
        predicted_class=np.argmax(preds,axis=1)

        labels = dict((v,k) for k,v in labels.items())
        name = [labels[k] for k in predicted_class]

        cv2.putText(cam_frame,str(name), 
                    (x + 10, y + 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 2)
        
    cv2.imshow('video image', cam_frame)
    key = cv2.waitKey(30)
    if key == 27: # press 'ESC' to quit
        break

camera.release()
cv2.destroyAllWindows()

أيهما أفضل؟ كيراس أو Tensorflow

يقدم Keras البساطة عند كتابة السيناريو. يمكننا أن نبدأ الكتابة والفهم مباشرة مع Keras لأنه ليس من الصعب جدًا فهمه. إنه أكثر سهولة في الاستخدام وسهل التنفيذ، ولا حاجة إلى إجراء العديد من المتغيرات لتشغيل النموذج. لذلك، لا نحتاج إلى فهم كل التفاصيل في عملية الواجهة الخلفية.

من ناحية أخرى، يوفر Tensorflow عمليات منخفضة المستوى توفر المرونة والعمليات المتقدمة إذا كنت تريد إنشاء رسم بياني أو نموذج حسابي عشوائي. يمكن لـ Tensorflow أيضًا تصور العملية بمساعدة TensorBoard وأداة مصحح أخطاء متخصصة.

لذا، إذا كنت تريد البدء في العمل باستخدام التعلم العميق مع عدم وجود الكثير من التعقيد، فاستخدم Keras. لأن Keras يوفر البساطة وسهولة الاستخدام وسهولة التنفيذ مقارنة بـ Tensorflow. ولكن إذا كنت تريد كتابة خوارزميتك الخاصة في مشروع أو بحث التعلم العميق، فيجب عليك استخدام Tensorflow بدلاً من ذلك.

الملخص

لذا دعونا نلخص كل ما ناقشناه وفعلناه في هذا البرنامج التعليمي.

  • Keras في واجهة برمجة تطبيقات عالية المستوى تُستخدم لتسهيل شبكات التعلم العميق بمساعدة محرك الواجهة الخلفية.
  • يتميز Keras بسهولة الاستخدام والفهم بفضل دعم لغة python، لذا فهو يبدو طبيعيًا أكثر من أي وقت مضى. إنه جيد للمبتدئين الذين يرغبون في التعرف على التعلم العميق وللباحثين الذين يريدون واجهة برمجة التطبيقات (API) سهلة الاستخدام.
  • عملية التثبيت سهلة ويمكنك استخدام بيئة افتراضية أو استخدام منصة خارجية مثل AWS.
  • يأتي Keras أيضًا مع أنواع مختلفة من نماذج الشبكة، مما يسهل علينا استخدام النموذج المتاح للتدريب المسبق وضبط نموذج الشبكة الخاص بنا.
  • هناك أيضًا الكثير من البرامج التعليمية والمقالات حول استخدام رموز Keras من المجتمعات في جميع أنحاء العالم لأغراض التعلم العميق.