شعار زيفيرنت

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاً

التاريخ:

By داريو راديتشيتش، الرئيس التنفيذي والمؤسس في Deep Data Digital | عالم بيانات وكاتب تقني

 
90 +٪ دقة؟ أصبح ممكنا مع نقل التعلم.
 

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

سترى أيضًا ما سيحدث لدقة التحقق إذا قللنا كمية بيانات التدريب بمعامل 20. تنبيه المفسد - سيبقى بدون تغيير.

لا تشعر بالرغبة في القراءة؟ شاهد الفيديو الخاص بي بدلاً من ذلك:

 


 

يمكنك تنزيل شفرة المصدر على GitHub جيثب:.

ما هو نقل التعلم في TensorFlow؟

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

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

قصة قصيرة طويلة - كلما تعمقت في الشبكة ، زادت الميزات المعقدة التي ستستخرجها.

تتلخص عملية تعلم النقل بأكملها في 3 خطوات:

  1. خذ شبكة مدربة مسبقًا - على سبيل المثال ، خذ بنية VGG أو ResNet أو EfficientNet التي تم تدريبها على ملايين الصور لاكتشاف 1000 فئة.
  2. قطع رأس النموذج - استبعد الطبقات القليلة الأخيرة من نموذج مُدرب مسبقًا واستبدلها بطرازك الخاص. على سبيل المثال ، لدينا مجموعة بيانات الكلاب مقابل القطط فئتين ، وطبقة التصنيف النهائية يجب أن تشبههما.
  3. صقل الطبقات النهائية - تدريب الشبكة على مجموعة البيانات الخاصة بك لضبط المصنف. يتم تجميد أوزان النموذج الذي تم اختباره مسبقًا ، مما يعني أنه لن يتم تحديثها أثناء تدريب النموذج.

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

الشروع في العمل - استيراد المكتبات ومجموعة البيانات

 
سنستخدم مجموعة بيانات الكلاب مقابل القطط من Kaggle. إنه مرخص بموجب رخصة المشاع الإبداعي ، مما يعني أنه يمكنك استخدامه مجانًا:

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًصورة 1 - مجموعة بيانات الكلاب مقابل القطط (صورة للمؤلف)

 

مجموعة البيانات كبيرة إلى حد ما - 25,000 صورة موزعة بالتساوي بين الفئات (12,500 صورة كلب و 12,500 صورة قطة). يجب أن يكون كبيرًا بما يكفي لتدريب مصنف صور لائق. المشكلة الوحيدة هي - إنها ليست منظمة للتعلم العميق خارج الصندوق. يمكنك متابعة مقالتي السابقة لإنشاء بنية دليل مناسبة ، وتقسيمها إلى مجموعات تدريب واختبار وتحقق:

 
TensorFlow لتصنيف الصور - أهم 3 متطلبات أساسية لمشاريع التعلم العميق | علوم بيانات أفضل
 

هل تريد تدريب شبكة عصبية على تصنيف الصور باستخدام TensorFlow؟ تأكد من القيام بهذه الخطوات الثلاث أولاً.

يجب عليك أيضًا حذف ملف train / cat / 666.jpg. jpg و  قطار / كلب / 11702.jpg الصور تالفة ، وسيفشل نموذجك في التدرب عليها.

بمجرد الانتهاء من ذلك ، يمكنك متابعة عمليات استيراد المكتبة. سنحتاج فقط إلى Numpy و TensorFlow اليوم. الواردات الأخرى هنا للتخلص من رسائل التحذير غير الضرورية:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' import warnings
warnings.filterwarnings('ignore') import numpy as np
import tensorflow as tf

سيتعين علينا تحميل بيانات التدريب والتحقق من الصحة من أدلة مختلفة في جميع أنحاء المقالة. أفضل ممارسة هي الإعلان عن وظيفة لتحميل الصور وملفات زيادة البيانات:

def init_data(train_dir: str, valid_dir: str) -> tuple: train_datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1/255.0, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1/255.0 ) train_data = train_datagen.flow_from_directory( directory=train_dir, target_size=(224, 224), class_mode='categorical', batch_size=64, seed=42 ) valid_data = valid_datagen.flow_from_directory( directory=valid_dir, target_size=(224, 224), class_mode='categorical', batch_size=64, seed=42 ) return train_data, valid_data

لنقم الآن بتحميل مجموعة بيانات الكلاب والقطط:

train_data, valid_data = init_data( train_dir='data/train/', valid_dir='data/validation/'
)

هذا هو الناتج الذي يجب أن تراه:

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًصورة 2 - عدد صور التدريب والتحقق من الصحة (الصورة من قبل المؤلف)

 

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

نقل التعلم باستخدام TensorFlow أثناء العمل

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

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

هذا هو المكان build_transfer_learning_model() يأتي دور الوظيفة. لها معلمة واحدة - base_model - الذي يمثل العمارة سابقة التدريب. أولاً ، سنقوم بتجميد جميع الطبقات في هذا النموذج ، ثم نقوم ببناء ملف Sequential نموذج منه عن طريق إضافة بضع طبقات مخصصة. أخيرًا ، سنقوم بتجميع النموذج باستخدام المشتبه بهم المعتادون:

def build_transfer_learning_model(base_model): # `base_model` stands for the pretrained model # We want to use the learned weights, and to do so we must freeze them for layer in base_model.layers: layer.trainable = False # Declare a sequential model that combines the base model with custom layers model = tf.keras.Sequential([ base_model, tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.BatchNormalization(), tf.keras.layers.Dropout(rate=0.2), tf.keras.layers.Dense(units=2, activation='softmax') ]) # Compile the model model.compile( loss='categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'] ) return model

الآن الجزء الممتع يبدأ. قم باستيراد ملف VGG16 الهندسة المعمارية من TensorFlow وتحديدها كنموذج أساسي لدينا build_transfer_learning_model() وظيفة. ال include_top=False المعامل يعني أننا لا نريد طبقة التصنيف الأعلى ، كما أعلنا عن طبقة التصنيف الخاصة بنا. أيضًا ، لاحظ كيف أن ملف input_shape تم تعيينه ليشبه أشكال صورنا:

# Let's use a simple and well-known architecture - VGG16
from tensorflow.keras.applications.vgg16 import VGG16 # We'll specify it as a base model
# `include_top=False` means we don't want the top classification layer
# Specify the `input_shape` to match our image size
# Specify the `weights` accordingly
vgg_model = build_transfer_learning_model( base_model=VGG16(include_top=False, input_shape=(224, 224, 3), weights='imagenet')
) # Train the model for 10 epochs
vgg_hist = vgg_model.fit( train_data, validation_data=valid_data, epochs=10
)

ها هي النتيجة بعد تدريب النموذج لمدة 10 فترات:

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًالصورة 3 - نموذج VGG16 على صور تدريب 20 ألفًا بعد 10 فترات (صورة للمؤلف)

 

الآن هذا شيء تكتب عنه - دقة تحقق تصل إلى 93٪ دون حتى التفكير في بنية الوضع. يكمن الجمال الحقيقي لتعلم النقل في كمية البيانات اللازمة لتدريب النماذج الدقيقة ، والتي هي أقل بكثير من البنى المخصصة.

كم أقل؟ دعونا نقيس حجم مجموعة البيانات 20 مرة لنرى ما سيحدث.

نقل التعلم على مجموعة فرعية أصغر 20X

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

import random
import pathlib
import shutil random.seed(42)
dir_data = pathlib.Path.cwd().joinpath('data_small')
dir_train = dir_data.joinpath('train')
dir_valid = dir_data.joinpath('validation') if not dir_data.exists(): dir_data.mkdir()
if not dir_train.exists(): dir_train.mkdir()
if not dir_valid.exists(): dir_valid.mkdir() for cls in ['cat', 'dog']: if not dir_train.joinpath(cls).exists(): dir_train.joinpath(cls).mkdir() if not dir_valid.joinpath(cls).exists(): dir_valid.joinpath(cls).mkdir()

إليك الأمر الذي يمكنك استخدامه لطباعة بنية الدليل:

!ls -R data_small | grep ":$" | sed -e 's/:$//' -e 's/[^-][^/]*//--/g' -e 's/^/ /' -e 's/-/|/'

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًصورة 4 - هيكل الدليل (صورة المؤلف)

 

انسخ عينة من الصور إلى المجلد الجديد. ال copy_sample() تأخذ الوظيفة n صور من src_folder ونسخها إلى tgt_folder. بشكل افتراضي ، سنقوم بتعيين n إلى 500:

def copy_sample(src_folder: pathlib.PosixPath, tgt_folder: pathlib.PosixPath, n: int = 500): imgs = random.sample(list(src_folder.iterdir()), n) for img in imgs: img_name = str(img).split('/')[-1] shutil.copy( src=img, dst=f'{tgt_folder}/{img_name}' )

لنقم الآن بنسخ صور التدريب والتحقق من الصحة. لمجموعة التحقق من الصحة ، سنقوم بنسخ 100 صورة فقط لكل فصل:

# Train - cat
copy_sample( src_folder=pathlib.Path.cwd().joinpath('data/train/cat/'), tgt_folder=pathlib.Path.cwd().joinpath('data_small/train/cat/'), ) # Train - dog
copy_sample( src_folder=pathlib.Path.cwd().joinpath('data/train/dog/'), tgt_folder=pathlib.Path.cwd().joinpath('data_small/train/dog/'), ) # Valid - cat
copy_sample( src_folder=pathlib.Path.cwd().joinpath('data/validation/cat/'), tgt_folder=pathlib.Path.cwd().joinpath('data_small/validation/cat/'), n=100
) # Valid - dog
copy_sample( src_folder=pathlib.Path.cwd().joinpath('data/validation/dog/'), tgt_folder=pathlib.Path.cwd().joinpath('data_small/validation/dog/'), n=100
)

استخدم الأوامر التالية لطباعة عدد الصور في كل مجلد:

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًصورة 5 - عدد صور التدريب والتحقق من الصحة لكل فصل (صورة من قبل المؤلف)

 

أخيرًا ، اتصل init_data() وظيفة لتحميل الصور من المصدر الجديد:

train_data, valid_data = init_data( train_dir='data_small/train/', valid_dir='data_small/validation/'
)

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًصورة 6 - عدد صور التدريب والتحقق من الصحة في المجموعة الفرعية الأصغر (صورة للمؤلف)

 

هناك 1000 صورة تدريب في المجموع. سيكون من المثير للاهتمام معرفة ما إذا كان بإمكاننا الحصول على نموذج لائق من مجموعة بيانات بهذا الحجم الصغير. سنحافظ على بنية النموذج متطابقة ، لكننا نتدرب على المزيد من العصور لمجرد أن مجموعة البيانات أصغر. أيضًا ، يمكننا تحمل تكاليف التدريب لفترة أطول نظرًا لتقليل وقت التدريب لكل فترة:

vgg_model = build_transfer_learning_model( base_model=VGG16(include_top=False, input_shape=(224, 224, 3), weights='imagenet')
) vgg_hist = vgg_model.fit( train_data, validation_data=valid_data, epochs=20
)

TensorFlow لرؤية الكمبيوتر - أصبح تعلم النقل سهلاًصورة 7 - نتائج التدريب في آخر 10 عهود (صورة للمؤلف)

 

وهل تنظر إلى ذلك - لقد حصلنا تقريبًا على نفس دقة التحقق من صحة النموذج الذي تم تدريبه على 20 ألف صورة ، وهو أمر مذهل.

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

وفي الختام

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

الشيء الوحيد الذي عليك القيام به هو اختيار بنية مدربة مسبقًا. اخترنا VGG16 اليوم ، لكنني أشجعك على تجربة ResNet و MobileNet و EfficientNet وغيرها.

هنا آخر واجب منزلي يمكنك القيام به - استخدم كلا النموذجين المدربين اليوم للتنبؤ بمجموعة الاختبار بأكملها. كيف تقارن الدقة؟ أخبرونى من فضلكم.

 
ابق على اتصال

 
 
داريو راديتشيتش هو الرئيس التنفيذي والمؤسس في Deep Data Digital ، وعالم بيانات وكاتب تقني.

أصلي. تم إعادة النشر بإذن.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة