زيادة البيانات | كيفية استخدام التعلم العميق عندما يكون لديك بيانات محدودة - الجزء 2

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

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

تتذكر أن مجموعات البيانات الأكثر شعبية تحتوي على صور بترتيب عشرات الآلاف (أو أكثر). تتذكر أيضًا أن ذكر شخص ما لديه مجموعة بيانات كبيرة أمر بالغ الأهمية للأداء الجيد. شعور بخيبة أمل ، أنت تتساءل ؛ هل يمكن لشبكتي العصبية "الحديثة" أن تعمل بشكل جيد مع كمية ضئيلة من البيانات المتوفرة لدي؟

الجواب نعم! ولكن قبل أن ندخل في سحر تحقيق ذلك ، نحتاج إلى التفكير في بعض الأسئلة الأساسية.

لماذا هناك حاجة إلى كمية كبيرة من البيانات؟

عدد المعلمات (بالملايين) للشبكات العصبية الشائعة.

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

للدولة من أحدث الشبكات العصبية عادة المعلمات في ترتيب الملايين!

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

كيف يمكنني الحصول على المزيد من البيانات ، إذا لم يكن لدي "مزيد من البيانات"؟

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

نفس كرة التنس لكن ترجمتها.

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

زيادة البيانات في اللعب

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

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

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

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

الفصلان في مجموعة البيانات الافتراضية الخاصة بنا. تمثل العلامة الموجودة في اليسار العلامة التجارية A (Ford) ، بينما تمثل العلامة الموجودة في اليمين العلامة التجارية B (شيفروليه).

تخيل أن لديك مجموعة بيانات ، تتكون من علامتين تجاريتين للسيارات ، كما هو موضح أعلاه. دعنا نفترض أن جميع سيارات العلامة التجارية أ يتم محاذاتها تمامًا مثل الصورة الموجودة في اليسار (أي أن جميع السيارات تواجه اليسار). وبالمثل ، يتم محاذاة جميع سيارات العلامة التجارية B تمامًا مثل الصورة الموجودة في اليمين (أي مواجهة اليمين). الآن ، يمكنك تغذية مجموعة البيانات هذه لشبكتك العصبية "الحديثة" ، وتأمل في الحصول على نتائج رائعة بمجرد تدريبها.

سيارة فورد (ماركة أ) ، ولكن مواجهة اليمين.

دعنا نقول أنه تم التدريب ، وقمت بإطعام الصورة أعلاه ، وهي ماركة A. لكن شبكتك العصبية تُخرج أنها ماركة B! أنت مشوش. ألم تحصل على دقة 95٪ على مجموعة البيانات باستخدام شبكتك العصبية "الحديثة"؟ أنا لا أبالغ ، فقد وقعت في الماضي حوادث مماثلة وأحداث متشابهة.

لماذا يحدث هذا؟ يحدث ذلك لأن هذا هو كيف تعمل معظم خوارزميات التعلم الآلي. يجد أكثر الميزات وضوحا التي تميز فئة واحدة عن آخر. هنا ، كانت الميزة أن جميع سيارات العلامة التجارية أ كانت تواجه اليسار ، وأن جميع سيارات العلامة ب تواجه اليمين.

الشبكة العصبية الخاصة بك جيدة فقط مثل البيانات التي تغذيها.

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

من خلال إجراء زيادة ، يمكن أن يمنع الشبكة العصبية لديك من تعلم أنماط غير ملائمة ، مما يعزز الأداء الكلي بشكل أساسي.

ابدء

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

أين نحن زيادة البيانات في خط أنابيب ML لدينا؟

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

يُعرف الخيار الأول بالتعزيز غير المتصل بالإنترنت. تُفضل هذه الطريقة على مجموعات البيانات الأصغر نسبيًا ، حيث ستؤدي في النهاية إلى زيادة حجم مجموعة البيانات بعامل يساوي عدد التحويلات التي تجريها (على سبيل المثال ، عن طريق قلب كل الصور الخاصة بي ، سأزيد من حجم مجموعة البيانات الخاصة بي عن طريق عامل 2).

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

تقنيات زيادة شعبية

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

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

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

1. الوجه

يمكنك قلب الصور أفقياً وعمودياً. بعض الأطر لا توفر وظيفة التقلبات الرأسية. لكن الوجه الرأسي يعادل تدوير الصورة بمقدار 180 درجة ثم إجراء الوجه الأفقي. فيما يلي أمثلة للصور التي تم قلبها.

من اليسار ، لدينا الصورة الأصلية ، تليها الصورة مقلوبة أفقياً ، ثم انقلبت الصورة رأسياً.

يمكنك تنفيذ التقلبات باستخدام أي من الأوامر التالية ، من الحزم المفضلة لديك. عامل زيادة البيانات = 2 إلى 4x

# NumPy.'img '= صورة واحدة.
flip_1 = np.fliplr (img)
# TensorFlow. 'x' = عنصر نائب لصورة.
الشكل = [الطول ، العرض ، القنوات]
x = tf.placeholder (dtype = tf.float32 ، الشكل = الشكل)
flip_2 = tf.image.flip_up_down (x)
flip_3 = tf.image.flip_left_right (x)
flip_4 = tf.image.random_flip_up_down (x)
flip_5 = tf.image.random_flip_left_right (x)

2. التناوب

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

يتم تدوير الصور بمقدار 90 درجة في اتجاه عقارب الساعة فيما يتعلق بالصورة السابقة ، حيث نتحرك من اليسار إلى اليمين.

يمكنك القيام بالتناوب باستخدام أي من الأوامر التالية ، من الحزم المفضلة لديك. عامل زيادة البيانات = 2 إلى 4x

# العناصر النائبة: 'x' = صورة واحدة ، 'y' = مجموعة من الصور
تشير العلامة "#" إلى عدد دورات التناوب في اتجاه عقارب الساعة بمقدار 90 درجة
الشكل = [الطول ، العرض ، القنوات]
x = tf.placeholder (dtype = tf.float32 ، الشكل = الشكل)
rot_90 = tf.image.rot90 (img، k = 1)
rot_180 = tf.image.rot90 (img، k = 2)
# للتدوير في أي زاوية. في المثال أدناه ، تكون "الزوايا" بالراديان
الشكل = [الدفعة ، الطول ، العرض ، 3]
y = tf.placeholder (dtype = tf.float32 ، الشكل = الشكل)
rot_tf_180 = tf.contrib.image.rotate (y ، الزوايا = 3.1415)
# Scikit صورة. "الزاوية" = الدرجات. 'img' = صورة الإدخال
# للحصول على تفاصيل حول "الوضع" ، راجع قسم الاستيفاء أدناه.
تعفن = skimage.transform.rotate (img ، زاوية = 45 ، الوضع = "انعكاس")

3. مقياس

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

من اليسار ، لدينا الصورة الأصلية ، تحجيم الصورة للخارج بنسبة 10٪ ، والصورة تحجيمها للخارج بنسبة 20٪

يمكنك إجراء القياس باستخدام الأوامر التالية ، باستخدام صورة scikit. عامل زيادة البيانات = تعسفي.

# صورة Scikit. 'img' = صورة الإدخال ، "النطاق" = عامل القياس
# للحصول على تفاصيل حول "الوضع" ، راجع قسم الاستيفاء أدناه.
scale_out = skimage.transform.rescale (img ، scale = 2.0 ، mode = 'ثابت')
scale_in = skimage.transform.rescale (img ، scale = 0.5 ، mode = 'ثابت')
# لا تنسى قص الصور مرة أخرى إلى الحجم الأصلي (من أجل
# scale_out)

4. المحاصيل

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

من اليسار ، لدينا الصورة الأصلية ، مقطع مربّع من الجزء العلوي الأيسر ، ثم مقطع مربع من أسفل اليمين. تم تغيير حجم الأقسام التي تم اقتصاصها إلى حجم الصورة الأصلي.

يمكنك تنفيذ المحاصيل العشوائية باستخدام أي من الأوامر التالية لـ TensorFlow. عامل زيادة البيانات = تعسفي.

# TensorFlow. 'x' = عنصر نائب لصورة.
original_size = [الطول والعرض والقنوات]
x = tf.placeholder (dtype = tf.float32 ، الشكل = original_size)
# استخدم الأوامر التالية لأداء المحاصيل العشوائية
crop_size = [new_height ، new_width ، القنوات]
البذور = np.random.randint (1234)
x = tf.random_crop (x ، الحجم = crop_size ، البذور = البذور)
الإخراج = tf.images.resize_images (x ، الحجم = original_size)

5. الترجمة

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

من اليسار ، لدينا الصورة الأصلية ، الصورة المترجمة إلى اليمين ، والصورة مترجمة لأعلى.

يمكنك إجراء الترجمات في TensorFlow باستخدام الأوامر التالية. عامل زيادة البيانات = تعسفي.

# pad_left ، pad_right ، pad_top ، pad_bottom تشير إلى البكسل
# الإزاح. عيّن واحدًا منهم إلى القيمة المرغوبة وراحة إلى 0
الشكل = [الدفعة ، الطول ، العرض ، القنوات]
x = tf.placeholder (dtype = tf.float32 ، الشكل = الشكل)
# نحن نستخدم وظيفتين للحصول على زيادة المطلوب لدينا
x = tf.image.pad_to_bounding_box (x ، pad_top ، pad_left ، ارتفاع + pad_bottom + pad_top ، عرض + pad_right + pad_left)
الإخراج = tf.image.crop_to_bounding_box (x ، pad_bottom ، pad_right ، الارتفاع ، العرض)

6. الضوضاء الغوسية

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

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

من اليسار ، لدينا الصورة الأصلية ، والصورة مع إضافة ضوضاء غوسية ، مع إضافة الملح وضوضاء الفلفل

يمكنك إضافة ضوضاء Gaussian إلى صورتك باستخدام الأمر التالي ، على TensorFlow. عامل زيادة البيانات = 2x.

#TensorFlow. 'x' = عنصر نائب لصورة.
الشكل = [الطول ، العرض ، القنوات]
x = tf.placeholder (dtype = tf.float32 ، الشكل = الشكل)
# إضافة الضوضاء غاوسي
الضوضاء = tf.random_normal (الشكل = tf.shape (x) ، يعني = 0.0 ، stddev = 1.0 ،
dtype = tf.float32)
الإخراج = tf.add (x ، الضوضاء)

تقنيات التعزيز المتقدمة

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

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

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

الشبكات الشرطية لانقاذ!

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

تغيير الفصول باستخدام CycleGAN (المصدر: https://junyanz.github.io/CycleGAN/)

الطريقة المذكورة أعلاه قوية ، لكنها مكثفة حسابياً. بديل أرخص سيكون شيء يسمى نقل النمط العصبي. يمسك نسيج / أجواء / مظهر صورة واحدة (ويعرف أيضًا باسم "النمط") ويمزجها مع محتوى صورة أخرى. باستخدام هذه التقنية القوية ، ننتج تأثيرًا مشابهًا لتأثير GAN الشرطي (في الواقع ، تم تقديم هذه الطريقة قبل اختراع cGANs!).

الجانب السلبي الوحيد لهذه الطريقة هو أن الإخراج يميل إلى أن يبدو أكثر فنية وليس واقعية. ومع ذلك ، هناك بعض التطورات مثل Deep Photo Style Transfer ، المبينة أدناه ، والتي حققت نتائج رائعة.

عميق نمط نقل الصورة. لاحظ كيف يمكننا توليد التأثير الذي نريده على مجموعة البيانات الخاصة بنا. (المصدر: https://arxiv.org/abs/1703.07511)

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

مذكرة موجزة عن الاستيفاء

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

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

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

من اليسار ، لدينا أوضاع ثابتة ، حافة ، تعكس ، متماثلة ولفائف.

1. ثابت

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

2. الحافة

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

3. تعكس

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

4. متماثل

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

5. التفاف

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

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

لذلك ، إذا استخدمت كل هذه التقنيات ، فستكون خوارزمية ML قوية؟

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

الصورة الأولى (من اليسار) هي الصورة الأصلية ، أما الصورة الثانية فتم قلبها أفقيًا ، بينما يتم تدوير الصورة الثالثة بمقدار 180 درجة ، بينما يتم تدوير الصورة الأخيرة بمقدار 90 درجة (في اتجاه عقارب الساعة).

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

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

النقطة المهمة هي أنه أثناء استخدام تقنيات التعزيز ، علينا التأكد من عدم زيادة البيانات غير ذات الصلة.

هل حقا يستحق الجهد؟

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

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

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

الفصول الأربعة في مجموعة البيانات الخاصة بنا.

بالنسبة إلى الشخص الذي لا يوجد لديه زيادة ، دعونا نستخدم شبكة VGG19. لقد كتبت تنفيذ TensorFlow هنا ، والذي يعتمد على هذا التنفيذ. بمجرد استنساخ الريبو الخاص بي ، يمكنك الحصول على مجموعة البيانات من هنا ، و vgg19.npy (المستخدم لتعلم النقل) من هنا. يمكنك الآن تشغيل النموذج للتحقق من الأداء.

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

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

النتائج
VGG19 (بدون زيادة) - دقة اختبار بنسبة 76٪ (الأعلى)
نانونات (مع زيادة) - 94.5 ٪ اختبار دقة

مثير للإعجاب ليس كذلك. إنها حقيقة أن معظم النماذج تعمل بشكل جيد مع المزيد من البيانات. لذلك لتوفير دليل ملموس ، لقد ذكرت الجدول أدناه. يُظهر معدل أخطاء الشبكات العصبية الشائعة على مجموعات بيانات Cifar 10 (C10) و Cifar 100 (C100). أعمدة C10 + و C100 + هي معدلات الخطأ مع زيادة البيانات.

معدلات أخطاء الشبكات العصبية الشائعة على مجموعات بيانات Cifar 10 و Cifar 100. (المصدر: DenseNet)

شكرا لكم على قراءة هذا المقال! ضرب هذا الزر التصفيق إذا كنت فعلت! آمل أن تلقي بعض الضوء على زيادة البيانات. إذا كان لديك أي أسئلة ، فيمكنك أن تضربني على وسائل التواصل الاجتماعي أو ترسل لي رسالة بريد إلكتروني (bharathrajn98@gmail.com).

حول الشبكات النانوية: تقوم الشبكات النانوية ببناء واجهات برمجة التطبيقات لتبسيط التعلم العميق للمطورين. تفضل بزيارتنا على https://www.nanonets.com للمزيد