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

Ali Haidar Ahmad

الأعضاء
  • المساهمات

    1068
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    43

مقال تعليقات بواسطة Ali Haidar Ahmad

  1. اقتباس

     

    السلام عليكم

    لو سمحت باش مهندس، هل يمكنني استخدام نفس الخطوات مع الصور

     

    @Safa Marouf،

    Naive Bayes هو مُصنّف احتمالي خطي. الفئة أو الصنف التي تتعلم الخوارزمية التنبؤ بها هي نتيجة إنشاء التوزيع الاحتمالي لجميع الأصناف التي يتم عرضها عليه، ثم تحديد الصنف الذي سيتم تعيينه لكل عينة من البيانات. وتنظر المصنفات الاحتمالية إلى توزيع الاحتمال الشرطي، أي احتمال تعيين صنف معين بمجموعة معينة من الميزات features.
    هذه الخوارزمية غير مفضلة للاستخدام مع الصور  الاحتمالية والاحتمال الشرطي يدرك ذلك جيداً.
    لكن عموماً يمكنك استخدامها لكن ستعطي نتائج ضعيفة، كما سنرى..
    الآن نعود لسؤالك "هل يمكنني استخدام نفس الخطوات مع الصور" نعم تقريباً ماعدا مرحلة تحضير البيانات، فهي تختلف من طبيعة بيانات إلى أخرى، و سأعطيكي الآن مثال لتطبيق هذه الخوارزمية مع مجموعة بيانات الأرقام المكتوبة بخط اليد handwritten dataset، حيث تحتوي هذه البيانات على 1797 صورة رمادية، كل صورة هي رقم من 0 إلى 9 مكتوبة بخط اليد وكل منها بأبعاد 8*8.
    بدايةً سأقوم باستخدام خوارزمية Logistic Regression وأعرض لك النتائج، ثم سأستخدم خوارزمية بايز لأريكي الفرق الكبير بالدقة.
    أولاً سنقوم باستيراد المكتبات اللازمة و سنقوم بتحميل البيانات:

    # استيراد المكتبات التي سنحتاجها في هذ المثال
    from sklearn.datasets import load_digits
    import numpy as np 
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegressio
    # تحميل الداتاسيت
    digits = load_digits()
    # تمثلها بكسلات الصورة features يوجد لدينا 1797 صورة أبعادها 8*8 أي لدينا 64   
    print("Image Data Shape" , digits.data.shape)# Print to show there are 1797 labels (integers from 09)
    # Image Data Shape (1797, 64)
    # وبما أنه لدينا 1797 صورة فمن الطبيعي وجود 1797 تصنيف، حيث أن كل صورة تمثل رقم صحيح من 0 ل 9
    print("Label Data Shape", digits.target.shape)
    # Label Data Shape (1797,)

    ملاحظات:
    -يجب أن تكون البيانات (الصور) موضوعة في مصفوفة ثنائية الأبعاد، بحيث يمثل البعد الأول عدد العينات (الصور) والثاني يمثل البكسلات.
    -الصور في مثالنا رمادية بأبعاد w*h*chaneels = 1*8*8 بينما في حالة الصور الملونة تكون w*h*3 (مثلاً 3*8*8) وفي هذه الحالة يجب وضع الصور أيضاً في مصفوفة ثنائية بعدها الأول هو عدد العينات والثاني هو البكسلات وهنا يكون (لو افترضنا 3*8*8 سيكون عدد البكسلات هو 8*8*3=192 أي يجب أن نجعل أبعاد المصفوفة (1797,192)).
    سنقوم الآن بعرض بعض منها:

    plt.figure(figsize=(20,4))
    for index, (image, label) in enumerate(zip(digits.data[0:5], digits.target[0:5])):
     plt.subplot(1, 5, index + 1)
     plt.imshow(np.reshape(image, (8,8)), cmap=plt.cm.gray)
     plt.title('Training: %i\n' % label, fontsize = 20)

    Untitled.thumb.png.9d67928fc85057adc1cfdd66f97c0282.png

    الآن نقوم بتقسيم هذه البيانات إلى بيانات للتدريب وأخرى للاختبار:

    x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=0)

    نقوم بإنشاء كائن يمثل المصنف المطلوب:

    logisticRegr = LogisticRegression()

    نقوم بتدريب المصنف على بيانات التدريب من خلال الدالة fit:

    logisticRegr.fit(x_train, y_train)

    الآن بعد تدريب النموذج يمكننا استخدامه لتوقع أي صورة من بيانات الاختبار، هنا سنقوم بتمرير أول صورة من بيانات الاختبار والتي تمثل العدد 2، لنرى إذا كان سيتنبأ بشكل صحيح:

    logisticRegr.predict(x_test[0].reshape(1,-1))
    # أي أنها تمثل العدد 2
    # array([2]) 

    الآن للحصول على دقة المصنف أو المودل الذي بنيناه:

    score = logisticRegr.score(x_test, y_test)
    print(score)
    # 0.9511111111111111

    كما تلاحظين الدقة هي 95 بالمئة، وهي دقة جيدة جداً لهذه المسألة.
    الآن سنقوم بتجربة NB:

    from sklearn.naive_bayes import GaussianNB
    NB = GaussianNB()
    # تدريب المصنّف
    NB.fit(x_train, y_train)
    scoreNB = NB.score(x_test, y_test)
    print(scoreNB)
    # 0.8333333333333334

    كما تلاحظين فإن الدقة ضعيفة بالنسبة لهذه المسألة 83%.

    الآن سأترك لك عدة ملاحظات:
    1. مع الصور يفضل دوماً استخدام الشبكات العصبية وتحديداً CNN. على سبيل المثال لو استخدمنا ال CNN هنا لكنت حصلت على دقة تصل إلى 99%.
    2. خورازمية Logistic Reg أعطت نتائج أفضل بكثير من NB رغم أن كلا الخوارزميتين خطيتين لكن Logistic Reg لاتعتمد على الاحتمالات و على وجود أحداث (ميزات هنا) سابقة.
    3.خورازمية Logistic Reg ليست أيضاً خورازمية مثالية للصور، لكنها تكون جيدة في بعض الحالات ولكن ليس بشكل عام فهي خوارزمية خطية أي أنها محدودة القدرة على ملائمة الأنواع المعقدة من الميزات إضافةً إلى أن تعقيدها الزمن كبير جداً في حال الصور الأكبر حجماً (صور بأبعاد تبدأ من 150*150 مثلاً) والداتاسيت الأكبر حجماً (تحتوي عدد أكبر من الصور ربما 25000 ألف صورة أو أكثر)، ستكون بطيئة للغاية وفي بعض الحالات قد تحتاج لأيام للانتهاء التدريب وفي حالات أخرى قد تصل لأشهر!.

    باختصار صور = CNN وانسى أي شيئ آخر.

    • أعجبني 1
×
×
  • أضف...