تحليل نموذج Tensorflow الأسئلة المتداولة

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

عام

هل لا يزال نموذج EvalSavedModel مطلوبًا؟

في السابق ، تطلب TFMA تخزين جميع المقاييس في رسم بياني لتدفق التوتر باستخدام نموذج EvalSavedModel خاص. الآن ، يمكن حساب المقاييس خارج الرسم البياني TF باستخدام beam.CombineFn .

بعض الاختلافات الرئيسية هي:

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

هل يمكن أن تعمل TFMA مع كل من المقاييس في الرسم البياني والمقاييس الخارجية؟

يسمح TFMA باستخدام نهج هجين حيث يمكن حساب بعض المقاييس في الرسم البياني حيث يمكن حساب المقاييس الأخرى بالخارج. إذا كان لديك نموذج EvalSavedModel حاليًا فيمكنك الاستمرار في استخدامه.

هناك حالتان:

  1. استخدم TFMA EvalSavedModel لاستخراج الميزات والحسابات المترية ولكن أضف أيضًا مقاييس إضافية قائمة على المُدمج. في هذه الحالة ، ستحصل على جميع المقاييس في الرسم البياني من EvalSavedModel جنبًا إلى جنب مع أي مقاييس إضافية من أداة التجميع التي ربما لم يتم دعمها مسبقًا.
  2. استخدم TFMA EvalSavedModel الميزة / التنبؤ ولكن استخدم المقاييس القائمة على المجمع لجميع حسابات المقاييس. يكون هذا الوضع مفيدًا إذا كانت هناك تحويلات للميزات موجودة في EvalSavedModel الذي ترغب في استخدامه للتقسيم إلى شرائح ، ولكنك تفضل إجراء جميع العمليات الحسابية المترية خارج الرسم البياني.

اقامة

ما هي أنواع النماذج المدعومة؟

تدعم TFMA نماذج keras ، والنماذج القائمة على واجهات برمجة التطبيقات العامة لتوقيع TF2 ، وكذلك النماذج القائمة على مقدر TF (على الرغم من اعتمادها على حالة الاستخدام ، قد تتطلب النماذج القائمة على المقدر استخدام نموذج EvalSavedModel ).

راجع دليل get_started للحصول على القائمة الكاملة لأنواع النماذج المدعومة وأي قيود.

كيف أقوم بإعداد TFMA للعمل مع نموذج أصلي قائم على keras؟

فيما يلي مثال على التكوين لنموذج keras بناءً على الافتراضات التالية:

  • النموذج المحفوظ للعرض ويستخدم اسم التوقيع serving_default (يمكن تغيير هذا باستخدام model_specs[0].signature_name ).
  • يجب تقييم المقاييس المضمنة من model.compile(...) (يمكن تعطيل ذلك عبر options.include_default_metric داخل tfma.EvalConfig ).
from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here. For example:
    #  metrics { class_name: "ConfusionMatrixPlot" }
    #  metrics { class_name: "CalibrationPlot" }
  }
  slicing_specs {}
""", tfma.EvalConfig())

راجع المقاييس لمزيد من المعلومات حول الأنواع الأخرى من المقاييس التي يمكن تكوينها.

كيف أقوم بإعداد TFMA للعمل مع نموذج عام قائم على تواقيع TF2؟

فيما يلي مثال على التكوين لنموذج TF2 عام. أدناه ، signature_name هو اسم التوقيع المحدد الذي يجب استخدامه للتقييم.

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "<signature-name>"
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here. For example:
    #  metrics { class_name: "BinaryCrossentropy" }
    #  metrics { class_name: "ConfusionMatrixPlot" }
    #  metrics { class_name: "CalibrationPlot" }
  }
  slicing_specs {}
""", tfma.EvalConfig())

راجع المقاييس لمزيد من المعلومات حول الأنواع الأخرى من المقاييس التي يمكن تكوينها.

كيف أقوم بإعداد TFMA للعمل مع نموذج قائم على المقدر؟

في هذه الحالة هناك ثلاثة خيارات.

الخيار 1: استخدام نموذج التقديم

إذا تم استخدام هذا الخيار ، فلن يتم تضمين أي مقاييس تمت إضافتها أثناء التدريب في التقييم.

فيما يلي مثال على التهيئة على افتراض أن serving_default هو اسم التوقيع المستخدم:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

راجع المقاييس لمزيد من المعلومات حول الأنواع الأخرى من المقاييس التي يمكن تكوينها.

الخيار 2: استخدم EvalSavedModel مع مقاييس إضافية قائمة على المجمع

في هذه الحالة ، استخدم EvalSavedModel لكلٍ من استخراج الميزات / التنبؤ والتقييم وأيضًا إضافة مقاييس إضافية قائمة على المُدمج.

فيما يلي مثال على التكوين:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

راجع المقاييس لمزيد من المعلومات حول الأنواع الأخرى من المقاييس التي يمكن تكوينها و EvalSavedModel لمزيد من المعلومات حول إعداد EvalSavedModel.

الخيار 3: استخدم نموذج EvalSavedModel فقط لاستخراج الميزة / التنبؤ

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

في هذه الحالة ، يكون التكوين هو نفسه كما هو مذكور أعلاه ، فقط يتم تعطيل include_default_metrics .

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
  options {
    include_default_metrics { value: false }
  }
""", tfma.EvalConfig())

راجع المقاييس لمزيد من المعلومات حول الأنواع الأخرى من المقاييس التي يمكن تكوينها و EvalSavedModel لمزيد من المعلومات حول إعداد EvalSavedModel.

كيف أقوم بإعداد TFMA للعمل مع نموذج keras القائم على نموذج إلى مقدر؟

إعداد model_to_estimator مشابه لمؤشر المقدّر. ومع ذلك ، هناك بعض الاختلافات الخاصة بكيفية عمل النموذج للمقدر. على وجه الخصوص ، يقوم النموذج model-to-esimtator بإرجاع مخرجاته في شكل dict حيث يكون مفتاح dt هو اسم آخر طبقة إخراج في نموذج keras المرتبط (إذا لم يتم توفير اسم ، فستختار keras اسمًا افتراضيًا لك مثل dense_1 أو output_1 ). من منظور TFMA ، هذا السلوك مشابه لما يمكن أن ينتج لنموذج متعدد المخرجات على الرغم من أن النموذج للمقدر قد يكون فقط لنموذج واحد. لحساب هذا الاختلاف ، يلزم اتخاذ خطوة إضافية لإعداد اسم الإخراج. ومع ذلك ، تنطبق نفس الخيارات الثلاثة كمقدر.

فيما يلي مثال على التغييرات المطلوبة للتكوين القائم على المقدر:

from google.protobuf import text_format

config = text_format.Parse("""
  ... as for estimator ...
  metrics_specs {
    output_names: ["<keras-output-layer>"]
    # Add metrics here.
  }
  ... as for estimator ...
""", tfma.EvalConfig())

كيف أقوم بإعداد TFMA للعمل مع التنبؤات المحسوبة مسبقًا (أي الحيادية للنموذج)؟ ( TFRecord tf.Example )

من أجل تكوين TFMA للعمل مع التنبؤات المحسوبة مسبقًا ، يجب تعطيل tfma.PredictExtractor الافتراضي ويجب تكوين tfma.InputExtractor لتحليل التنبؤات جنبًا إلى جنب مع ميزات الإدخال الأخرى. يتم تحقيق ذلك عن طريق تكوين tfma.ModelSpec مع اسم مفتاح الميزة المستخدم للتنبؤات جنبًا إلى جنب مع التسميات والأوزان.

فيما يلي مثال على الإعداد:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    prediction_key: "<prediction-key>"
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

راجع المقاييس لمزيد من المعلومات حول المقاييس التي يمكن تكوينها.

لاحظ أنه على الرغم من أن tfma.ModelSpec يتم تكوينه ، فلا يتم استخدام نموذج بالفعل (أي لا يوجد tfma.EvalSharedModel ). قد تبدو الدعوة لتشغيل تحليل النموذج كما يلي:

eval_result = tfma.run_model_analysis(
    eval_config=eval_config,
    # This assumes your data is a TFRecords file containing records in the
    # tf.train.Example format.
    data_location="/path/to/file/containing/tfrecords",
    output_path="/path/for/metrics_for_slice_proto")

كيف أقوم بإعداد TFMA للعمل مع التنبؤات المحسوبة مسبقًا (أي الحيادية للنموذج)؟ ( pd.DataFrame )

بالنسبة لمجموعات البيانات الصغيرة التي يمكن وضعها في الذاكرة ، فإن البديل عن سجل TFRecord هو pandas.DataFrame s. يمكن أن تعمل TFMA على pandas.DataFrame s باستخدام tfma.analyze_raw_data API. للحصول على شرح لـ tfma.MetricsSpec و tfma.SlicingSpec ، انظر دليل الإعداد . راجع المقاييس لمزيد من المعلومات حول المقاييس التي يمكن تكوينها.

فيما يلي مثال على الإعداد:

# Run in a Jupyter Notebook.

df_data = ...  # your pd.DataFrame

eval_config = text_format.Parse("""
  model_specs {
    label_key: 'label'
    prediction_key: 'prediction'
  }
  metrics_specs {
    metrics { class_name: "AUC" }
    metrics { class_name: "ConfusionMatrixPlot" }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: 'language'
  }
""", config.EvalConfig())

eval_result = tfma.analyze_raw_data(df_data, eval_config)

tfma.view.render_slicing_metrics(eval_result)

المقاييس

ما هي أنواع المقاييس المدعومة؟

تدعم TFMA مجموعة متنوعة من المقاييس بما في ذلك:

هل المقاييس من النماذج متعددة المخرجات مدعومة؟

نعم. انظر دليل المقاييس لمزيد من التفاصيل.

هل المقاييس من نماذج متعددة مدعومة؟

نعم. انظر دليل المقاييس لمزيد من التفاصيل.

هل يمكن تخصيص إعدادات القياس (الاسم ، إلخ)؟

نعم. يمكن تخصيص إعدادات المقاييس (على سبيل المثال ، تعيين عتبات معينة ، إلخ) عن طريق إضافة إعدادات config إلى تكوين المقياس. انظر دليل المقاييس لديه المزيد من التفاصيل.

هل المقاييس المخصصة مدعومة؟

نعم. إما عن طريق كتابة تنفيذ tf.keras.metrics.Metric مخصص أو عن طريق كتابة beam.CombineFn مخصصة. يحتوي دليل المقاييس على مزيد من التفاصيل.

ما هي أنواع المقاييس غير المدعومة؟

طالما يمكن حساب المقياس الخاص بك باستخدام beam.CombineFn ، لا توجد قيود على أنواع المقاييس التي يمكن حسابها بناءً على tfma.metrics.Metric . إذا كنت تعمل بمقياس مشتق من tf.keras.metrics.Metric ، فيجب استيفاء المعايير التالية:

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

الإضافات

هل يمكنني استخدام TFMA لتقييم الإنصاف أو التحيز في نموذجي؟

يتضمن TFMA إضافة FairnessIndicators التي توفر مقاييس ما بعد التصدير لتقييم آثار التحيز غير المقصود في نماذج التصنيف.

التخصيص

ماذا لو احتجت إلى مزيد من التخصيص؟

Extractors مرن للغاية ويسمح لك بتخصيص جميع أجزاء خط الأنابيب تقريبًا باستخدام أدوات الاستخراج و / أو Evaluators و / أو Writers . تمت مناقشة هذه الخيوط بمزيد من التفصيل في وثيقة الهندسة المعمارية .

استكشاف الأخطاء وإصلاحها ، وتصحيح الأخطاء ، والحصول على المساعدة

لماذا لا تتطابق مقاييس MultiClassConfusionMatrix مع مقاييس ConfusionMatrix ثنائية الأبعاد

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

على سبيل المثال ، لنفترض أن لدينا 10 فئات حيث تم التنبؤ بالفئة 2 باحتمال 0.8 ، ولكن الفئة الفعلية كانت الفئة 1 التي كان لها احتمال 0.15. إذا قمت بالترميز الثنائي في الفئة 1 واستخدمت عتبة 0.1 ، فسيتم اعتبار الفئة 1 صحيحة (0.15> 0.1) لذلك سيتم احتسابها على أنها TP ، ومع ذلك ، بالنسبة للحالة متعددة الفئات ، سيتم اعتبار الفئة 2 صحيحة (0.8> 0.1) وبما أن الفئة 1 كانت فعلية ، فسيتم احتسابها على أنها FN. نظرًا لأنه في العتبات المنخفضة سيتم اعتبار المزيد من القيم إيجابيات ، بشكل عام سيكون هناك عدد أكبر من TP و FP لمصفوفة الارتباك الثنائية مقارنة بمصفوفة الارتباك متعددة الطبقات ، وبالمثل أقل من TN و FN.

فيما يلي مثال على الاختلافات الملحوظة بين MultiClassConfusionMatrixAtThresholds والأعداد المقابلة من الترميز الثنائي لأحد الفئات.

MultiClassConfusionMatrixAtThresholds مقابل Binarized

لماذا يكون لمقياسي الدقة @ 1 والاستدعاء @ 1 نفس القيمة؟

عند أعلى قيمة k تبلغ 1 دقة والتذكر ، فإن الشيء نفسه. الدقة تساوي TP / (TP + FP) والاسترجاع يساوي TP / (TP + FN) . دائمًا ما يكون التوقع الأعلى إيجابيًا وسيتطابق مع التصنيف أو لا يتطابق معه. بمعنى آخر ، مع أمثلة N ، TP + FP = N ومع ذلك ، إذا كانت التسمية لا تتطابق مع التوقع الأعلى ، فهذا يعني أيضًا أنه تم مطابقة توقع غير علوي k ومع تعيين أعلى k على 1 ، ستكون جميع التنبؤات غير الأعلى 1 هي 0. وهذا يعني أن FN يجب أن يكون (N - TP) أو N = TP + FN . النتيجة النهائية هي precision@1 = TP / N = recall@1 . لاحظ أن هذا ينطبق فقط عندما يكون هناك تسمية واحدة لكل مثال ، وليس لتصنيف متعدد.

لماذا يكون مقياس متوسط ​​التصنيف والتنبؤ المتوسط ​​دائمًا 0.5؟

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

eval_config = text_format.Parse("""
  ...
  metrics_specs {
    binarize { class_ids: { values: [0] } }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    ...
  }
  ...
""", config.EvalConfig())

كيف نفسر MultiLabelConfusionMatrixPlot؟

بالنظر إلى تسمية معينة ، يمكن استخدام MultiLabelConfusionMatrixPlot (وما يرتبط بها MultiLabelConfusionMatrix ) لمقارنة نتائج التسميات الأخرى وتوقعاتها عندما كانت التسمية المختارة صحيحة بالفعل. على سبيل المثال ، لنفترض أن لدينا ثلاث فئات: bird ، plane ، superman ، ونقوم بتصنيف الصور للإشارة إلى ما إذا كانت تحتوي على واحد أو أكثر من أي من هذه الفئات. MultiLabelConfusionMatrix المنتج الديكارتي لكل فئة فعلية مقابل كل فئة أخرى (تسمى الفئة المتوقعة). لاحظ أنه بينما يكون الاقتران (actual, predicted) ، فإن الفئة predicted لا تعني بالضرورة توقعًا إيجابيًا ، فهي تمثل فقط العمود المتوقع في المصفوفة الفعلية مقابل المصفوفة المتوقعة. على سبيل المثال ، لنفترض أننا قمنا بحساب المصفوفات التالية:

   (bird, bird)         ->    { tp: 6, fp: 0, fn: 2, tn: 0}
   (bird, plane)        ->    { tp: 2, fp: 2, fn: 2, tn: 2}
   (bird, superman)     ->    { tp: 1, fp: 1, fn: 4, tn: 2}
   (plane, bird)        ->    { tp: 3, fp: 1, fn: 1, tn: 3}
   (plane, plane)       ->    { tp: 4, fp: 0, fn: 4, tn: 0}
   (plane, superman)    ->    { tp: 1, fp: 3, fn: 3, tn: 1}
   (superman, bird)     ->    { tp: 3, fp: 2, fn: 2, tn: 2}
   (superman, plane)    ->    { tp: 2, fp: 3, fn: 2, tn: 2}
   (superman, superman) ->    { tp: 4, fp: 0, fn: 5, tn: 0}

   num_examples: 20

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

1) إجمالي عدد التنبؤ

في هذه الحالة ، بالنسبة لصف معين (أي فئة فعلية) ، ما هي أعداد TP + FP للفئات الأخرى. بالنسبة للتهم الواردة أعلاه ، ستكون شاشة العرض كما يلي:

الطيور المتوقعة طائرة متوقعة توقع سوبرمان
الطائر الفعلي 6 4 2
الطائرة الفعلية 4 4 4
السوبرمان الفعلي 5 5 4

عندما احتوت الصور في الواقع على bird ، توقعنا بشكل صحيح 6 منهم. في الوقت نفسه ، توقعنا أيضًا plane (سواء بشكل صحيح أو خاطئ) 4 مرات superman (سواء بشكل صحيح أو خاطئ) مرتين.

2) عدد التنبؤات غير الصحيحة

في هذه الحالة ، بالنسبة لصف معين (أي فئة فعلية) ، ما هي أعداد FP للفئات الأخرى. بالنسبة للتهم الواردة أعلاه ، ستكون شاشة العرض كما يلي:

الطيور المتوقعة طائرة متوقعة توقع سوبرمان
الطائر الفعلي 0 2 1
الطائرة الفعلية 1 0 3
السوبرمان الفعلي 2 3 0

عندما احتوت الصور فعليًا على bird ، توقعنا خطأ plane مرتين superman مرة واحدة.

3) العد السلبي الكاذب

في هذه الحالة ، بالنسبة لصف معين (أي فئة فعلية) ، ما هي أعداد FN للفئات الأخرى. بالنسبة للتهم الواردة أعلاه ، ستكون شاشة العرض كما يلي:

الطيور المتوقعة طائرة متوقعة توقع سوبرمان
الطائر الفعلي 2 2 4
الطائرة الفعلية 1 4 3
السوبرمان الفعلي 2 2 5

عندما احتوت الصور في الواقع على bird فشلنا في التنبؤ به مرتين. في الوقت نفسه ، فشلنا في التنبؤ plane مرتين superman 4 مرات.

لماذا أحصل على خطأ بخصوص مفتاح التنبؤ غير موجود؟

بعض النماذج تُخرج تنبؤاتها في شكل قاموس. على سبيل المثال ، يقوم مقدر TF لمشكلة التصنيف الثنائي بإخراج قاموس يحتوي على probabilities ، class_ids predictions probabilities إلى ذلك. مفاتيح الإخراج تحت أسماء لا تعرفها TFMA. في هذه الحالات ، يجب إضافة إعداد prediciton_key إلى tfma.ModelSpec لتحديد اسم المفتاح الذي تم تخزين الإخراج تحته.