- ما هو نقل التعلم وكيف يعمل
- كيف يعمل نقل التعلم
- متى يُستخدم نقل التعلم
- 1. تدريب نموذج لإعادة استخدامه
- 2. استخدام نموذج تم تدريبه مسبقًا
- 3. استخراج الميزات
- النماذج التي تم تدريبها مسبقًا
- تنفيذ التعليمات البرمجية لنقل التعلم باستخدام Python
- استيراد مكتبات
- تحميل البيانات عبر Kaggle API
- تصميم نموذج CNN الخاص بنا بمساعدة نموذج التدريب المسبق
- تكبير الصورة (لمنع مشكلة فرط التخصيص)
- تدريب النموذج
- التنبؤات
تُعرف إعادة استخدام نموذج تم تعلمه مسبقًا في مشكلة جديدة باسم نقل التعلم transfer learning. إنه شائع بشكل خاص في التعلم العميق في الوقت الحالي لأنه يمكنه تدريب الشبكات العصبية العميقة بكمية صغيرة من البيانات. هذا مهم بشكل خاص في مجال علم البيانات، حيث أن معظم مواقف العالم الحقيقي لا تتطلب الملايين من نقاط البيانات المصنفة لتدريب النماذج المعقدة.
ما هو نقل التعلم وكيف يعمل
تُعرف إعادة استخدام نموذج مدرب مسبقًا في مشكلة جديدة باسم نقل التعلم في التعلم الآلي. تستخدم الآلة المعرفة المكتسبة من مهمة سابقة لزيادة التنبؤ بمهمة جديدة في نقل التعلم. يمكنك، على سبيل المثال، استخدام المعلومات المكتسبة أثناء التدريب لتمييز المشروبات عند تدريب المصنف للتنبؤ بما إذا كانت الصورة تحتوي على مطبخ.
يتم نقل المعرفة بنموذج التعلم الآلي الذي تم تدريبه بالفعل إلى مشكلة مختلفة ولكنها مرتبطة ارتباطًا وثيقًا خلال عملية نقل التعلم. على سبيل المثال، إذا قمت بتدريب المصنف البسيط للتنبؤ بما إذا كانت الصورة تحتوي على حقيبة ظهر، فيمكنك استخدام المعرفة التدريبية للنموذج لتحديد كائنات أخرى مثل النظارات الشمسية.
من خلال نقل التعلم، نحاول بشكل أساسي استخدام ما تعلمناه في مهمة واحدة لفهم المفاهيم بشكل أفضل في مهمة أخرى. يتم تحويل الأوزان تلقائيًا إلى شبكة تؤدي “المهمة A” من شبكة تؤدي “المهمة B” الجديدة.
نظرًا للكم الهائل من طاقة وحدة المعالجة المركزية المطلوبة، يتم تطبيق تعلم النقل عادةً في الرؤية الحاسوبية ومهام معالجة اللغة الطبيعية مثل تحليل المشاعر sentiment analysis.
كيف يعمل نقل التعلم
في الرؤية الحاسوبية، تهدف الشبكات العصبية عادةً إلى اكتشاف الحواف في الطبقة الأولى والنماذج في الطبقة الوسطى والميزات الخاصة بالمهمة في الطبقات الأخيرة. يتم استخدام الطبقات الأولى والمركزية في نقل التعلم، ويتم إعادة تدريب الطبقات الأخيرة فقط. يستفيد من البيانات المصنفة من المهمة التي تم التدريب عليها.
لنعد إلى مثال النموذج الذي تم تصميمه لتحديد حقيبة ظهر في صورة ما وسيتم استخدامه الآن لاكتشاف النظارات الشمسية. نظرًا لأن النموذج قد تدرب على التعرف على الكائنات في المستويات السابقة، فسنقوم ببساطة بإعادة تدريب الطبقات اللاحقة لفهم ما يميز النظارات الشمسية عن الكائنات الأخرى.
نظرًا لأن النموذج قد تم تدريبه مسبقًا بالفعل، يمكن إنشاء نموذج جيد للتعلم الآلي مع القليل من بيانات التدريب إلى حد ما باستخدام نقل التعلم. هذا مفيد بشكل خاص في معالجة اللغة الطبيعية، حيث تتطلب مجموعات البيانات ذات العلامات الضخمة الكثير من المعرفة المتخصصة. بالإضافة إلى ذلك، يتم تقليل وقت التدريب لأن بناء شبكة عصبية عميقة من بداية مهمة معقدة قد يستغرق أيامًا أو حتى أسابيع.
متى يُستخدم نقل التعلم
عندما لا تتوفر لدينا بيانات مشروحة كافية لتدريب نموذجنا عليها. عندما يكون هناك نموذج مدرب مسبقًا تم تدريبه على بيانات ومهام مماثلة. إذا استخدمت TensorFlow لتدريب النموذج الأصلي، فيمكنك ببساطة استعادته وإعادة تدريب بعض الطبقات لعملك. من ناحية أخرى، لا يعمل تعلم النقل إلا إذا كانت الميزات التي تم تعلمها في المهمة الأولى عامة، مما يعني أنه يمكن تطبيقها على نشاط آخر. علاوة على ذلك، يجب أن يكون إدخال النموذج بنفس الحجم الذي كان عليه عندما تم تدريبه لأول مرة. إذا لم يكن لديك، أضف خطوة لتغيير حجم إدخالك إلى الحجم المطلوب.
1. تدريب نموذج لإعادة استخدامه
ضع في اعتبارك الموقف الذي ترغب في معالجة المهمة أ ولكن تفتقر إلى البيانات اللازمة لتدريب شبكة عصبية عميقة. يعد العثور على مهمة B ذات صلة بالكثير من البيانات إحدى الطرق للتغلب على هذا الأمر.
استخدم الشبكة العصبية العميقة للتدريب على المهمة “B” ثم استخدم النموذج لحل المهمة “A”. ستقرر المشكلة التي تسعى إلى حلها ما إذا كنت بحاجة إلى استخدام النموذج بأكمله أو بضع طبقات فقط.
إذا كانت المدخلات في كلتا الوظيفتين هي نفسها، فيمكنك إعادة تطبيق النموذج وإجراء تنبؤات لمدخلاتك الجديدة. من ناحية أخرى، يعد تغيير وإعادة تدريب الطبقات المميزة الخاصة بالمهمة وطبقة المخرجات طريقة للتحقيق.
2. استخدام نموذج تم تدريبه مسبقًا
الخيار الثاني هو استخدام نموذج تم تدريبه بالفعل. هناك عدد من هذه النماذج، لذا قم بإجراء بعض الأبحاث مسبقًا. يتم تحديد عدد الطبقات التي سيتم إعادة استخدامها وإعادة التدريب من خلال المهمة.
يتكون Keras من تسعة نماذج مدربة مسبقًا تستخدم في نقل التعلم transfer learning والتنبؤ prediction والضبط الدقيق fine-tuning. يمكن العثور هنا على هذه النماذج، بالإضافة إلى بعض الدروس السريعة حول كيفية الاستفادة منها. كما تتيح العديد من المؤسسات البحثية إمكانية الوصول إلى النماذج المدربة.
التطبيق الأكثر شيوعًا لهذا النوع من التعلم هو التعلم العميق deep learning.
3. استخراج الميزات
خيار آخر هو استخدام التعلم العميق لتحديد التمثيل الأمثل لمشكلتك، والذي يتضمن تحديد الميزات الرئيسية. تُعرف هذه الطريقة باسم التعلم التمثيلي representation learning، ويمكن أن تؤدي غالبًا إلى نتائج أفضل بكثير من التمثيلات المصممة يدويًا.
يتم إنشاء الميزات في التعلم الآلي بشكل أساسي يدويًا بواسطة الباحثين والمتخصصين في المجال. لحسن الحظ، يمكن للتعلم العميق استخراج الميزات تلقائيًا. بالطبع، هذا لا يقلل من أهمية هندسة الميزات ومعرفة المجال؛ لا يزال يتعين عليك اختيار الميزات التي تريد تضمينها في شبكتك.
من ناحية أخرى، تتمتع الشبكات العصبية بالقدرة على معرفة الميزات المهمة وغير المهمة. حتى بالنسبة للمهام المعقدة التي قد تتطلب الكثير من الجهد البشري، يمكن لخوارزمية التعلم التمثيلي أن تجد مزيجًا لائقًا من الخصائص في فترة زمنية قصيرة.
يمكن بعد ذلك تطبيق التمثيل المكتسب على مجموعة متنوعة من التحديات الأخرى. ما عليك سوى استخدام الطبقات الأولية للعثور على تمثيل الميزة المناسب، ولكن تجنب استخدام مخرجات الشبكة لأنها شديدة التحديد بالمهمة. بدلاً من ذلك، أرسل البيانات إلى شبكتك وأخرجها من خلال إحدى الطبقات الوسيطة.
يمكن بعد ذلك فهم البيانات الأولية على أنها تمثيل لهذه الطبقة.
تُستخدم هذه الطريقة بشكل شائع في الرؤية الحاسوبية حيث يمكنها تقليص مجموعة البيانات الخاصة بك وتقليل وقت الحساب وجعلها أكثر ملاءمة للخوارزميات الكلاسيكية.
النماذج التي تم تدريبها مسبقًا
يتوفر عدد من نماذج التعلم الآلي الشائعة المدربة مسبقًا. نموذج Inception-v3 ، الذي تم تطويره لـ ImageNet “تحدي التعرف البصري الكبير Large Visual Recognition Challenge” ، هو أحد هذه النماذج. ” كان على المشاركين في هذا التحدي تصنيف الصور إلى 1000 فئة فرعية مثل “الحمار الوحشي” و “الدلماسي” و “غسالة الصحون”.
تنفيذ التعليمات البرمجية لنقل التعلم باستخدام Python
(مجموعة البيانات هي Chest-CT Scan من Kaggle)
استيراد مكتبات
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, Flatten,GlobalAveragePooling2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ReduceLROnPlateau
from tensorflow.keras.layers import Input, Lambda, Dense, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.applications.inception_v3 import preprocess_input
from tensorflow.keras.preprocessing import image
from tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img
from tensorflow.keras.models import Sequential
import numpy as np
from glob import glob
تحميل البيانات عبر KaggleAPI
from google.colab import files
files.upload()
Saving kaggle.json to kaggle.json
!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json
!kaggle datasets download -d mohamedhanyyy/chest-ctscan-images #downloading data from kaggle API of Dataset
from zipfile import ZipFile
file_name = "chest-ctscan-images.zip"
with ZipFile(file_name,'r') as zip:
zip.extractall()
print('Done')
تصميم نموذج CNN الخاص بنا بمساعدة نموذج التدريب المسبق
InceptionV3_model = tf.keras.applications.InceptionV3(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, Flatten,GlobalAveragePooling2D
from tensorflow.keras.models import Sequential
# The last 15 layers fine tune
for layer in InceptionV3_model.layers[:-15]:
layer.trainable = False
x = InceptionV3_model.output
x = GlobalAveragePooling2D()(x)
x = Flatten()(x)
x = Dense(units=512, activation='relu')(x)
x = Dropout(0.3)(x)
x = Dense(units=512, activation='relu')(x)
x = Dropout(0.3)(x)
output = Dense(units=4, activation='softmax')(x)
model = Model(InceptionV3_model.input, output)
model.summary()
تكبير الصورة (لمنع مشكلة فرط التخصيص)
# Use the Image Data Generator to import the images from the dataset
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
#no flip and zoom for test datase
# Make sure you provide the same target size as initialied for the image size
training_set = train_datagen.flow_from_directory('/content/Data/train',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
تدريب النموذج
# fit the model
# Run the cell. It will take some time to execute
r = model.fit_generator(
training_set,
validation_data=test_set,
epochs=8,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)
# plot the loss
plt.plot(r.history['loss'], label='train loss')
plt.plot(r.history['val_loss'], label='val loss')
plt.legend()
plt.show()
plt.savefig('LossVal_loss')
# plot the accuracy
plt.plot(r.history['accuracy'], label='train acc')
plt.plot(r.history['val_accuracy'], label='val acc')
plt.legend()
plt.show()
plt.savefig('AccVal_acc')
التنبؤات
import numpy as np
y_pred = np.argmax(y_pred, axis=1)
y_pred
يتم تنفيذ الكود أعلاه ويتم عرض الإخراج الخاص بالتصنيف باستخدام نقل التعلم أسفل النوتبوك المضمن: