Phân tích mô hình Tensorflow Câu hỏi thường gặp

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Chung

Có cần phải có EvalSavedModel không?

TFMA trước đây yêu cầu tất cả các chỉ số phải được lưu trữ trong biểu đồ tensorflow bằng cách sử dụng EvalSavedModel đặc biệt. Giờ đây, các chỉ số có thể được tính toán bên ngoài biểu đồ TF bằng cách sử dụng triển khai beam.CombineFn .

Một số khác biệt chính là:

  • EvalSavedModel yêu cầu xuất đặc biệt từ trình đào tạo trong khi mô hình phục vụ có thể được sử dụng mà không cần bất kỳ thay đổi nào đối với mã đào tạo.
  • Khi EvalSavedModel được sử dụng, mọi chỉ số được thêm vào thời gian đào tạo sẽ tự động có sẵn tại thời điểm đánh giá. Nếu không có EvalSavedModel các chỉ số này phải được thêm lại.
    • Ngoại lệ đối với quy tắc này là nếu mô hình keras được sử dụng, các chỉ số cũng có thể được thêm tự động vì keras lưu thông tin chỉ số dọc theo mô hình đã lưu.

TFMA có thể hoạt động với cả chỉ số trong biểu đồ và chỉ số bên ngoài không?

TFMA cho phép sử dụng một phương pháp kết hợp trong đó một số chỉ số có thể được tính toán trong biểu đồ trong khi các chỉ số khác có thể được tính toán bên ngoài. Nếu bạn hiện có EvalSavedModel thì bạn có thể tiếp tục sử dụng nó.

Có hai trường hợp:

  1. Sử dụng EvalSavedModel cho cả trích xuất tính năng và tính toán số liệu nhưng cũng thêm các chỉ số dựa trên kết hợp bổ sung. Trong trường hợp này, bạn sẽ nhận được tất cả các số liệu trong biểu đồ từ EvalSavedModel cùng với bất kỳ số liệu bổ sung nào từ bộ kết hợp có thể chưa được hỗ trợ trước đây.
  2. Sử dụng EvalSavedModel để trích xuất tính năng / dự đoán nhưng sử dụng số liệu dựa trên kết hợp cho tất cả các phép tính số liệu. Chế độ này hữu ích nếu có các chuyển đổi tính năng hiện diện trong EvalSavedModel mà bạn muốn sử dụng để cắt, nhưng muốn thực hiện tất cả các phép tính số liệu bên ngoài biểu đồ.

Thành lập

Những loại mô hình nào được hỗ trợ?

TFMA hỗ trợ các mô hình keras, các mô hình dựa trên API chữ ký TF2 chung, cũng như các mô hình dựa trên công cụ ước tính TF (mặc dù tùy thuộc vào trường hợp sử dụng, các mô hình dựa trên công cụ ước tính có thể yêu cầu EvalSavedModel ).

Xem hướng dẫn get_started để biết danh sách đầy đủ các loại mô hình được hỗ trợ và bất kỳ hạn chế nào.

Làm cách nào để thiết lập TFMA để hoạt động với mô hình dựa trên keras gốc?

Sau đây là một cấu hình ví dụ cho một mô hình keras dựa trên các giả định sau:

  • Mô hình đã lưu là để phục vụ và sử dụng tên chữ ký serving_default (điều này có thể được thay đổi bằng cách sử dụng model_specs[0].signature_name ).
  • Các chỉ số được tạo sẵn từ model.compile(...) phải được đánh giá (điều này có thể bị tắt thông qua options.include_default_metric trong tfma.EvalConfig ).
from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here. For example:
    #  metrics { class_name: "ConfusionMatrixPlot" }
    #  metrics { class_name: "CalibrationPlot" }
  }
  slicing_specs {}
""", tfma.EvalConfig())

Xem chỉ số để biết thêm thông tin về các loại chỉ số khác có thể được định cấu hình.

Làm cách nào để thiết lập TFMA để hoạt động với mô hình dựa trên chữ ký TF2 chung?

Sau đây là một cấu hình ví dụ cho một mô hình TF2 chung. Dưới đây, signature_name là tên của chữ ký cụ thể sẽ được sử dụng để đánh giá.

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "<signature-name>"
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here. For example:
    #  metrics { class_name: "BinaryCrossentropy" }
    #  metrics { class_name: "ConfusionMatrixPlot" }
    #  metrics { class_name: "CalibrationPlot" }
  }
  slicing_specs {}
""", tfma.EvalConfig())

Xem chỉ số để biết thêm thông tin về các loại chỉ số khác có thể được định cấu hình.

Làm cách nào để thiết lập TFMA để hoạt động với mô hình dựa trên công cụ ước tính?

Trong trường hợp này có ba sự lựa chọn.

Tùy chọn 1: Sử dụng Mô hình Phục vụ

Nếu tùy chọn này được sử dụng thì bất kỳ chỉ số nào được thêm vào trong quá trình đào tạo sẽ KHÔNG được đưa vào đánh giá.

Sau đây là một cấu hình ví dụ giả sử serving_default là tên chữ ký được sử dụng:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Xem chỉ số để biết thêm thông tin về các loại chỉ số khác có thể được định cấu hình.

Tùy chọn 2: Sử dụng EvalSavedModel cùng với các chỉ số dựa trên kết hợp bổ sung

Trong trường hợp này, hãy sử dụng EvalSavedModel cho cả trích xuất và đánh giá tính năng / dự đoán và cũng thêm các chỉ số dựa trên kết hợp bổ sung.

Sau đây là một cấu hình ví dụ:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Xem số liệu để biết thêm thông tin về các loại số liệu khác có thể được định cấu hình và EvalSavedModel để biết thêm thông tin về cách thiết lập EvalSavedModel.

Tùy chọn 3: Chỉ sử dụng Mô hình EvalSavedModel để trích xuất Tính năng / Dự đoán

Tương tự như tùy chọn (2), nhưng chỉ sử dụng EvalSavedModel để trích xuất tính năng / dự đoán. Tùy chọn này hữu ích nếu bạn chỉ mong muốn các chỉ số bên ngoài, nhưng có những chuyển đổi tính năng mà bạn muốn tiếp tục. Tương tự như tùy chọn (1) bất kỳ số liệu nào được thêm vào trong quá trình đào tạo sẽ KHÔNG được đưa vào đánh giá.

Trong trường hợp này, cấu hình giống như trên, chỉ có include_default_metrics bị tắt.

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
  options {
    include_default_metrics { value: false }
  }
""", tfma.EvalConfig())

Xem số liệu để biết thêm thông tin về các loại số liệu khác có thể được định cấu hình và EvalSavedModel để biết thêm thông tin về cách thiết lập EvalSavedModel.

Làm cách nào để thiết lập TFMA để hoạt động với mô hình dựa trên mô hình ước tính của keras?

Thiết lập keras model_to_estimator tương tự như kết hợp công cụ ước tính. Tuy nhiên, có một số khác biệt cụ thể về cách hoạt động của mô hình với công cụ ước tính. Cụ thể, model-to-esimtator trả về kết quả đầu ra của nó dưới dạng một lệnh trong đó khóa dict là tên của lớp đầu ra cuối cùng trong mô hình keras được liên kết (nếu không có tên nào được cung cấp, keras sẽ chọn tên mặc định cho bạn chẳng hạn như dense_1 hoặc đầu output_1 ). Từ góc độ TFMA, hành vi này tương tự như những gì sẽ là đầu ra cho một mô hình nhiều đầu ra mặc dù mô hình để ước lượng có thể chỉ dành cho một mô hình duy nhất. Để giải thích cho sự khác biệt này, cần thực hiện thêm một bước để thiết lập tên đầu ra. Tuy nhiên, ba tùy chọn tương tự được áp dụng làm công cụ ước tính.

Sau đây là ví dụ về những thay đổi cần thiết đối với cấu hình dựa trên công cụ ước tính:

from google.protobuf import text_format

config = text_format.Parse("""
  ... as for estimator ...
  metrics_specs {
    output_names: ["<keras-output-layer>"]
    # Add metrics here.
  }
  ... as for estimator ...
""", tfma.EvalConfig())

Làm cách nào để thiết lập TFMA để hoạt động với các dự đoán được tính toán trước (tức là mô hình bất khả tri)? ( TFRecordtf.Example )

Để định cấu hình TFMA hoạt động với các dự đoán được tính toán trước, tfma.PredictExtractor mặc định phải được tắt và tfma.InputExtractor phải được định cấu hình để phân tích cú pháp các dự đoán cùng với các tính năng đầu vào khác. Điều này được thực hiện bằng cách định cấu hình tfma.ModelSpec với tên của khóa tính năng được sử dụng cho các dự đoán cùng với nhãn và trọng số.

Sau đây là một ví dụ thiết lập:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    prediction_key: "<prediction-key>"
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Xem các chỉ số để biết thêm thông tin về các chỉ số có thể được định cấu hình.

Lưu ý rằng thay thế một tfma.ModelSpec đang được định cấu hình, một mô hình không thực sự được sử dụng (tức là không có tfma.EvalSharedModel ). Lời kêu gọi chạy phân tích mô hình có thể trông như sau:

eval_result = tfma.run_model_analysis(
    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/metrics_for_slice_proto")

Làm cách nào để thiết lập TFMA để hoạt động với các dự đoán được tính toán trước (tức là mô hình bất khả tri)? ( pd.DataFrame )

Đối với các tập dữ liệu nhỏ có thể vừa trong bộ nhớ, một giải pháp thay thế cho TFRecordpandas.DataFrame s. TFMA có thể hoạt động trên pandas.DataFrame s bằng cách sử dụng API tfma.analyze_raw_data . Để biết giải thích về tfma.MetricsSpectfma.SlicingSpec , hãy xem hướng dẫn thiết lập . Xem các chỉ số để biết thêm thông tin về các chỉ số có thể được định cấu hình.

Sau đây là một ví dụ thiết lập:

# Run in a Jupyter Notebook.

df_data = ...  # your pd.DataFrame

eval_config = text_format.Parse("""
  model_specs {
    label_key: 'label'
    prediction_key: 'prediction'
  }
  metrics_specs {
    metrics { class_name: "AUC" }
    metrics { class_name: "ConfusionMatrixPlot" }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: 'language'
  }
""", config.EvalConfig())

eval_result = tfma.analyze_raw_data(df_data, eval_config)

tfma.view.render_slicing_metrics(eval_result)

Số liệu

Những loại chỉ số nào được hỗ trợ?

TFMA hỗ trợ nhiều loại chỉ số bao gồm:

Các chỉ số từ các mô hình nhiều đầu ra có được hỗ trợ không?

Đúng. Xem hướng dẫn số liệu để biết thêm chi tiết.

Các chỉ số từ nhiều mô hình có được hỗ trợ không?

Đúng. Xem hướng dẫn số liệu để biết thêm chi tiết.

Có thể tùy chỉnh cài đặt số liệu (tên, v.v.) không?

Đúng. Cài đặt số liệu có thể được tùy chỉnh (ví dụ: đặt các ngưỡng cụ thể, v.v.) bằng cách thêm cài đặt config vào cấu hình số liệu. Xem hướng dẫn số liệu có thêm chi tiết.

Các chỉ số tùy chỉnh có được hỗ trợ không?

Đúng. Bằng cách viết triển khai tf.keras.metrics.Metric tùy chỉnh hoặc bằng cách viết triển khai beam.CombineFn tùy chỉnh. Hướng dẫn số liệu có nhiều chi tiết hơn.

Những loại chỉ số nào không được hỗ trợ?

Miễn là chỉ số của bạn có thể được tính toán bằng beam.CombineFn , không có hạn chế nào đối với các loại chỉ số có thể được tính toán dựa trên tfma.metrics.Metric . Nếu làm việc với một số liệu bắt nguồn từ tf.keras.metrics.Metric thì các tiêu chí sau phải được đáp ứng:

  • Có thể tính toán đủ số liệu thống kê cho số liệu trên từng ví dụ một cách độc lập, sau đó kết hợp các số liệu thống kê đầy đủ này bằng cách thêm chúng vào tất cả các ví dụ và xác định giá trị số liệu chỉ từ các số liệu thống kê đầy đủ này.
  • Ví dụ, về độ chính xác, số liệu thống kê đủ là "tổng số chính xác" và "tổng số ví dụ". Có thể tính toán hai con số này cho các ví dụ riêng lẻ và cộng chúng lại cho một nhóm ví dụ để có được giá trị phù hợp cho các ví dụ đó. Độ chính xác cuối cùng có thể được tính bằng cách sử dụng "tổng số ví dụ đúng / tổng số".

Tiện ích bổ sung

Tôi có thể sử dụng TFMA để đánh giá sự công bằng hoặc thiên vị trong mô hình của mình không?

TFMA bao gồm một tiện ích bổ sung FairnessIndicators cung cấp các số liệu sau khi xuất để đánh giá tác động của sai lệch ngoài ý muốn trong các mô hình phân loại.

Tùy biến

Nếu tôi cần nhiều tùy chỉnh hơn thì sao?

Extractors rất linh hoạt và cho phép bạn tùy chỉnh hầu như tất cả các phần của đường dẫn bằng cách sử dụng Trình trích xuất, Evaluators và / hoặc Writers viết tùy chỉnh. Những điều trừu tượng này sẽ được thảo luận chi tiết hơn trong tài liệu kiến ​​trúc .

Khắc phục sự cố, gỡ lỗi và nhận trợ giúp

Tại sao các chỉ số MultiClassConfusionMatrix không khớp với các chỉ số ConfusionMatrix được mã hóa

Đây thực sự là những tính toán khác nhau. Binarization thực hiện so sánh cho từng ID lớp một cách độc lập (nghĩa là dự đoán cho mỗi lớp được so sánh riêng biệt với các ngưỡng được cung cấp). Trong trường hợp này, có thể có hai hoặc nhiều lớp đều cho biết rằng chúng khớp với dự đoán vì giá trị dự đoán của chúng lớn hơn ngưỡng (điều này thậm chí sẽ nhiều hơn ở ngưỡng thấp hơn). Trong trường hợp của ma trận nhầm lẫn đa lớp, vẫn chỉ có một giá trị dự đoán đúng và nó khớp với giá trị thực hoặc không. Ngưỡng chỉ được sử dụng để buộc một dự đoán không khớp với phân loại nào nếu nó nhỏ hơn ngưỡng. Ngưỡng càng cao càng khó khớp với dự đoán của lớp học được mã hóa. Tương tự như vậy, ngưỡng càng thấp thì các dự đoán của một lớp được mã hóa càng dễ khớp hơn. Có nghĩa là ở ngưỡng> 0,5, các giá trị nhị phân và giá trị ma trận đa thủy tinh sẽ được căn chỉnh gần nhau hơn và ở ngưỡng <0,5, chúng sẽ xa nhau hơn.

Ví dụ, giả sử chúng ta có 10 lớp trong đó lớp 2 được dự đoán với xác suất là 0,8, nhưng lớp thực tế là lớp 1 có xác suất là 0,15. Nếu bạn phân loại nhị phân trên lớp 1 và sử dụng ngưỡng 0,1, thì lớp 1 sẽ được coi là chính xác (0,15> 0,1) vì vậy nó sẽ được tính là TP, Tuy nhiên, đối với trường hợp đa kính, lớp 2 sẽ được coi là đúng (0,8> 0,1) và vì lớp 1 là thực tế, điều này sẽ được tính là FN. Bởi vì ở ngưỡng thấp hơn, nhiều giá trị hơn sẽ được coi là dương tính, nói chung sẽ có số lượng TP và FP cao hơn cho ma trận nhầm lẫn nhị phân so với ma trận nhầm lẫn đa kính, và TN và FN cũng thấp hơn tương tự.

Sau đây là một ví dụ về sự khác biệt quan sát được giữa MultiClassConfusionMatrixAtThresholds và các số lượng tương ứng từ quá trình mã hóa nhị phân của một trong các lớp.

MultiClassConfusionMatrixAtThresholds so với Binarized

Tại sao các chỉ số precision @ 1 và repeat @ 1 của tôi có cùng giá trị?

Ở giá trị k cao nhất của 1 độ chính xác và thu hồi là cùng một thứ. Độ chính xác bằng TP / (TP + FP) và thu hồi bằng TP / (TP + FN) . Dự đoán hàng đầu luôn tích cực và sẽ khớp hoặc không khớp với nhãn. Nói cách khác, với N ví dụ, TP + FP = N Tuy nhiên, nếu nhãn không khớp với dự đoán hàng đầu, thì điều này cũng ngụ ý rằng k dự đoán không phải hàng đầu đã được khớp và với k hàng đầu được đặt thành 1, tất cả các dự đoán không thuộc top 1 sẽ bằng 0. Điều này có nghĩa là FN phải là (N - TP) hoặc N = TP + FN . Kết quả cuối cùng là precision@1 = TP / N = recall@1 . Lưu ý rằng điều này chỉ áp dụng khi có một nhãn cho mỗi ví dụ, không áp dụng cho nhiều nhãn.

Tại sao các chỉ số mean_label và mean_prediction của tôi luôn là 0,5?

Điều này rất có thể xảy ra bởi vì các số liệu được định cấu hình cho một vấn đề phân loại nhị phân, nhưng mô hình đang tính xác suất cho cả hai lớp thay vì chỉ một. Điều này thường xảy ra khi sử dụng API phân loại của tensorflow . Giải pháp là chọn lớp mà bạn muốn dựa trên các dự đoán và sau đó viết mã nhị phân trên lớp đó. Ví dụ:

eval_config = text_format.Parse("""
  ...
  metrics_specs {
    binarize { class_ids: { values: [0] } }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    ...
  }
  ...
""", config.EvalConfig())

Làm thế nào để diễn giải MultiLabelConfusionMatrixPlot?

Với một nhãn cụ thể, MultiLabelConfusionMatrixPlot (và MultiLabelConfusionMatrix liên quan) có thể được sử dụng để so sánh kết quả của các nhãn khác và dự đoán của chúng khi nhãn đã chọn thực sự đúng. Ví dụ: giả sử chúng ta có ba lớp bird , planesuperman và chúng ta đang phân loại các bức tranh để cho biết liệu chúng có chứa một hoặc nhiều trong số các lớp này hay không. MultiLabelConfusionMatrix sẽ tính tích các-ten của mỗi lớp thực tế với mỗi lớp khác (được gọi là lớp dự đoán). Lưu ý rằng trong khi ghép nối là (actual, predicted) , lớp predicted không nhất thiết ngụ ý dự đoán dương, nó chỉ đại diện cho cột dự đoán trong ma trận thực tế so với dự đoán. Ví dụ: giả sử chúng ta đã tính toán các ma trận sau:

   (bird, bird)         ->    { tp: 6, fp: 0, fn: 2, tn: 0}
   (bird, plane)        ->    { tp: 2, fp: 2, fn: 2, tn: 2}
   (bird, superman)     ->    { tp: 1, fp: 1, fn: 4, tn: 2}
   (plane, bird)        ->    { tp: 3, fp: 1, fn: 1, tn: 3}
   (plane, plane)       ->    { tp: 4, fp: 0, fn: 4, tn: 0}
   (plane, superman)    ->    { tp: 1, fp: 3, fn: 3, tn: 1}
   (superman, bird)     ->    { tp: 3, fp: 2, fn: 2, tn: 2}
   (superman, plane)    ->    { tp: 2, fp: 3, fn: 2, tn: 2}
   (superman, superman) ->    { tp: 4, fp: 0, fn: 5, tn: 0}

   num_examples: 20

MultiLabelConfusionMatrixPlot có ba cách để hiển thị dữ liệu này. Trong mọi trường hợp, cách đọc bảng là từng hàng theo quan điểm của lớp thực tế.

1) Tổng số dự đoán

Trong trường hợp này, đối với một hàng nhất định (tức là lớp thực tế), số TP + FP cho các lớp khác là bao nhiêu. Đối với các số lượng ở trên, màn hình của chúng tôi sẽ như sau:

Chim dự đoán Máy bay dự đoán Dự đoán siêu nhân
Chim thực tế 6 4 2
Máy bay thực tế 4 4 4
Siêu nhân thực tế 5 5 4

Khi những bức ảnh thực sự có một bird , chúng tôi đã dự đoán chính xác 6 trong số chúng. Đồng thời chúng tôi cũng dự đoán plane (hoặc đúng hoặc sai) 4 lần và superman (hoặc đúng hoặc sai) 2 lần.

2) Số lượng dự đoán không chính xác

Trong trường hợp này, đối với một hàng nhất định (tức là lớp thực tế), số lượng FP cho các lớp khác là bao nhiêu. Đối với các số lượng ở trên, màn hình của chúng tôi sẽ như sau:

Chim dự đoán Máy bay dự đoán Dự đoán siêu nhân
Chim thực tế 0 2 1
Máy bay thực tế 1 0 3
Siêu nhân thực tế 2 3 0

Khi những bức ảnh thực sự có một bird , chúng tôi đã dự đoán sai plane 2 lần và superman 1 lần.

3) Đếm phủ định sai

Trong trường hợp này, đối với một hàng nhất định (tức là lớp thực tế) thì số FN cho các lớp khác là bao nhiêu. Đối với các số lượng ở trên, màn hình của chúng tôi sẽ như sau:

Chim dự đoán Máy bay dự đoán Dự đoán siêu nhân
Chim thực tế 2 2 4
Máy bay thực tế 1 4 3
Siêu nhân thực tế 2 2 5

Khi những bức ảnh thực sự có một bird , chúng tôi đã không dự đoán được nó 2 lần. Đồng thời, chúng tôi đã thất bại trong việc dự đoán plane 2 lần và superman 4 lần.

Tại sao tôi gặp lỗi không tìm thấy khóa dự đoán?

Một số mô hình đưa ra dự đoán của họ dưới dạng từ điển. Ví dụ: công cụ ước tính TF cho vấn đề phân loại nhị phân xuất ra một từ điển có chứa các probabilities , class_ids , v.v. Trong hầu hết các trường hợp, TFMA có các giá trị mặc định để tìm các tên khóa được sử dụng phổ biến như predictions , probabilities , v.v. Tuy nhiên, nếu mô hình của bạn rất tùy chỉnh, nó có thể các khóa đầu ra dưới tên mà TFMA không biết. Trong các trường hợp này, một cài đặt prediciton_key phải được thêm vào tfma.ModelSpec để xác định tên của khóa mà đầu ra được lưu trữ.