تحليل نموذج TensorFlow

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

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

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

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

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

pickup_community_area أجرة رحلة_الشهر
رحلة_بدء_ساعة رحلة_البدء_اليوم 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)

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

# Upgrade pip to the latest, and install TFMA.
pip install -U pip
pip install tensorflow-model-analysis

الآن يجب عليك إعادة تشغيل وقت التشغيل قبل تشغيل الخلايا أدناه.

# This setup was tested with TF 2.5 and TFMA 0.31 (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.'

import tensorflow as tf
print('TF version: {}'.format(tf.__version__))
import apache_beam as beam
print('Beam version: {}'.format(beam.__version__))
import tensorflow_model_analysis as tfma
print('TFMA version: {}'.format(tfma.__version__))
TF version: 2.4.4
Beam version: 2.34.0
TFMA version: 0.29.0

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

سنقوم بتنزيل ملف 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  28.2M      0 --:--:-- --:--:-- --:--:-- 28.2M
Here's what we downloaded:
/tmp/tmp_at9q62d:
saved_models-2.2

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

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

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

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

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

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

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

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

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

/tmp/tmp_at9q62d/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/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

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

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

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

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

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

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

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

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

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

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

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

تحليل المخطط

ومن بين الأشياء التي تم تحميلها كان مخطط لبياناتنا التي تم إنشاؤها بواسطة TensorFlow التحقق من صحة البيانات . دعونا نحلل ذلك الآن حتى نتمكن من استخدامه مع 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)

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

نحتاج إلى منح 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/tmp_at9q62d/train_data.rio

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

تدعم TFMA عددًا من أنواع النماذج المختلفة بما في ذلك نماذج TF keras ، والنماذج القائمة على واجهات برمجة التطبيقات العامة لتوقيع TF2 ، بالإضافة إلى النماذج القائمة على مقدر TF. و get_started دليل لديه قائمة كاملة من أنواع تأييد نموذج وأي قيود. على سبيل المثال نحن نذهب لإظهار كيفية تكوين keras نموذج يستند فضلا عن نموذج يقوم مقدر التي تم حفظها باعتبارها 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)
2021-12-04 10:18:15.463173: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:18:15.464249: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1757] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
WARNING:absl:Tensorflow version (2.4.4) 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:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
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.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: 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.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: 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.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/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.7/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/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/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.7/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 إلى النقطة دينا 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_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_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.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.

أولاً ، سنتخيل أننا دربنا نموذجنا ونشرناه بالأمس ، والآن نريد أن نرى كيف يعمل على البيانات الجديدة الواردة اليوم. سيبدأ التصور بعرض 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': {'': {'': {'binary_accuracy': {'doubleValu…

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

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': {'': {'': {'binary_accuracy': {'doubleValu…

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

يمكن تكوين TFMA لتقييم نماذج متعددة في نفس الوقت. عادةً ما يتم إجراء ذلك لمقارنة نموذج جديد مقابل خط أساسي (مثل نموذج العرض الحالي) لتحديد اختلافات الأداء في المقاييس (مثل AUC ، إلخ) المتعلقة بخط الأساس. عندما عتبات تم تكوينها، سوف TFMA إنتاج 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.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.

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

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

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

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

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