ภาพรวม
TFMA รองรับตัวชี้วัดและแปลงต่อไปนี้:
- เมตริก keras มาตรฐาน (
tf.keras.metrics.*
)- โปรดทราบว่าคุณไม่จำเป็นต้องมีโมเดล keras เพื่อใช้เมตริก keras การวัดจะถูกคำนวณนอกกราฟในลำแสงโดยใช้คลาสการวัดโดยตรง
ตัวชี้วัดและแปลง TFMA มาตรฐาน (
tfma.metrics.*
)เมตริก keras ที่กำหนดเอง (เมตริกที่ได้มาจาก
tf.keras.metrics.Metric
)ตัววัด TFMA แบบกำหนดเอง (ตัววัดที่ได้มาจาก
tfma.metrics.Metric
) โดยใช้ตัวรวมลำแสงแบบกำหนดเองหรือตัววัดที่ได้มาจากตัววัดอื่น)
TFMA ยังให้การสนับสนุนในตัวสำหรับการแปลงหน่วยเมตริกการจำแนกประเภทไบนารีเพื่อใช้กับปัญหาแบบหลายคลาส/หลายป้ายกำกับ:
- ไบนารี่ตาม ID คลาส, K สูงสุด ฯลฯ
- ตัวชี้วัดแบบรวมขึ้นอยู่กับค่าเฉลี่ยระดับจุลภาค ค่าเฉลี่ยมหภาค ฯลฯ
TFMA ยังให้การสนับสนุนในตัวสำหรับการวัดตามการสืบค้น/การจัดอันดับ โดยที่ตัวอย่างจะถูกจัดกลุ่มตามคีย์การสืบค้นโดยอัตโนมัติในไปป์ไลน์
เมื่อรวมกันแล้วจะมีเมตริกและพล็อตมาตรฐานมากกว่า 50 รายการสำหรับปัญหาต่างๆ รวมถึงการถดถอย การจำแนกไบนารี การจัดหมวดหมู่แบบหลายคลาส/หลายป้ายกำกับ การจัดอันดับ ฯลฯ
การกำหนดค่า
มีสองวิธีในการกำหนดค่าตัววัดใน TFMA: (1) การใช้ tfma.MetricsSpec
หรือ (2) โดยการสร้างอินสแตนซ์ของคลาส tf.keras.metrics.*
และ/หรือ tfma.metrics.*
ใน python และการใช้ 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
เมตริกไบนารี่แบบหลายคลาส/หลายป้ายกำกับ
เมตริกแบบหลายคลาส/หลายป้ายกำกับสามารถไบนารี่เพื่อสร้างเมตริกต่อคลาส ต่อ top_k ฯลฯ โดยใช้ tfma.BinarizationOptions
ตัวอย่างเช่น:
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
มาโครจำเป็นต้องตั้ง class_weights
เว้นแต่ว่าจะใช้การตั้งค่า top_k
เพื่อทราบว่าจะต้องคำนวณค่าเฉลี่ยของคลาสใด หากไม่ได้ระบุ 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 รองรับการประเมินหน่วยเมตริกในโมเดลที่มีเอาต์พุตต่างกัน โมเดลหลายเอาต์พุตจัดเก็บการทำนายเอาต์พุตในรูปแบบของ dict ที่คีย์ตามชื่อเอาต์พุต เมื่อใช้โมเดลหลายเอาต์พุต จะต้องระบุชื่อของเอาต์พุตที่เกี่ยวข้องกับชุดเมทริกในส่วน 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)
เอาท์พุต
ผลลัพธ์ของการประเมินหน่วยเมตริกคือชุดของคีย์/ค่าเมตริก และ/หรือคีย์/ค่าพล็อตตามการกำหนดค่าที่ใช้
คีย์เมตริก
MetricKeys ถูกกำหนดโดยใช้ประเภทคีย์ที่มีโครงสร้าง คีย์นี้จะระบุแต่ละแง่มุมของเมตริกโดยไม่ซ้ำกัน:
- ชื่อตัวชี้วัด (
auc
,mean_label
ฯลฯ ) - ชื่อรุ่น (ใช้เฉพาะในกรณีที่การประเมินหลายรุ่น)
- ชื่อเอาต์พุต (ใช้เฉพาะเมื่อมีการประเมินโมเดลหลายเอาต์พุต)
- คีย์ย่อย (เช่น ID คลาส หากโมเดลหลายคลาสถูกไบนาไรซ์)
ค่าเมตริก
MetricValues ถูกกำหนดโดยใช้โปรโตที่สรุปประเภทค่าต่างๆ ที่เมตริกต่างๆ รองรับ (เช่น double
, ConfusionMatrixAtThresholds
ฯลฯ)
ด้านล่างนี้คือประเภทค่าเมตริกที่รองรับ:
-
double_value
- กระดาษห่อสำหรับประเภทคู่ -
bytes_value
- ค่าไบต์ -
bounded_value
- แสดงถึงมูลค่าจริงซึ่งอาจเป็นการประมาณการแบบจุด หรือมีขอบเขตโดยประมาณบางประเภทหรือไม่ก็ได้ มีvalue
คุณสมบัติ ,lower_bound
และupper_bound
-
value_at_cutoffs
- ค่าที่จุดตัด (เช่น precision@K,call@K) มีvalues
คุณสมบัติ ซึ่งแต่ละค่ามีคุณสมบัติcutoff
และvalue
-
confusion_matrix_at_thresholds
- เมทริกซ์ความสับสนที่เกณฑ์ มีmatrices
คุณสมบัติ ซึ่งแต่ละรายการมีคุณสมบัติสำหรับค่าเมทริกซ์threshold
precision
recall
และความสับสน เช่นfalse_negatives
-
array_value
- สำหรับหน่วยเมตริกที่ส่งคืนอาร์เรย์ของค่า
พล็อตคีย์
PlotKeys คล้ายกับคีย์เมตริก ยกเว้นว่าด้วยเหตุผลทางประวัติศาสตร์ ค่าของพล็อตทั้งหมดจะถูกเก็บไว้ในโปรโตเดียว ดังนั้นคีย์พล็อตจึงไม่มีชื่อ
ค่าพล็อต
แปลงที่รองรับทั้งหมดจะถูกเก็บไว้ในโปรโตเดียวที่เรียกว่า PlotData
ผลการประเมิน
การส่งคืนจากการรันการประเมินคือ tfma.EvalResult
เรกคอร์ดนี้มี slicing_metrics
ที่เข้ารหัสคีย์เมทริกเป็น dict หลายระดับ โดยที่ระดับสอดคล้องกับชื่อเอาต์พุต ID คลาส ชื่อเมทริก และค่าเมทริกตามลำดับ สิ่งนี้มีวัตถุประสงค์เพื่อใช้สำหรับการแสดง UI ในโน้ตบุ๊ก 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
ตัวอย่างเมตริก Keras
ต่อไปนี้เป็นตัวอย่างของตัววัด keras แบบกำหนดเอง:
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
ประกอบด้วยชุด kwargs ที่กำหนดการกำหนดค่าหน่วยเมตริก พร้อมด้วยฟังก์ชันสำหรับสร้างการคำนวณ (อาจมีหลายรายการ) ที่จำเป็นในการคำนวณค่าหน่วยเมตริก มีสองประเภทการคำนวณหลักที่สามารถใช้ได้: tfma.metrics.MetricComputation
และ tfma.metrics.DerivedMetricComputation
ที่อธิบายไว้ในส่วนด้านล่าง ฟังก์ชันที่สร้างการคำนวณเหล่านี้จะถูกส่งผ่านพารามิเตอร์ต่อไปนี้เป็นอินพุต:
-
eval_config: tfam.EvalConfig
- การกำหนดค่า eval ที่ส่งผ่านไปยังผู้ประเมิน (มีประโยชน์สำหรับการค้นหาการตั้งค่าข้อมูลจำเพาะของโมเดล เช่น คีย์การคาดการณ์ที่จะใช้ ฯลฯ)
-
model_names: List[Text]
- รายการชื่อรุ่นที่จะคำนวณเมตริกสำหรับ (ไม่มีหากเป็นรุ่นเดียว)
-
output_names: List[Text]
- รายการชื่อเอาต์พุตที่จะคำนวณเมทริกสำหรับ (ไม่มีหากเป็นรุ่นเดียว)
-
sub_keys: List[tfma.SubKey]
- รายการคีย์ย่อย (ID คลาส, 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
ที่รับ tuple ของ (slice key, เอาต์พุตตัวประมวลผลล่วงหน้า) เป็นอินพุต และเอาต์พุต tuple ของ (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 เป็นตัวอย่างที่ดีของเมทริกที่ได้รับ