Tham gia cộng đồng SIG TFX-Addons và giúp cải thiện TFX tốt hơn nữa!

Phân tích mô hình TensorFlow

Ví dụ về thành phần chính của TensorFlow Extended (TFX)

Phân tích mô hình TensorFlow (TFMA) là một thư viện để thực hiện đánh giá mô hình trên các phần dữ liệu khác nhau. TFMA thực hiện các tính toán của nó theo cách phân tán trên một lượng lớn dữ liệu bằng Apache Beam .

Sổ tay chuyên mục ví dụ này minh họa cách TFMA có thể được sử dụng để điều tra và hình dung hiệu suất của một mô hình liên quan đến các đặc điểm của tập dữ liệu. Chúng tôi sẽ sử dụng một mô hình mà chúng tôi đã đào tạo trước đây và bây giờ bạn có thể chơi với kết quả! Mô hình mà chúng tôi đã đào tạo là cho Ví dụ về Taxi Chicago , sử dụng tập dữ liệu Chuyến đi Taxi do Thành phố Chicago phát hành. Khám phá tập dữ liệu đầy đủ trong giao diện người dùng BigQuery .

Với tư cách là người lập mô hình và nhà phát triển, hãy nghĩ về cách dữ liệu này được sử dụng và những lợi ích cũng như tác hại tiềm ẩn mà các dự đoán của mô hình có thể gây ra. Một mô hình như thế này có thể củng cố những thành kiến ​​và chênh lệch xã hội. Một tính năng có liên quan đến vấn đề bạn muốn giải quyết hay nó sẽ tạo ra sự thiên vị? Để biết thêm thông tin, hãy đọc về sự công bằng của ML .

Các cột trong tập dữ liệu là:

pickup_community_area giá vé trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude trip_miles pickup_census_tract
dropoff_census_tract hình thức thanh toán Công ty
trip_seconds dropoff_community_area lời khuyên

Cài đặt Tiện ích mở rộng 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 

Cài đặt Phân tích mô hình TensorFlow (TFMA)

Điều này sẽ kéo theo tất cả các phụ thuộc và sẽ mất một phút.

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

Bây giờ bạn phải khởi động lại thời gian chạy trước khi chạy các ô bên dưới.

# 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.5.0
Beam version: 2.29.0
TFMA version: 0.31.0

Tải tệp

Chúng tôi sẽ tải xuống một tệp tar có mọi thứ chúng tôi cần. Điều đó bao gồm:

  • Tập dữ liệu đào tạo và đánh giá
  • Lược đồ dữ liệu
  • Đào tạo và phục vụ các mô hình đã lưu (keras và công cụ ước lượng) và đánh giá các mô hình đã lưu (công cụ ước lượng).
# 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.0M      0 --:--:-- --:--:-- --:--:-- 25.0M
Here's what we downloaded:
/tmp/tmpsu298d8g:
saved_models-2.2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Phân tích cú pháp lược đồ

Trong số những thứ chúng tôi đã tải xuống có một lược đồ cho dữ liệu của chúng tôi được tạo bởi TensorFlow Data Validation . Hãy phân tích cú pháp đó ngay bây giờ để chúng ta có thể sử dụng nó với 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)

Sử dụng lược đồ để tạo TFRecords

Chúng tôi cần cấp cho TFMA quyền truy cập vào tập dữ liệu của mình, vì vậy hãy tạo tệp TFRecords. Chúng tôi có thể sử dụng lược đồ của mình để tạo nó, vì nó cung cấp cho chúng tôi loại chính xác cho mỗi đối tượng địa lý.

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/tmpsu298d8g/train_data.rio

Thiết lập và chạy TFMA

TFMA hỗ trợ một số kiểu mô hình khác nhau bao gồm mô hình TF keras, mô hình dựa trên API chữ ký TF2 chung, cũng như mô hình dựa trên công cụ ước tính TF. Hướng dẫn get_started có danh sách đầy đủ các loại mô hình được hỗ trợ và bất kỳ hạn chế nào. Đối với ví dụ này, chúng tôi sẽ trình bày cách định cấu hình mô hình dựa trên keras cũng như mô hình dựa trên công cụ ước tính đã được lưu dưới dạng EvalSavedModel . Xem Câu hỏi thường gặp để biết ví dụ về các cấu hình khác.

TFMA cung cấp hỗ trợ để tính toán các chỉ số được sử dụng tại thời điểm đào tạo (tức là các chỉ số tích hợp sẵn) cũng như các chỉ số được xác định sau khi mô hình được lưu như một phần của cài đặt cấu hình TFMA. Đối với thiết lập keras của chúng tôi, chúng tôi sẽ chứng minh việc thêm các chỉ số và biểu đồ theo cách thủ công như một phần của cấu hình của chúng tôi (xem hướng dẫn về chỉ số để biết thông tin về các chỉ số và biểu đồ được hỗ trợ). Để thiết lập công cụ ước tính, chúng tôi sẽ sử dụng các chỉ số tích hợp đã được lưu cùng với mô hình. Các thiết lập của chúng tôi cũng bao gồm một số thông số kỹ thuật cắt được thảo luận chi tiết hơn trong các phần sau.

Sau khi tạo tfma.EvalConfigtfma.EvalSharedModel chúng ta có thể chạy tfma.run_model_analysis bằng tfma.run_model_analysis . Điều này sẽ tạo ra một tfma.EvalResult mà chúng tôi có thể sử dụng sau này để hiển thị các chỉ số và biểu đồ của chúng tôi.

Keras

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:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) 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.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)`

Công cụ ước tính

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:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
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/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/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.

Hình dung các số liệu và lô

Bây giờ chúng tôi đã chạy đánh giá, hãy xem các hình ảnh trực quan của chúng tôi bằng cách sử dụng TFMA. Đối với các ví dụ sau, chúng ta sẽ hình dung kết quả từ việc chạy đánh giá trên mô hình keras. Để xem mô hình dựa trên công cụ ước tính, hãy cập nhật eval_result để trỏ đến biến estimator_eval_result eval_result của chúng tôi.

eval_result = keras_eval_result
# eval_result = estimator_eval_result

Số liệu hiển thị

Để xem các chỉ số, bạn sử dụng tfma.view.render_slicing_metrics

Theo mặc định, các khung nhìn sẽ hiển thị phần Overall . Để xem một lát cụ thể, bạn có thể sử dụng tên của cột (bằng cách thiết lập slicing_column ) hoặc cung cấp một tfma.SlicingSpec .

Hình ảnh hóa số liệu hỗ trợ các tương tác sau:

  • Nhấp và kéo để xoay
  • Cuộn để thu phóng
  • Nhấp chuột phải để đặt lại chế độ xem
  • Di chuột qua điểm dữ liệu mong muốn để xem thêm chi tiết.
  • Chọn từ bốn loại chế độ xem khác nhau bằng cách sử dụng các lựa chọn ở dưới cùng.

Ví dụ: chúng tôi sẽ thiết lập slicing_column để xem xét tính năng trip_start_hour từ các slicing_specs trước đó của chúng tôi.

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

Tổng quan về Slices

Hình ảnh trực quan mặc định là Tổng quan về lát cắt khi số lượng lát nhỏ. Nó hiển thị các giá trị của số liệu cho mỗi lát. Vì chúng tôi đã chọn trip_start_hour ở trên, nó hiển thị cho chúng tôi các chỉ số như độ chính xác và AUC cho mỗi giờ, cho phép chúng tôi tìm kiếm các vấn đề cụ thể đối với một số giờ chứ không phải những giờ khác.

Trong hình ảnh bên trên:

  • Hãy thử sắp xếp cột tính năng, là tính năng trip_start_hours của chúng tôi, bằng cách nhấp vào tiêu đề cột
  • Hãy thử sắp xếp theo độ chính xác và lưu ý rằng độ chính xác cho một số giờ với các ví dụ là 0, điều này có thể cho thấy sự cố

Biểu đồ cũng cho phép chúng tôi chọn và hiển thị các số liệu khác nhau trong các lát của chúng tôi.

  • Thử chọn các chỉ số khác nhau từ menu "Hiển thị"
  • Hãy thử chọn gọi lại trong menu "Hiển thị" và lưu ý rằng số giờ gọi lại với các ví dụ là 0, điều này có thể cho thấy sự cố

Cũng có thể đặt ngưỡng để lọc ra các lát có số lượng ví dụ nhỏ hơn hoặc "trọng số". Bạn có thể nhập số lượng ví dụ tối thiểu hoặc sử dụng thanh trượt.

Biểu đồ số liệu

Chế độ xem này cũng hỗ trợ Biểu đồ số liệu như một hình ảnh trực quan thay thế, đây cũng là chế độ xem mặc định khi số lượng lát lớn. Kết quả sẽ được chia thành các nhóm và có thể hình dung số lượng lát cắt / tổng trọng lượng / cả hai. Các cột có thể được sắp xếp bằng cách nhấp vào tiêu đề cột. Các lát có trọng lượng nhỏ có thể được lọc ra bằng cách đặt ngưỡng. Lọc thêm có thể được áp dụng bằng cách kéo dải màu xám. Để đặt lại dải, hãy nhấp đúp vào dải. Lọc cũng có thể được sử dụng để loại bỏ các ngoại lệ trong trực quan hóa và các bảng chỉ số. Nhấp vào biểu tượng bánh răng để chuyển sang thang đo logarit thay vì thang tuyến tính.

  • Thử chọn "Biểu đồ số liệu" trong menu Hình ảnh hóa

Nhiều lát

tfma.EvalConfig ban đầu của chúng tôi đã tạo một danh sách toàn bộ các slicing_specs , chúng tôi có thể hình dung bằng cách cập nhật thông tin lát cắt được chuyển đến tfma.view.render_slicing_metrics . Tại đây, chúng tôi sẽ chọn phần trip_start_day (các ngày trong tuần). Hãy thử thay đổi trip_start_day thành trip_start_month và kết xuất lại để kiểm tra các phần khác nhau.

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

TFMA cũng hỗ trợ tạo các giao diện tính năng để phân tích sự kết hợp của các tính năng. Cài đặt ban đầu của chúng tôi đã tạo trip_start_hourtrip_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…

Việc vượt qua hai cột tạo ra rất nhiều sự kết hợp! Hãy thu hẹp thập giá của chúng ta để chỉ xem xét các chuyến đi bắt đầu vào buổi trưa . Sau đó, hãy chọn binary_accuracy từ hình ảnh:

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…

Kết xuất các lô

Bất kỳ lô nào đã được thêm vào tfma.EvalConfig dưới dạng tfma.EvalConfig sau đào tạo metric_specs có thể được hiển thị bằng cách sử dụng tfma.view.render_plot .

Như với các chỉ số, các biểu đồ có thể được xem theo phần. Không giống như các chỉ số, chỉ các biểu đồ cho một giá trị lát cụ thể mới có thể được hiển thị, do đó, tfma.SlicingSpec phải được sử dụng và nó phải chỉ định cả tên và giá trị của tính năng lát. Nếu không có lát cắt nào được cung cấp thì các ô cho Lát Overall sẽ được sử dụng.

Trong ví dụ dưới đây, chúng tôi đang hiển thị các lô CalibrationPlotConfusionMatrixPlot đã được tính toán cho phần 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…

Theo dõi hiệu suất mô hình theo thời gian

Tập dữ liệu đào tạo của bạn sẽ được sử dụng để đào tạo mô hình của bạn và hy vọng sẽ là đại diện cho tập dữ liệu thử nghiệm của bạn và dữ liệu sẽ được gửi đến mô hình của bạn trong quá trình sản xuất. Tuy nhiên, trong khi dữ liệu trong các yêu cầu suy luận có thể vẫn giống như dữ liệu đào tạo của bạn, trong nhiều trường hợp, nó sẽ bắt đầu thay đổi đủ để hiệu suất của mô hình của bạn sẽ thay đổi.

Điều đó có nghĩa là bạn cần theo dõi và đo lường hiệu suất mô hình của mình liên tục, để bạn có thể nhận thức và phản ứng với các thay đổi. Hãy xem TFMA có thể trợ giúp như thế nào.

Hãy tải 3 lần chạy mô hình khác nhau và sử dụng TFMA để xem chúng so sánh như thế nào bằng cách sử dụng 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:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

Trước tiên, chúng ta hãy tưởng tượng rằng chúng ta đã đào tạo và triển khai mô hình của mình ngày hôm qua, và bây giờ chúng ta muốn xem nó hoạt động như thế nào trên dữ liệu mới có trong ngày hôm nay. Quá trình hiển thị sẽ bắt đầu bằng cách hiển thị AUC. Từ giao diện người dùng, bạn có thể:

  • Thêm các chỉ số khác bằng menu "Thêm chuỗi số liệu".
  • Đóng các biểu đồ không mong muốn bằng cách nhấp vào x
  • Di chuột qua các điểm dữ liệu (cuối các đoạn thẳng trong biểu đồ) để biết thêm chi tiết
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…

Bây giờ chúng ta sẽ tưởng tượng rằng một ngày nữa đã trôi qua và chúng ta muốn xem nó hoạt động như thế nào trên dữ liệu mới có trong ngày hôm nay, so với hai ngày trước:

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…

Mẫu chính thức

TFMA có thể được cấu hình để đánh giá nhiều mô hình cùng một lúc. Thông thường, điều này được thực hiện để so sánh một mô hình mới với đường cơ sở (chẳng hạn như mô hình hiện đang phân phối) để xác định sự khác biệt về hiệu suất trong các chỉ số (ví dụ: AUC, v.v.) so với đường cơ sở. Khi các ngưỡng được định cấu hình, tfma.ValidationResult sẽ tạo ra một bản ghi tfma.ValidationResult cho biết liệu hiệu suất có khớp với các lần thực thi hay không.

Hãy cấu hình lại đánh giá keras của chúng tôi để so sánh hai mô hình: một ứng cử viên và một đường cơ sở. Chúng tôi cũng sẽ xác thực hiệu suất của ứng viên so với đường cơ sở bằng cách đặt tmfa.MetricThreshold trên chỉ số 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:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

Khi chạy đánh giá với một hoặc nhiều mô hình so với đường cơ sở, TFMA sẽ tự động thêm các chỉ số khác nhau cho tất cả các chỉ số được tính toán trong quá trình đánh giá. Các chỉ số này được đặt tên theo chỉ số tương ứng nhưng với _diff thêm vào tên chỉ số.

Hãy cùng xem xét các chỉ số do quá trình chạy của chúng tôi tạo ra:

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

Bây giờ chúng ta hãy xem xét đầu ra từ các kiểm tra xác thực của chúng tôi. Để xem kết quả xác thực, chúng tôi sử dụngtfma.load_validator_result . Ví dụ của chúng tôi, việc xác thực không thành công vì AUC thấp hơn ngưỡng.

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