ניתוח מודל TensorFlow

דוגמה לרכיב מפתח של TensorFlow Extended (TFX)

TensorFlow דגם ניתוח (TFMA) הוא ספרייה לביצוע הערכת מודל פני נתחים שונים של נתון. TFMA מבצעת חישובים שלה בצורה מפוזרת על פני כמויות גדולות של נתונים באמצעות Apache Beam .

מחברת colab לדוגמה ממחישה כיצד ניתן להשתמש ב-TFMA כדי לחקור ולהמחיש את הביצועים של מודל ביחס למאפיינים של מערך הנתונים. נשתמש במודל שאימנו בעבר, ועכשיו אתה יכול לשחק עם התוצאות! המודל שאנו מאומנים היה עבור דוגמה מוניות שיקגו , אשר משתמשת מוניות Trips הנתונים שפורסמו על ידי עיריית שיקגו. חקור את מערך הנתונים המלא של BigQuery UI .

כמעצב ומפתח, חשוב על אופן השימוש בנתונים אלו ועל היתרונות והנזקים הפוטנציאליים שחיזוי המודל עלולים לגרום. מודל כזה יכול לחזק את ההטיות והפערים החברתיים. האם תכונה רלוונטית לבעיה שברצונך לפתור או שהיא תציג הטיה? לקבלת מידע נוסף, לקרוא על גינות ML .

העמודות במערך הנתונים הן:

אזור_קהילת_איסוף דמי נסיעה חודש_תחילת_טיול
שעה_התחלה_טיול יום_התחלה_טיול trip_start_timestamp
pickup_latitude איסוף_אורך dropoff_latitude
dropoff_longitude trip_miles אוסף_מפקד האוכלוסין
ערכת_מפקד_הורדה סוג תשלום חֶברָה
trip_seconds אזור_קהילת ירידה טיפים

התקן את הרחבות 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 Model Analysis (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 ו-Estimator) ו-eval שמורים (אומד).
# 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, מודלים המבוססים על ממשקי API של חתימות 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 שיא המציינת אם הביצועים תואמים expecations.

בואו נגדיר מחדש את הערכת ה-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