اذهب إلى المحتوى

السؤال

نشر

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

(batch_size, height, width, 3)

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

Recommended Posts

  • 1
نشر (معدل)

بالنسبة لاقتراحك فلا اعتقد أنه خيار جيد وسيجعل أوزان نقل التعلم أقل فائدة، والسبب في ذلك يعود إلى جوهر فكرة ال CNN وهي تطبيق filterbank على الصور في كل طبقة بحيث في أول طبقة يتم استخلاص سمات الصورة ( مثل الحواف من خلال تطبيق مرشحات الدرجة الأولى (سوبل) أو الثانية (غاوص) ومرشحات كشف الزوايا مثل هاريس و كاني .. إلخ) ثم في الطبقة التالية يتم تطبيق  filterbank مرة أخرى على ناتج المرحلة السابقة، وهكذا.. أي يتم استخراج سمات عالية المستوى كلما تعمقت، مشتقة من سمات المستوى الأدنى التي استخرجتها الطبقات السابقة. وبالتالي إذا قمت بإسقاط الطبقة الأولى سيتم تخريب هذا التسلسل.
الحل يكون من خلال جعل صورك بتنسيق RGB حتى ولو أنها رمادية وسينجح ذلك تماماً، ويتم ذلك من خلال استخدام طريقة ما بحيث تقوم بنسخ القيم أي تكرار مصفوفة الصور 3 مرات على بُعد جديد. وهنا حل مقترح للقيام بذلك من خلال استخدام التابع np.newaxis من المكتبة نمباي:

# أبعاد الصور الرمادية
print(grayscale_batch.shape)
# (40, 100, 100)
rgb_batch = np.repeat(grayscale_batch[..., np.newaxis], 3, -1)
# أبعاد الصور بعد تكرار المصفوفة
print(rgb_batch.shape)  # (40, 100, 100, 3)

يمكنك أيضاً استخدام الوسيط color_mode في الدالة  image_dataset_from_directory وذلك عن طريق ضبطها على "RGB" حيث سيقوم بتحويلها تلقائياً اعتماداً على الفكرة السابقة. ولمزيد من التفاصيل عنه وعن ال Imagegenerator فهذا الرابط يشرح كل شيء:

 

تم التعديل في بواسطة Ali Haidar Ahmad
  • -1
نشر (معدل)

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

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

الكود التالي يوضح ببساطة كيفية القيام بتلك العملية

from keras.models import Model
from keras.layers import Input 

resnet = Resnet50(weights='imagenet',include_top= 'TRUE') 

input_tensor = Input(shape=(IMG_SIZE,IMG_SIZE,1) )
x = Conv2D(3,(3,3),padding='same')(input_tensor)    
out = resnet (x) 

model = Model(inputs=input_tensor,outputs=out)

 

تم التعديل في بواسطة Ahmed Sharshar

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...