متریک ها و نمودارهای تحلیل مدل تنسورفلو

نمای کلی

TFMA از معیارها و نمودارهای زیر پشتیبانی می کند:

  • معیارهای استاندارد keras ( tf.keras.metrics.* )
    • توجه داشته باشید که برای استفاده از معیارهای keras نیازی به مدل keras ندارید. متریک ها خارج از نمودار در پرتو با استفاده از کلاس های متریک به طور مستقیم محاسبه می شوند.
  • معیارها و نمودارهای استاندارد TFMA ( tfma.metrics.* )

  • معیارهای keras سفارشی (سنجه های مشتق شده از tf.keras.metrics.Metric )

  • معیارهای TFMA سفارشی (سنجه های مشتق شده از tfma.metrics.Metric ) با استفاده از ترکیب کننده های پرتو سفارشی یا معیارهای به دست آمده از معیارهای دیگر).

TFMA همچنین پشتیبانی داخلی را برای تبدیل معیارهای طبقه بندی باینری برای استفاده در مشکلات چند کلاسه/چند برچسبی ارائه می دهد:

  • باینری سازی بر اساس شناسه کلاس، تاپ K و غیره.
  • معیارهای انبوه بر اساس میانگین گیری خرد، میانگین کلان و غیره.

TFMA همچنین پشتیبانی داخلی برای معیارهای مبتنی بر پرس و جو/رتبه‌بندی فراهم می‌کند که در آن نمونه‌ها توسط یک کلید پرس و جو به طور خودکار در خط لوله گروه‌بندی می‌شوند.

در مجموع بیش از 50 متریک استاندارد و نمودار برای انواع مشکلات از جمله رگرسیون، طبقه‌بندی باینری، طبقه‌بندی چند کلاسه/چند برچسبی، رتبه‌بندی و غیره موجود است.

پیکربندی

دو راه برای پیکربندی معیارها در TFMA وجود دارد: (1) با استفاده از tfma.MetricsSpec یا (2) با ایجاد نمونه هایی از tf.keras.metrics.* و/یا tfma.metrics.* در پایتون و استفاده از tfma.metrics.specs_from_metrics برای تبدیل آنها به لیستی از tfma.MetricsSpec .

بخش‌های زیر پیکربندی‌های نمونه برای انواع مختلف مشکلات یادگیری ماشین را توضیح می‌دهند.

معیارهای رگرسیون

در زیر نمونه ای از تنظیمات پیکربندی برای مشکل رگرسیون ارائه شده است. برای معیارهای احتمالی پشتیبانی شده، با ماژول‌های tf.keras.metrics.* و tfma.metrics.* مشورت کنید.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "MeanSquaredError" }
    metrics { class_name: "Accuracy" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics {
      class_name: "CalibrationPlot"
      config: '"min_value": 0, "max_value": 10'
    }
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.MeanSquaredError(name='mse'),
    tf.keras.metrics.Accuracy(name='accuracy'),
    tfma.metrics.MeanLabel(name='mean_label'),
    tfma.metrics.MeanPrediction(name='mean_prediction'),
    tfma.metrics.Calibration(name='calibration'),
    tfma.metrics.CalibrationPlot(
        name='calibration', min_value=0, max_value=10)
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

توجه داشته باشید که این تنظیم با تماس با tfma.metrics.default_regression_specs نیز در دسترس است.

معیارهای طبقه بندی باینری

در زیر نمونه ای از تنظیمات پیکربندی برای یک مشکل طبقه بندی باینری آورده شده است. برای معیارهای احتمالی پشتیبانی شده، با ماژول‌های tf.keras.metrics.* و tfma.metrics.* مشورت کنید.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "ConfusionMatrixPlot" }
    metrics { class_name: "CalibrationPlot" }
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.BinaryCrossentropy(name='binary_crossentropy'),
    tf.keras.metrics.BinaryAccuracy(name='accuracy'),
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    tf.keras.metrics.AUC(
        name='auc_precision_recall', curve='PR', num_thresholds=10000),
    tf.keras.metrics.Precision(name='precision'),
    tf.keras.metrics.Recall(name='recall'),
    tfma.metrics.MeanLabel(name='mean_label'),
    tfma.metrics.MeanPrediction(name='mean_prediction'),
    tfma.metrics.Calibration(name='calibration'),
    tfma.metrics.ConfusionMatrixPlot(name='confusion_matrix_plot'),
    tfma.metrics.CalibrationPlot(name='calibration_plot')
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

توجه داشته باشید که این تنظیمات با تماس با tfma.metrics.default_binary_classification_specs نیز در دسترس است.

معیارهای طبقه بندی چند کلاسه/چند برچسب

در زیر نمونه ای از تنظیمات پیکربندی برای یک مشکل طبقه بندی چند کلاسه آورده شده است. برای معیارهای احتمالی پشتیبانی شده، با ماژول‌های tf.keras.metrics.* و tfma.metrics.* مشورت کنید.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "SparseCategoricalCrossentropy" }
    metrics { class_name: "SparseCategoricalAccuracy" }
    metrics { class_name: "Precision" config: '"top_k": 1' }
    metrics { class_name: "Precision" config: '"top_k": 3' }
    metrics { class_name: "Recall" config: '"top_k": 1' }
    metrics { class_name: "Recall" config: '"top_k": 3' }
    metrics { class_name: "MultiClassConfusionMatrixPlot" }
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.SparseCategoricalCrossentropy(
        name='sparse_categorical_crossentropy'),
    tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'),
    tf.keras.metrics.Precision(name='precision', top_k=1),
    tf.keras.metrics.Precision(name='precision', top_k=3),
    tf.keras.metrics.Recall(name='recall', top_k=1),
    tf.keras.metrics.Recall(name='recall', top_k=3),
    tfma.metrics.MultiClassConfusionMatrixPlot(
        name='multi_class_confusion_matrix_plot'),
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

توجه داشته باشید که این تنظیم با تماس با tfma.metrics.default_multi_class_classification_specs نیز در دسترس است.

معیارهای باینریزه چند کلاسه/چند برچسب

معیارهای چند کلاسه/چند برچسبی را می توان با استفاده از tfma.BinarizationOptions برای تولید معیارهای هر کلاس، در top_k و غیره باینریزه کرد. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    binarize: { class_ids: { values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } }
    // Metrics to binarize
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    // Metrics to binarize
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, binarize=tfma.BinarizationOptions(
        class_ids={'values': [0,1,2,3,4,5,6,7,8,9]}))

معیارهای جمع چند کلاسه/چند برچسب

با استفاده از tfma.AggregationOptions معیارهای چند کلاسه/چند برچسبی را می توان برای تولید یک مقدار تجمیع شده برای یک متریک طبقه بندی باینری جمع کرد.

توجه داشته باشید که تنظیمات تجمیع مستقل از تنظیمات باینری‌سازی هستند، بنابراین می‌توانید همزمان از tfma.AggregationOptions و tfma.BinarizationOptions استفاده کنید.

میانگین میکرو

میانگین گیری میکرو را می توان با استفاده از گزینه micro_average در tfma.AggregationOptions انجام داد. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: { micro_average: true }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, aggregate=tfma.AggregationOptions(micro_average=True))

میانگین‌گیری میکرو همچنین از تنظیم top_k پشتیبانی می‌کند که در آن فقط مقادیر k بالا در محاسبات استفاده می‌شوند. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      micro_average: true
      top_k_list: { values: [1, 3] }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(micro_average=True,
                                      top_k_list={'values': [1, 3]}))

کلان / میانگین کلان وزنی

میانگین‌گیری کلان را می‌توان با استفاده از گزینه‌های macro_average یا weighted_macro_average در tfma.AggregationOptions انجام داد. مگر اینکه از تنظیمات top_k استفاده شود، ماکرو نیاز به تنظیم class_weights دارد تا بداند میانگین برای کدام کلاس‌ها محاسبه شود. اگر class_weight ارائه نشده باشد، 0.0 در نظر گرفته می شود. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      macro_average: true
      class_weights: { key: 0 value: 1.0 }
      class_weights: { key: 1 value: 1.0 }
      class_weights: { key: 2 value: 1.0 }
      class_weights: { key: 3 value: 1.0 }
      class_weights: { key: 4 value: 1.0 }
      class_weights: { key: 5 value: 1.0 }
      class_weights: { key: 6 value: 1.0 }
      class_weights: { key: 7 value: 1.0 }
      class_weights: { key: 8 value: 1.0 }
      class_weights: { key: 9 value: 1.0 }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(
        macro_average=True, class_weights={i: 1.0 for i in range(10)}))

مانند میانگین گیری میکرو، میانگین کلان نیز از تنظیم top_k پشتیبانی می کند که در آن فقط مقادیر k بالا در محاسبه استفاده می شود. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      macro_average: true
      top_k_list: { values: [1, 3] }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(macro_average=True,
                                      top_k_list={'values': [1, 3]}))

معیارهای مبتنی بر پرس و جو / رتبه بندی

معیارهای مبتنی بر پرس و جو/رتبه‌بندی با مشخص کردن گزینه query_key در مشخصات معیارها فعال می‌شوند. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    query_key: "doc_id"
    metrics {
      class_name: "NDCG"
      config: '"gain_key": "gain", "top_k_list": [1, 2]'
    }
    metrics { class_name: "MinLabelPosition" }
  }
""", tfma.EvalConfig()).metrics_specs

همین تنظیمات را می توان با استفاده از کد پایتون زیر ایجاد کرد:

metrics = [
    tfma.metrics.NDCG(name='ndcg', gain_key='gain', top_k_list=[1, 2]),
    tfma.metrics.MinLabelPosition(name='min_label_position')
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics, query_key='doc_id')

معیارهای ارزیابی چند مدلی

TFMA از ارزیابی چندین مدل به طور همزمان پشتیبانی می کند. هنگامی که ارزیابی چند مدل انجام می شود، معیارها برای هر مدل محاسبه می شود. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    # no model_names means all models
    ...
  }
""", tfma.EvalConfig()).metrics_specs

اگر لازم است معیارها برای زیرمجموعه‌ای از مدل‌ها محاسبه شوند، model_names در metric_specs تنظیم کنید. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    model_names: ["my-model1"]
    ...
  }
""", tfma.EvalConfig()).metrics_specs

specs_from_metrics API همچنین از عبور نام مدل ها پشتیبانی می کند:

metrics = [
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, model_names=['my-model1'])

معیارهای مقایسه مدل

TFMA از ارزیابی معیارهای مقایسه برای یک مدل کاندید در برابر یک مدل پایه پشتیبانی می کند. یک راه ساده برای راه‌اندازی جفت مدل کاندید و پایه این است که یک eval_shared_model با نام‌های مدل مناسب (tfma.BASELINE_KEY و tfma.CANDIDATE_KEY) عبور دهید:


eval_config = text_format.Parse("""
  model_specs {
    # ... model_spec without names ...
  }
  metrics_spec {
    # ... metrics ...
  }
""", tfma.EvalConfig())

eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path='/path/to/saved/candidate/model',
      eval_config=eval_config),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path='/path/to/saved/baseline/model',
      eval_config=eval_config),
]

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

معیارهای مقایسه به طور خودکار برای همه معیارهای قابل تغییر محاسبه می شوند (در حال حاضر فقط معیارهای ارزش اسکالر مانند دقت و AUC).

معیارهای مدل چند خروجی

TFMA از ارزیابی معیارها در مدل هایی که خروجی های متفاوتی دارند پشتیبانی می کند. مدل‌های چند خروجی پیش‌بینی‌های خروجی خود را در قالب یک دیکت که با نام خروجی کلید می‌خورد ذخیره می‌کنند. هنگامی که از مدل های چند خروجی استفاده می شود، نام خروجی های مرتبط با مجموعه ای از معیارها باید در بخش output_names MetricsSpec مشخص شود. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    output_names: ["my-output"]
    ...
  }
""", tfma.EvalConfig()).metrics_specs

specs_from_metrics API از نام‌های خروجی نیز پشتیبانی می‌کند:

metrics = [
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, output_names=['my-output'])

سفارشی کردن تنظیمات متریک

TFMA اجازه می دهد تا تنظیماتی را که با معیارهای مختلف استفاده می شود، سفارشی کنید. به عنوان مثال ممکن است بخواهید نام را تغییر دهید، آستانه ها را تنظیم کنید، و غیره. این کار با افزودن یک بخش config به پیکربندی متریک انجام می شود. پیکربندی با استفاده از نسخه رشته JSON پارامترهایی که به روش متریک __init__ ارسال می‌شوند، مشخص می‌شود (برای سهولت استفاده، براکت‌های «{» و «}» پیشرو و انتهایی حذف می‌شوند). به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics {
      class_name: "ConfusionMatrixAtThresholds"
      config: '"thresholds": [0.3, 0.5, 0.8]'
    }
  }
""", tfma.MetricsSpec()).metrics_specs

این سفارشی سازی البته مستقیماً نیز پشتیبانی می شود:

metrics = [
   tfma.metrics.ConfusionMatrixAtThresholds(thresholds=[0.3, 0.5, 0.8]),
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

خروجی ها

خروجی ارزیابی متریک مجموعه ای از کلیدها/مقدارهای متریک و/یا کلیدها/مقدارهای نمودار بر اساس پیکربندی استفاده شده است.

کلیدهای متریک

MetricKeyها با استفاده از یک نوع کلید ساختاریافته تعریف می شوند. این کلید به طور منحصر به فرد هر یک از جنبه های زیر یک متریک را شناسایی می کند:

  • نام متریک ( auc ، mean_label ، و غیره)
  • نام مدل (فقط در صورت ارزیابی چند مدل استفاده می شود)
  • نام خروجی (فقط در صورتی استفاده می شود که مدل های چند خروجی ارزیابی شوند)
  • کلید فرعی (مثلاً شناسه کلاس اگر مدل چند کلاسه باینریزه شود)

ارزش متریک

MetricValues ​​با استفاده از پروتویی تعریف می‌شوند که انواع مقادیر مختلف را که توسط معیارهای مختلف پشتیبانی می‌شوند (مانند double ، ConfusionMatrixAtThresholds و غیره) را در بر می‌گیرد.

در زیر انواع مقادیر متریک پشتیبانی شده وجود دارد:

  • double_value - یک لفاف برای یک نوع دوتایی.
  • bytes_value - یک مقدار بایت.
  • bounded_value - یک مقدار واقعی را نشان می دهد که می تواند یک تخمین نقطه ای باشد، به صورت اختیاری با نوعی کران تقریبی. دارای value خصوصیات، lower_bound و upper_bound است.
  • value_at_cutoffs - ارزش در برش (مثلا precision@K، recall@K). دارای values دارایی است که هر کدام دارای cutoff و value خاصیت هستند.
  • confusion_matrix_at_thresholds - ماتریس سردرگمی در آستانه ها. دارای matrices خاصیت است که هر کدام دارای خواص threshold ، precision ، recall و مقادیر ماتریس سردرگمی مانند false_negatives هستند.
  • array_value - برای معیارهایی که آرایه ای از مقادیر را برمی گرداند.

کلیدهای طرح

PlotKeyها شبیه کلیدهای متریک هستند با این تفاوت که به دلایل تاریخی همه مقادیر نمودارها در یک پروتو ذخیره می شوند، بنابراین کلید نمودار نامی ندارد.

ارزش های طرح

تمام نمودارهای پشتیبانی شده در یک پروتو واحد به نام PlotData ذخیره می شوند.

EvalResult

بازگشت از اجرای ارزیابی یک tfma.EvalResult است. این رکورد حاوی slicing_metrics است که کلید متریک را به عنوان یک دستور چند سطحی رمزگذاری می کند که در آن سطوح به ترتیب با نام خروجی، شناسه کلاس، نام متریک و مقدار متریک مطابقت دارند. این برای نمایش رابط کاربری در نوت بوک Jupiter در نظر گرفته شده است. اگر دسترسی به داده های اساسی مورد نیاز است، باید به جای آن از فایل نتایج metrics استفاده شود (به metrics_for_slice.proto مراجعه کنید).

سفارشی سازی

علاوه بر معیارهای سفارشی که به عنوان بخشی از یک keras ذخیره شده (یا EvalSavedModel قدیمی) اضافه می شوند. دو راه برای سفارشی کردن معیارها در ذخیره پست TFMA وجود دارد: (1) با تعریف یک کلاس متریک keras سفارشی و (2) با تعریف یک کلاس متریک TFMA سفارشی که توسط یک ترکیب کننده پرتو پشتیبانی می شود.

در هر دو مورد، معیارها با تعیین نام کلاس متریک و ماژول مرتبط پیکربندی می‌شوند. به عنوان مثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "MyMetric" module: "my.module"}
  }
""", tfma.EvalConfig()).metrics_specs

متریک Keras سفارشی

برای ایجاد یک معیار keras سفارشی، کاربران باید tf.keras.metrics.Metric با پیاده سازی خود گسترش دهند و سپس مطمئن شوند که ماژول متریک در زمان ارزیابی در دسترس است.

توجه داشته باشید که برای معیارهایی که ذخیره مدل پست اضافه شده است، TFMA تنها از معیارهایی پشتیبانی می‌کند که برچسب (یعنی y_true)، پیش‌بینی (y_pred) و وزن نمونه (sample_weight) را به عنوان پارامترهای متد update_state می‌گیرند.

مثال متریک کراس

نمونه زیر نمونه ای از متریک کراس سفارشی است:

class MyMetric(tf.keras.metrics.Mean):

  def __init__(self, name='my_metric', dtype=None):
    super(MyMetric, self).__init__(name=name, dtype=dtype)

  def update_state(self, y_true, y_pred, sample_weight=None):
    return super(MyMetric, self).update_state(
        y_pred, sample_weight=sample_weight)

معیارهای TFMA سفارشی

برای ایجاد یک متریک TFMA سفارشی، کاربران باید tfma.metrics.Metric با پیاده سازی خود گسترش دهند و سپس مطمئن شوند که ماژول متریک در زمان ارزیابی در دسترس است.

متریک

پیاده سازی tfma.metrics.Metric از مجموعه ای از کوارگ ها تشکیل شده است که پیکربندی متریک را به همراه تابعی برای ایجاد محاسبات (احتمالاً چندگانه) مورد نیاز برای محاسبه مقدار متریک ها تعریف می کند. دو نوع محاسبات اصلی وجود دارد که می توان از آنها استفاده کرد: tfma.metrics.MetricComputation و tfma.metrics.DerivedMetricComputation که در بخش های زیر توضیح داده شده است. تابعی که این محاسبات را ایجاد می کند، پارامترهای زیر را به عنوان ورودی ارسال می کند:

  • eval_config: tfam.EvalConfig
    • پیکربندی eval به ارزیاب منتقل شد (برای جستجوی تنظیمات مشخصات مدل مانند کلید پیش‌بینی برای استفاده و غیره مفید است).
  • model_names: List[Text]
    • فهرست نام‌های مدل برای محاسبه معیارها (هیچ مدل اگر تک مدل باشد)
  • output_names: List[Text] .
    • فهرست نام‌های خروجی برای محاسبه سنجه‌ها (اگر تک مدلی نباشد)
  • sub_keys: List[tfma.SubKey] .
    • فهرست کلیدهای فرعی (شناسه کلاس، K بالا، و غیره) برای محاسبه معیارها برای (یا هیچکدام)
  • aggregation_type: tfma.AggregationType
    • نوع تجمع در صورت محاسبه یک متریک تجمع.
  • class_weights: Dict[int, float] .
    • وزن‌های کلاس برای استفاده در صورت محاسبه متریک تجمیع.
  • query_key: Text
    • برای محاسبه معیارهای مبتنی بر جستار/رتبه‌بندی از کلید پرس و جو استفاده می‌شود.

اگر معیاری با یک یا چند مورد از این تنظیمات مرتبط نباشد، ممکن است آن پارامترها را از تعریف امضای خود خارج کند.

اگر یک متریک برای هر مدل، خروجی و کلید فرعی به طور یکسان محاسبه شود، می توان از ابزار tfma.metrics.merge_per_key_computations برای انجام محاسبات یکسان برای هر یک از این ورودی ها به طور جداگانه استفاده کرد.

محاسبه متریک

MetricComputation از ترکیبی از preprocessors و یک combiner تشکیل شده است. preprocessors لیستی از preprocessor است که یک beam.DoFn است.DoFn است که عصاره ها را به عنوان ورودی می گیرد و حالت اولیه ای را که توسط ترکیب کننده استفاده می شود را خروجی می دهد (برای اطلاعات بیشتر در مورد عصاره ها به معماری مراجعه کنید). همه پیش پردازنده ها به ترتیب به ترتیب لیست اجرا می شوند. اگر preprocessors خالی باشد، ترکیب کننده به StandardMetricInputs منتقل می‌شود (ورودی‌های متریک استاندارد حاوی برچسب‌ها، پیش‌بینی‌ها و example_weights هستند). combiner یک beam.CombineFn است.CombineFn که یک تاپیک از (کلید برش، خروجی پیش پردازنده) را به عنوان ورودی خود می گیرد و چند تایی از (slice_key، نتایج متریک dict) را به عنوان نتیجه خروجی می دهد.

توجه داشته باشید که برش بین preprocessors و combiner اتفاق می افتد.

توجه داشته باشید که اگر یک محاسبات متریک بخواهد از هر دو ورودی متریک استاندارد استفاده کند، اما آن را با تعدادی از ویژگی‌های استخراج features تقویت کند، می‌توان از FeaturePreprocessor ویژه استفاده کرد که ویژگی‌های درخواستی را از چندین ترکیب کننده در یک واحد ادغام می‌کند. مقدار مشترک StandardMetricsInputs که به همه ترکیب‌کننده‌ها ارسال می‌شود (ترکیب‌کننده‌ها مسئول خواندن ویژگی‌هایی هستند که به آنها علاقه‌مند هستند و بقیه را نادیده می‌گیرند).

مثال

مثال زیر یک مثال بسیار ساده از تعریف متریک TFMA برای محاسبه ExampleCount است:

class ExampleCount(tfma.metrics.Metric):

  def __init__(self, name: Text = 'example_count'):
    super(ExampleCount, self).__init__(_example_count, name=name)


def _example_count(
    name: Text = 'example_count') -> tfma.metrics.MetricComputations:
  key = tfma.metrics.MetricKey(name=name)
  return [
      tfma.metrics.MetricComputation(
          keys=[key],
          preprocessors=[_ExampleCountPreprocessor()],
          combiner=_ExampleCountCombiner(key))
  ]


class ExampleCountTest(tfma.test.testutil.TensorflowModelAnalysisTest):

  def testExampleCount(self):
    metric = ExampleCount()
    computations = metric.computations(example_weighted=False)
    computation = computations[0]

    with beam.Pipeline() as pipeline:
      result = (
          pipeline
          | 'Create' >> beam.Create([...])  # Add inputs
          | 'PreProcess' >> beam.ParDo(computation.preprocessors[0])
          | 'Process' >> beam.Map(tfma.metrics.to_standard_metric_inputs)
          | 'AddSlice' >> beam.Map(lambda x: ((), x))
          | 'ComputeMetric' >> beam.CombinePerKey(computation.combiner)
      )

      def check_result(got):
        try:
          self.assertLen(got, 1)
          got_slice_key, got_metrics = got[0]
          self.assertEqual(got_slice_key, ())
          key = computation.keys[0]
          self.assertIn(key, got_metrics)
          self.assertAlmostEqual(got_metrics[key], expected_value, places=5)
        except AssertionError as err:
          raise util.BeamAssertException(err)

      util.assert_that(result, check_result, label='result')

class _ExampleCountPreprocessor(beam.DoFn):

  def process(self, extracts: tfma.Extracts) -> Iterable[int]:
    yield 1


class _ExampleCountPreprocessorTest(unittest.TestCase):

  def testExampleCountPreprocessor(self):
    ...  # Init the test case here
    with beam.Pipeline() as pipeline:
      updated_pcoll = (
          pipeline
          | 'Create' >> beam.Create([...])  # Add inputs
          | 'Preprocess'
          >> beam.ParDo(
              _ExampleCountPreprocessor()
          )
      )

      beam_testing_util.assert_that(
          updated_pcoll,
          lambda result: ...,  # Assert the test case
      )


class _ExampleCountCombiner(beam.CombineFn):

  def __init__(self, metric_key: tfma.metrics.MetricKey):
    self._metric_key = metric_key

  def create_accumulator(self) -> int:
    return 0

  def add_input(self, accumulator: int, state: int) -> int:
    return accumulator + state

  def merge_accumulators(self, accumulators: Iterable[int]) -> int:
    accumulators = iter(accumulators)
    result = next(accumulator)
    for accumulator in accumulators:
      result += accumulator
    return result

  def extract_output(self,
                     accumulator: int) -> Dict[tfma.metrics.MetricKey, int]:
    return {self._metric_key: accumulator}

محاسبه متریک مشتق شده

یک DerivedMetricComputation از یک تابع نتیجه تشکیل شده است که برای محاسبه مقادیر متریک بر اساس خروجی سایر محاسبات متریک استفاده می شود. تابع نتیجه دیکتی از مقادیر محاسبه شده را به عنوان ورودی خود می گیرد و دیکته ای از نتایج متریک اضافی را خروجی می کند.

توجه داشته باشید که گنجاندن محاسباتی که یک محاسبات مشتق شده به آنها وابسته است در فهرست محاسبات ایجاد شده توسط یک متریک قابل قبول است (توصیه می شود). با این کار مجبور نیستید محاسباتی را که بین چندین معیار مشترک به اشتراک گذاشته شده اند، از قبل ایجاد و ارسال کنید. ارزیاب به طور خودکار محاسباتی را که تعریف یکسانی دارند حذف می کند تا یک محاسبات در واقع اجرا شود.

مثال

معیارهای TJUR نمونه خوبی از معیارهای مشتق شده است.