ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

تحليل نموذج TensorFlow

مثال على مكون رئيسي في TensorFlow Extended (TFX)

تحليل نموذج TensorFlow (TFMA) عبارة عن مكتبة لأداء تقييم النموذج عبر شرائح مختلفة من البيانات. تنفذ TFMA حساباتها بطريقة موزعة على كميات كبيرة من البيانات باستخدام Apache Beam .

يوضح هذا المثال من دفتر ملاحظات colab كيف يمكن استخدام TFMA للتحقيق في أداء النموذج وتصوره فيما يتعلق بخصائص مجموعة البيانات. سنستخدم نموذجًا دربناه سابقًا ، والآن يمكنك اللعب بالنتائج! كان النموذج الذي دربناه هو مثال Chicago Taxi ، الذي يستخدم مجموعة بيانات Taxi Trips التي أصدرتها مدينة شيكاغو. استكشف مجموعة البيانات الكاملة في BigQuery UI .

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

الأعمدة في مجموعة البيانات هي:

pickup_community_area أجرة trip_start_month
رحلة_بدء_ساعة trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude رحلة_مايلز pickup_census_tract
dropoff_census_tract نوع الدفع شركة
رحلة_ثواني منطقة_المجتمع نصائح

قم بتثبيت ملحقات Jupyter

jupyter nbextension enable --py widgetsnbextension --sys-prefix 
jupyter nbextension install --py --symlink tensorflow_model_analysis --sys-prefix 
jupyter nbextension enable --py tensorflow_model_analysis --sys-prefix 

تثبيت تحليل نموذج TensorFlow (TFMA)

سيؤدي هذا إلى سحب جميع التبعيات ، وسيستغرق دقيقة.

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

# This setup was tested with TF 2.3 and TFMA 0.24 (using colab), but it should
# also work with the latest release.
import sys

# Confirm that we're using Python 3
assert sys.version_info.major==3, 'This notebook must be run using Python 3.'

print('Installing TensorFlow')
import tensorflow as tf
print('TF version: {}'.format(tf.__version__))

print('Installing Tensorflow Model Analysis and Dependencies')
!pip install -q tensorflow_model_analysis
import apache_beam as beam
print('Beam version: {}'.format(beam.__version__))
import tensorflow_model_analysis as tfma
print('TFMA version: {}'.format(tfma.__version__))
Installing TensorFlow
TF version: 2.3.1
Installing Tensorflow Model Analysis and Dependencies
ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts.

We recommend you use --use-feature=2020-resolver to test your packages with the new resolver before it becomes the default.

google-api-python-client 1.12.3 requires httplib2<1dev,>=0.15.0, but you'll have httplib2 0.9.2 which is incompatible.
Beam version: 2.24.0
TFMA version: 0.24.3

قم بتحميل الملفات

سنقوم بتنزيل ملف tar يحتوي على كل ما نحتاجه. يتضمن:

  • مجموعات بيانات التدريب والتقييم
  • مخطط البيانات
  • تدريب وخدمة النماذج المحفوظة (keras والمقدر) وتقييم النماذج المحفوظة (مقدر).
# Download the tar file from GCP and extract it
import io, os, tempfile
TAR_NAME = 'saved_models-2.2'
BASE_DIR = tempfile.mkdtemp()
DATA_DIR = os.path.join(BASE_DIR, TAR_NAME, 'data')
MODELS_DIR = os.path.join(BASE_DIR, TAR_NAME, 'models')
SCHEMA = os.path.join(BASE_DIR, TAR_NAME, 'schema.pbtxt')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')

!curl -O https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/{TAR_NAME}.tar
!tar xf {TAR_NAME}.tar
!mv {TAR_NAME} {BASE_DIR}
!rm {TAR_NAME}.tar

print("Here's what we downloaded:")
!ls -R {BASE_DIR}
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6800k  100 6800k    0     0  25.4M      0 --:--:-- --:--:-- --:--:-- 25.3M
Here's what we downloaded:
/tmp/tmpj6t03cp6:
saved_models-2.2

/tmp/tmpj6t03cp6/saved_models-2.2:
data  models  schema.pbtxt

/tmp/tmpj6t03cp6/saved_models-2.2/data:
eval  train

/tmp/tmpj6t03cp6/saved_models-2.2/data/eval:
data.csv

/tmp/tmpj6t03cp6/saved_models-2.2/data/train:
data.csv

/tmp/tmpj6t03cp6/saved_models-2.2/models:
estimator  keras

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator:
eval_model_dir  serving_model_dir

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir:
1591221811

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir/1591221811:
saved_model.pb  tmp.pbtxt  variables

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir:
checkpoint
eval_chicago-taxi-eval
events.out.tfevents.1591221780.my-pipeline-b57vp-237544850
export
graph.pbtxt
model.ckpt-100.data-00000-of-00001
model.ckpt-100.index
model.ckpt-100.meta

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir/export:
chicago-taxi

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi:
1591221801

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801:
saved_model.pb  variables

/tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras:
0  1  2

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras/0:
saved_model.pb  variables

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras/0/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras/1:
saved_model.pb  variables

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras/1/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras/2:
saved_model.pb  variables

/tmp/tmpj6t03cp6/saved_models-2.2/models/keras/2/variables:
variables.data-00000-of-00001  variables.index

تحليل المخطط

من بين الأشياء التي نزّلناها كان مخططًا لبياناتنا تم إنشاؤه بواسطة TensorFlow Data Validation . دعنا نحلل ذلك الآن حتى نتمكن من استخدامه مع TFMA.

import tensorflow as tf
from google.protobuf import text_format
from tensorflow.python.lib.io import file_io
from tensorflow_metadata.proto.v0 import schema_pb2
from tensorflow.core.example import example_pb2

schema = schema_pb2.Schema()
contents = file_io.read_file_to_string(SCHEMA)
schema = text_format.Parse(contents, schema)

استخدم المخطط لإنشاء سجلات TFR

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

import csv

datafile = os.path.join(DATA_DIR, 'eval', 'data.csv')
reader = csv.DictReader(open(datafile, 'r'))
examples = []
for line in reader:
  example = example_pb2.Example()
  for feature in schema.feature:
    key = feature.name
    if feature.type == schema_pb2.FLOAT:
      example.features.feature[key].float_list.value[:] = (
          [float(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.INT:
      example.features.feature[key].int64_list.value[:] = (
          [int(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.BYTES:
      example.features.feature[key].bytes_list.value[:] = (
          [line[key].encode('utf8')] if len(line[key]) > 0 else [])
  # Add a new column 'big_tipper' that indicates if tips was > 20% of the fare. 
  # TODO(b/157064428): Remove after label transformation is supported for Keras.
  big_tipper = float(line['tips']) > float(line['fare']) * 0.2
  example.features.feature['big_tipper'].float_list.value[:] = [big_tipper]
  examples.append(example)

tfrecord_file = os.path.join(BASE_DIR, 'train_data.rio')
with tf.io.TFRecordWriter(tfrecord_file) as writer:
  for example in examples:
    writer.write(example.SerializeToString())

!ls {tfrecord_file}
/tmp/tmpj6t03cp6/train_data.rio

إعداد وتشغيل TFMA

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

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

بعد إنشاء tfma.EvalConfig و tfma.EvalSharedModel يمكننا ثم تشغيل TFMA باستخدام tfma.run_model_analysis . سيؤدي هذا إلى إنشاء tfma.EvalResult الذي يمكننا استخدامه لاحقًا لعرض المقاييس والمؤامرات.

كيراس

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
keras_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # For keras (and serving models) we need to add a `label_key`.
    label_key: "big_tipper"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our keras model.
keras_model_path = os.path.join(MODELS_DIR, 'keras', '2')
keras_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=keras_model_path,
    eval_config=keras_eval_config)

keras_output_path = os.path.join(OUTPUT_DIR, 'keras')

# Run TFMA
keras_eval_result = tfma.run_model_analysis(
    eval_shared_model=keras_eval_shared_model,
    eval_config=keras_eval_config,
    data_location=tfrecord_file,
    output_path=keras_output_path)
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.

Warning:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:70: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:70: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

مقدر

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
estimator_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # To use EvalSavedModel set `signature_name` to "eval".
    signature_name: "eval"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our eval saved model.
estimator_base_model_path = os.path.join(
    MODELS_DIR, 'estimator', 'eval_model_dir')
estimator_model_path = os.path.join(
    estimator_base_model_path, os.listdir(estimator_base_model_path)[0])
estimator_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=estimator_model_path,
    eval_config=estimator_eval_config)

estimator_output_path = os.path.join(OUTPUT_DIR, 'estimator')

# Run TFMA
estimator_eval_result = tfma.run_model_analysis(
    eval_shared_model=estimator_eval_shared_model,
    eval_config=estimator_eval_config,
    data_location=tfrecord_file,
    output_path=estimator_output_path)
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.

INFO:tensorflow:Restoring parameters from /tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables

INFO:tensorflow:Restoring parameters from /tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.

تصور المقاييس والمؤامرات

الآن بعد أن أجرينا التقييم ، دعنا نلقي نظرة على تصوراتنا باستخدام TFMA. بالنسبة للأمثلة التالية ، سوف نتخيل النتائج من تشغيل التقييم على نموذج keras. لعرض النموذج المعتمد على المقدر ، قم بتحديث القيمة eval_result للإشارة إلى متغير eval_result estimator_eval_result .

eval_result = keras_eval_result
# eval_result = estimator_eval_result

مقاييس التقديم

لعرض المقاييس ، يمكنك استخدام tfma.view.render_slicing_metrics

بشكل افتراضي ، ستعرض طرق العرض الشريحة Overall . لعرض شريحة معينة ، يمكنك إما استخدام اسم العمود (عن طريق تعيين slicing_column ) أو توفير ملف tfma.SlicingSpec .

يدعم تصور المقاييس التفاعلات التالية:

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

على سبيل المثال ، سنقوم بتعيين slicing_column لإلقاء نظرة على ميزة trip_start_hour من slicing_specs السابقة.

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_hour')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_hour:2', …

نظرة عامة على الشرائح

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

في التصور أعلاه:

  • جرب فرز عمود الميزة ، وهو ميزة trip_start_hours بنا ، من خلال النقر على رأس العمود
  • جرب الفرز بدقة ، ولاحظ أن الدقة لبعض الساعات مع الأمثلة هي 0 ، مما قد يشير إلى وجود مشكلة

يسمح لنا المخطط أيضًا بتحديد وعرض مقاييس مختلفة في شرائحنا.

  • حاول تحديد مقاييس مختلفة من قائمة "عرض"
  • حاول تحديد استدعاء في قائمة "عرض" ، ولاحظ أن استدعاء بعض الساعات مع أمثلة هو 0 ، مما قد يشير إلى وجود مشكلة

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

الرسم البياني للمقاييس

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

  • حاول تحديد "المدرج التكراري للقياسات" في قائمة التمثيل البصري

المزيد من الشرائح

أنشأ tfma.EvalConfig الأولي لدينا قائمة كاملة من slicing_specs ، والتي يمكننا تصورها عن طريق تحديث معلومات الشريحة التي تم تمريرها إلى tfma.view.render_slicing_metrics . trip_start_day شريحة trip_start_day (أيام الأسبوع). حاول تغيير trip_start_day إلى trip_start_month مرة أخرى لفحص الشرائح المختلفة.

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_day')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day:3', '…

تدعم TFMA أيضًا إنشاء تقاطعات للميزات لتحليل مجموعات الميزات. أنشأت trip_start_hour الأصلية رحلة trip_start_hour و trip_start_day :

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_hour', 'trip_start_day']))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

عبور العمودين يخلق الكثير من التركيبات! دعنا نحصر عرضنا لننظر فقط إلى الرحلات التي تبدأ عند الظهر . ثم دعونا نختار binary_accuracy من التصور:

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_day'], feature_values={'trip_start_hour': '12'}))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

تقديم المؤامرات

أي المؤامرات التي تمت إضافتها إلى tfma.EvalConfig عن التدريب بعد metric_specs يمكن عرضها باستخدام tfma.view.render_plot .

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

في المثال أدناه ، نعرض مخططات CalibrationPlot و ConfusionMatrixPlot التي تم حسابها trip_start_hour:1 .

tfma.view.render_plot(
    eval_result,
    tfma.SlicingSpec(feature_values={'trip_start_hour': '1'}))
PlotViewer(config={'sliceName': 'trip_start_hour:1', 'metricKeys': {'calibrationPlot': {'metricName': 'calibra…

تتبع أداء النموذج بمرور الوقت

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

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

لنقم بتحميل 3 نماذج مختلفة ونستخدم TFMA لنرى كيف يقارنون باستخدام render_time_series .

# Note this re-uses the EvalConfig from the keras setup.

# Run eval on each saved model
output_paths = []
for i in range(3):
  # Create a tfma.EvalSharedModel that points at our saved model.
  eval_shared_model = tfma.default_eval_shared_model(
      eval_saved_model_path=os.path.join(MODELS_DIR, 'keras', str(i)),
      eval_config=keras_eval_config)

  output_path = os.path.join(OUTPUT_DIR, 'time_series', str(i))
  output_paths.append(output_path)

  # Run TFMA
  tfma.run_model_analysis(eval_shared_model=eval_shared_model,
                          eval_config=keras_eval_config,
                          data_location=tfrecord_file,
                          output_path=output_path)
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta

أولاً ، سنتخيل أننا دربنا نموذجنا ونشرناه بالأمس ، والآن نريد أن نرى كيف يعمل على البيانات الجديدة الواردة اليوم. سيبدأ التصور بعرض AUC. من واجهة المستخدم يمكنك:

  • أضف مقاييس أخرى باستخدام قائمة "إضافة سلسلة مقاييس".
  • أغلق الرسوم البيانية غير المرغوب فيها من خلال النقر على x
  • قم بالتمرير فوق نقاط البيانات (نهايات مقاطع الخط في الرسم البياني) للحصول على مزيد من التفاصيل
eval_results_from_disk = tfma.load_eval_results(output_paths[:2])

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'calibration': {'doubleValue': …

الآن سوف نتخيل أن يومًا آخر قد مر ونريد أن نرى كيف يتم ذلك على البيانات الجديدة الواردة اليوم ، مقارنةً باليومين السابقين:

eval_results_from_disk = tfma.load_eval_results(output_paths)

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'calibration': {'doubleValue': …

التحقق من صحة النموذج

يمكن تكوين TFMA لتقييم نماذج متعددة في نفس الوقت. عادةً ما يتم إجراء ذلك لمقارنة نموذج جديد مقابل خط أساسي (مثل نموذج العرض الحالي) لتحديد اختلافات الأداء في المقاييس (مثل AUC ، إلخ) المتعلقة بخط الأساس. عند تكوين العتبات ، سينتج tfma.ValidationResult سجل tfma.ValidationResult يشير إلى ما إذا كان الأداء يطابق التوقعات.

دعونا نعيد تكوين تقييم keras الخاص بنا لمقارنة نموذجين: مرشح وخط أساسي. سنقوم أيضًا بالتحقق من أداء المرشح مقابل خط الأساس من خلال تعيين tmfa.MetricThreshold على مقياس AUC.

# Setup tfma.EvalConfig setting
eval_config_with_thresholds = text_format.Parse("""
  ## Model information
  model_specs {
    name: "candidate"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
  }
  model_specs {
    name: "baseline"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
    is_baseline: true
  }

  ## Post training metric information
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics {
      class_name: "AUC"
      threshold {
        # Ensure that AUC is always > 0.9
        value_threshold {
          lower_bound { value: 0.9 }
        }
        # Ensure that AUC does not drop by more than a small epsilon
        # e.g. (candidate - baseline) > -1e-10 or candidate > baseline - 1e-10
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_keys: ["trip_start_month"]
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create tfma.EvalSharedModels that point at our keras models.
candidate_model_path = os.path.join(MODELS_DIR, 'keras', '2')
baseline_model_path = os.path.join(MODELS_DIR, 'keras', '1')
eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path=candidate_model_path,
      eval_config=eval_config_with_thresholds),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path=baseline_model_path,
      eval_config=eval_config_with_thresholds),
]

validation_output_path = os.path.join(OUTPUT_DIR, 'validation')

# Run TFMA
eval_result_with_validation = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config_with_thresholds,
    data_location=tfrecord_file,
    output_path=validation_output_path)
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/evaluators/metrics_validator.py:66: RuntimeWarning: invalid value encountered in true_divide
  ratio = diff / metrics[key.make_baseline_key(baseline_model_name)]

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

دعنا نلقي نظرة على المقاييس التي ينتجها تشغيلنا:

tfma.view.render_time_series(eval_result_with_validation)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'calibration_diff': {'doubleVal…

لنلقِ الآن نظرة على ناتج عمليات التحقق من الصحة. لعرض نتائج التحقق ، نستخدم tfma.load_validator_result . على سبيل المثال ، فشل التحقق من الصحة لأن AUC أقل من الحد الأدنى.

validation_result = tfma.load_validation_result(validation_output_path)
print(validation_result.validation_ok)
False