Tensorflow 모델 분석 자주 묻는 질문

일반적인

EvalSavedModel이 여전히 필요합니까?

이전 TFMA에서는 특별한 EvalSavedModel 을 사용하여 텐서플로 그래프 내에 모든 메트릭을 저장해야 했습니다. 이제 beam.CombineFn 구현을 사용하여 TF 그래프 외부에서 메트릭을 계산할 수 있습니다.

주요 차이점은 다음과 같습니다.

  • EvalSavedModel 은 트레이너의 특별한 내보내기가 필요하지만 서빙 모델은 교육 코드를 변경하지 않고도 사용할 수 있습니다.
  • EvalSavedModel 을 사용하는 경우 훈련 시 추가된 모든 메트릭은 평가 시 자동으로 사용할 수 있습니다. EvalSavedModel 이 없으면 이러한 메트릭을 다시 추가해야 합니다.
    • 이 규칙의 예외는 keras 모델이 사용되는 경우 keras가 저장된 모델과 함께 메트릭 정보를 저장하기 때문에 메트릭도 자동으로 추가될 수 있다는 것입니다.

TFMA는 그래프 내 측정항목과 외부 측정항목 모두와 함께 사용할 수 있습니까?

TFMA를 사용하면 일부 메트릭은 그래프 내에서 계산할 수 있고 다른 메트릭은 외부에서 계산할 수 있는 하이브리드 접근 방식을 사용할 수 있습니다. 현재 EvalSavedModel 이 있는 경우 계속 사용할 수 있습니다.

두 가지 경우가 있습니다.

  1. 기능 추출 및 메트릭 계산 모두에 TFMA EvalSavedModel 을 사용하고 결합기 기반 메트릭을 추가합니다. 이 경우 이전에 지원되지 않았을 수 있는 결합기 기반의 추가 메트릭과 함께 EvalSavedModel 의 모든 그래프 내 메트릭을 얻을 수 있습니다.
  2. 기능/예측 추출에는 TFMA EvalSavedModel 을 사용하지만 모든 메트릭 계산에는 결합기 기반 메트릭을 사용합니다. 이 모드는 슬라이싱에 사용하고 싶지만 그래프 외부에서 모든 메트릭 계산을 수행하는 것을 선호하는 EvalSavedModel 에 피쳐 변환이 있는 경우에 유용합니다.

설정

지원되는 모델 유형은 무엇입니까?

TFMA는 keras 모델, 일반 TF2 서명 API 기반 모델 및 TF 추정기 기반 모델을 지원합니다(사용 사례에 따라 추정기 기반 모델을 사용하려면 EvalSavedModel 이 필요할 수 있음).

지원되는 모델 유형 및 제한 사항의 전체 목록은 get_started 가이드를 참조하세요.

네이티브 케라스 기반 모델과 함께 작동하도록 TFMA를 어떻게 설정합니까?

다음은 다음 가정을 기반으로 하는 keras 모델의 구성 예입니다.

  • 저장된 모델은 서빙용이며 서명 이름 serving_default 를 사용합니다(이는 model_specs[0].signature_name 을 사용하여 변경할 수 있음).
  • model.compile(...) 의 내장 메트릭을 평가해야 합니다( tfma.EvalConfig 내의 options.include_default_metric 를 통해 비활성화할 수 있음).
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())

구성할 수 있는 다른 유형의 메트릭에 대한 자세한 내용은 메트릭 을 참조하십시오.

일반 TF2 서명 기반 모델과 함께 작동하도록 TFMA를 설정하려면 어떻게 해야 합니까?

다음은 일반 TF2 모델의 구성 예입니다. 아래에서 signature_name 은 평가에 사용해야 하는 특정 서명의 이름입니다.

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())

구성할 수 있는 다른 유형의 메트릭에 대한 자세한 내용은 메트릭 을 참조하십시오.

추정기 기반 모델과 함께 작동하도록 TFMA를 어떻게 설정합니까?

이 경우 세 가지 선택이 있습니다.

옵션 1: 게재 모델 사용

이 옵션을 사용하면 교육 중에 추가된 메트릭이 평가에 포함되지 않습니다.

다음은 serving_default 가 사용된 서명 이름이라고 가정한 구성의 예입니다.

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())

구성할 수 있는 다른 유형의 메트릭에 대한 자세한 내용은 메트릭 을 참조하십시오.

옵션 2: 추가 결합기 기반 측정항목과 함께 EvalSavedModel 사용

이 경우 특성/예측 추출 및 평가 모두에 EvalSavedModel 을 사용하고 추가 결합기 기반 메트릭을 추가합니다.

다음은 구성의 예입니다.

from google.protobuf import text_format

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

구성할 수 있는 다른 유형의 메트릭에 대한 자세한 내용은 메트릭 을 참조하고 EvalSavedModel 설정에 대한 자세한 내용은 EvalSavedModel을 참조하세요.

옵션 3: 기능/예측 추출에만 EvalSavedModel 모델 사용

option(2)와 유사하지만 기능/예측 추출에 EvalSavedModel 만 사용합니다. 이 옵션은 외부 메트릭만 원하지만 조각으로 삼고 싶은 기능 변환이 있는 경우에 유용합니다. 옵션 (1)과 유사하게 교육 중에 추가된 메트릭은 평가에 포함되지 않습니다.

이 경우 구성은 위와 동일하며 include_default_metrics 만 비활성화됩니다.

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())

구성할 수 있는 다른 유형의 메트릭에 대한 자세한 내용은 메트릭 을 참조하고 EvalSavedModel 설정에 대한 자세한 내용은 EvalSavedModel을 참조하세요.

keras 모델 대 추정기 기반 모델과 함께 작동하도록 TFMA를 설정하려면 어떻게 해야 합니까?

keras model_to_estimator 설정은 estimator 구성과 유사합니다. 그러나 모델 대 추정기의 작동 방식에 따라 몇 가지 차이점이 있습니다. 특히 model-to-esimtator는 dict 키가 연결된 keras 모델의 마지막 출력 레이어 이름인 dict 형식으로 출력을 반환합니다(이름이 제공되지 않으면 keras가 기본 이름을 선택합니다. dense_1 또는 output_1 과 같은). TFMA 관점에서 이 동작은 추정할 모델이 단일 모델에 대한 것일지라도 다중 출력 모델에 대해 출력되는 것과 유사합니다. 이 차이를 설명하려면 출력 이름을 설정하는 추가 단계가 필요합니다. 그러나 동일한 세 가지 옵션이 추정기로 적용됩니다.

다음은 추정기 기반 구성에 필요한 변경 사항의 예입니다.

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())

미리 계산된(즉, 모델에 구애받지 않는) 예측과 함께 작동하도록 TFMA를 설정하려면 어떻게 해야 합니까? ( TFRecordtf.Example )

미리 계산된 예측과 함께 작동하도록 TFMA를 구성하려면 기본 tfma.PredictExtractor 를 비활성화하고 tfma.InputExtractor 를 다른 입력 기능과 함께 예측을 구문 분석하도록 구성해야 합니다. 이는 레이블 및 가중치와 함께 예측에 사용되는 기능 키의 이름으로 tfma.ModelSpec 을 구성하여 수행됩니다.

다음은 설정 예입니다.

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())

구성할 수 있는 메트릭 에 대한 자세한 내용은 메트릭을 참조하십시오.

tfma.ModelSpec 이 구성되지만 모델은 실제로 사용되지 않습니다(즉, tfma.EvalSharedModel 이 없음). 모델 분석을 실행하기 위한 호출은 다음과 같을 수 있습니다.

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")

미리 계산된(즉, 모델에 구애받지 않는) 예측과 함께 작동하도록 TFMA를 설정하려면 어떻게 해야 합니까? ( pd.DataFrame )

메모리에 들어갈 수 있는 작은 데이터 세트의 경우 pandas.DataFrame 의 대안은 TFRecord 입니다. TFMA는 tfma.analyze_raw_data API를 사용하여 pandas.DataFrame 에서 작동할 수 있습니다. tfma.MetricsSpectfma.SlicingSpec 에 대한 설명은 설정 가이드를 참조하세요. 구성할 수 있는 메트릭 에 대한 자세한 내용은 메트릭을 참조하십시오.

다음은 설정 예입니다.

# 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)

측정항목

어떤 유형의 측정항목이 지원되나요?

TFMA는 다음과 같은 다양한 측정항목을 지원합니다.

다중 출력 모델의 메트릭이 지원됩니까?

예. 자세한 내용은 메트릭 가이드를 참조하세요.

여러 모델의 메트릭이 지원됩니까?

예. 자세한 내용은 측정항목 가이드를 참조하세요.

측정항목 설정(이름 등)을 사용자 지정할 수 있습니까?

예. 메트릭 구성에 config 설정을 추가하여 메트릭 설정을 사용자 지정할 수 있습니다(예: 특정 임계값 설정 등). 자세한 내용은 측정항목 가이드를 참조하세요.

맞춤 측정항목이 지원되나요?

예. 사용자 정의 beam.CombineFn 구현을 작성하거나 사용자 정의 tf.keras.metrics.Metric 구현을 작성합니다. 메트릭 가이드에 자세한 내용이 있습니다.

어떤 유형의 측정항목이 지원되지 않습니까?

beam.CombineFn 을 사용하여 메트릭을 계산할 수 있는 한 beam.CombineFn 을 기반으로 tfma.metrics.Metric 수 있는 메트릭 유형에는 제한이 없습니다. tf.keras.metrics.Metric 에서 파생된 메트릭으로 작업하는 경우 다음 기준을 충족해야 합니다.

  • 각 예에서 메트릭에 대한 충분한 통계를 독립적으로 계산한 다음 모든 예에 걸쳐 추가하여 이러한 충분한 통계를 결합하고 이러한 충분한 통계에서만 메트릭 값을 결정할 수 있어야 합니다.
  • 예를 들어, 정확성을 위해 충분한 통계는 "전체적으로 정확함" 및 "전체 예"입니다. 개별 예제에 대해 이 두 숫자를 계산하고 예제 그룹에 대해 합산하여 해당 예제에 대한 올바른 값을 얻을 수 있습니다. 최종 정확도는 "총 정답/총 예"를 사용하여 계산할 수 있습니다.

애드온

TFMA를 사용하여 내 모델의 공정성 또는 편향성을 평가할 수 있습니까?

TFMA에는 분류 모델에서 의도하지 않은 편향의 영향을 평가하기 위해 내보내기 후 메트릭을 제공하는 FairnessIndicators 추가 기능이 포함되어 있습니다.

커스터마이징

사용자 정의가 더 필요하면 어떻게 합니까?

TFMA는 매우 유연하며 사용자 지정 Extractors , Evaluators 및/또는 Writers 를 사용하여 파이프라인의 거의 모든 부분을 사용자 지정할 수 있습니다. 이러한 추상화는 아키텍처 문서에서 더 자세히 논의됩니다.

문제 해결, 디버깅 및 도움말 얻기

MultiClassConfusionMatrix 메트릭이 이진화된 ConfusionMatrix 메트릭과 일치하지 않는 이유

이것은 실제로 다른 계산입니다. 이진화는 각 클래스 ID에 대해 독립적으로 비교를 수행합니다(즉, 각 클래스에 대한 예측이 제공된 임계값과 별도로 비교됨). 이 경우 예측 값이 임계값보다 컸기 때문에 둘 이상의 클래스가 모두 예측과 일치했음을 나타낼 수 있습니다(이는 더 낮은 임계값에서 훨씬 더 분명함). 다중 클래스 혼동 행렬의 경우 여전히 하나의 실제 예측 값만 있으며 실제 값과 일치하거나 일치하지 않습니다. 임계값은 임계값보다 작은 경우 예측이 클래스와 일치하지 않도록 강제하는 데만 사용됩니다. 임계값이 높을수록 이진화된 클래스의 예측이 일치하기가 더 어렵습니다. 마찬가지로 임계값이 낮을수록 이진화된 클래스의 예측이 일치하기가 더 쉽습니다. 임계값 > 0.5에서는 이진화된 값과 다중 클래스 행렬 값이 더 가깝게 정렬되고 임계값 < 0.5에서는 더 멀리 떨어져 있음을 의미합니다.

예를 들어 클래스 2가 0.8의 확률로 예측되었지만 실제 클래스는 0.15의 확률을 가진 클래스 1인 10개의 클래스가 있다고 가정해 보겠습니다. 클래스 1에서 이진화하고 임계값 0.1을 사용하면 클래스 1이 올바른 것으로 간주되어(0.15 > 0.1) TP로 계산되지만 다중 클래스의 경우 클래스 2가 올바른 것으로 간주됩니다(0.8 > 0.1) 클래스 1이 실제였으므로 FN으로 계산됩니다. 더 낮은 임계값에서 더 많은 값이 긍정적인 것으로 간주되기 때문에 일반적으로 다중 클래스 혼동 행렬보다 이진화된 혼동 행렬에 대해 더 높은 TP 및 FP 수가 있고 유사하게 더 낮은 TN 및 FN이 있습니다.

다음은 MultiClassConfusionMatrixAtThresholds와 클래스 중 하나의 이진화에서 해당 카운트 간의 관찰된 차이점의 예입니다.

MultiClassConfusionMatrixAtThresholds 대 이진화

왜 내 정밀도@1 및 리콜@1 측정항목의 값이 같습니까?

1의 상위 k 값에서 정밀도와 재현율은 동일합니다. 정밀도는 TP / (TP + FP) 와 같으며 재현율은 TP / (TP + FN) 입니다. 상위 예측은 항상 양수이며 레이블과 일치하거나 일치하지 않습니다. 즉, N 개의 예에서 TP + FP = N 입니다. 그러나 레이블이 상위 예측과 일치하지 않으면 상위 k 예측이 일치하지 않았음을 의미하며 상위 k가 1로 설정되면 상위 1이 아닌 모든 예측은 0이 됩니다. 이는 FN이 (N - TP) 또는 N = TP + FN . 최종 결과는 precision@1 = TP / N = recall@1 입니다. 이는 다중 레이블이 아닌 예제당 단일 레이블이 있는 경우에만 적용됩니다.

내 mean_label 및 mean_prediction 측정항목이 항상 0.5인 이유는 무엇인가요?

이는 메트릭이 이진 분류 문제에 대해 구성되었지만 모델이 하나만이 아니라 두 클래스에 대한 확률을 출력하기 때문에 발생할 가능성이 높습니다. 이것은 tensorflow의 분류 API 를 사용할 때 일반적입니다. 솔루션은 예측의 기반이 될 클래스를 선택한 다음 해당 클래스를 이진화하는 것입니다. 예를 들어:

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

MultiLabelConfusionMatrixPlot을 해석하는 방법은 무엇입니까?

특정 레이블이 지정되면 MultiLabelConfusionMatrixPlot (및 연결된 MultiLabelConfusionMatrix )을 사용하여 선택한 레이블이 실제로 참일 때 다른 레이블과 해당 예측의 결과를 비교할 수 있습니다. 예를 들어, 세 개의 클래스 bird , planesuperman 이 있고 이러한 클래스 중 하나 이상이 포함되어 있는지 나타내기 위해 그림을 분류한다고 가정해 보겠습니다. MultiLabelConfusionMatrix 는 서로 다른 클래스(예측 클래스라고 함)에 대해 각 실제 클래스의 데카르트 곱을 계산합니다. 쌍이 (actual, predicted) 이지만 predicted 클래스가 반드시 긍정적 예측을 의미하는 것은 아니며 실제 대 예측 행렬의 예측 열을 나타낼 뿐입니다. 예를 들어 다음 행렬을 계산했다고 가정해 보겠습니다.

   (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 에는 이 데이터를 표시하는 세 가지 방법이 있습니다. 모든 경우에 테이블을 읽는 방법은 실제 클래스의 관점에서 행 단위입니다.

1) 총 예측 횟수

이 경우, 주어진 행(즉, 실제 클래스)에 대해 다른 클래스에 대한 TP + FP 수는 무엇입니까? 위 카운트의 경우 다음과 같이 표시됩니다.

예측된 새 예상 평면 예측 슈퍼맨
실제 새 6 4 2
실제 비행기 4 4 4
실제 슈퍼맨 5 5 4

그림에 실제로 bird 가 포함되어 있을 때 우리는 그 중 6개를 정확하게 예측했습니다. 동시에 우리는 plane (정확하거나 그름)를 4번, superman (정확하거나 틀리게)을 2번 예측했습니다.

2) 잘못된 예측 횟수

이 경우, 주어진 행(즉, 실제 클래스)에 대해 다른 클래스에 대한 FP 수는 무엇이었습니까? 위 카운트의 경우 다음과 같이 표시됩니다.

예측된 새 예상 평면 예측 슈퍼맨
실제 새 0 2 1
실제 비행기 1 0
실제 슈퍼맨 2 0

그림에 실제로 bird 가 포함되어 있을 때 plane 를 2번, superman 을 1번 잘못 예측했습니다.

3) 거짓 음수 카운트

이 경우, 주어진 행(즉, 실제 클래스)에 대해 다른 클래스에 대한 FN 카운트는 무엇입니까? 위 카운트의 경우 다음과 같이 표시됩니다.

예측된 새 예상 평면 예측 슈퍼맨
실제 새 2 2 4
실제 비행기 1 4
실제 슈퍼맨 2 2 5

사진에 실제로 bird 가 포함되었을 때 우리는 2번이나 새를 예측하는 데 실패했습니다. 동시에 우리는 plane 2번, superman 4번 예측에 실패했습니다.

예측 키를 찾을 수 없다는 오류가 발생하는 이유는 무엇입니까?

일부 모델은 사전의 형태로 예측을 출력합니다. 예를 들어, 이진 분류 문제에 대한 TF 추정기는 probabilities , class_ids 등을 포함하는 사전을 출력합니다. 대부분의 경우 TFMA에는 predictions , probabilities 등과 같이 일반적으로 사용되는 키 이름을 찾기 위한 기본값이 있습니다. 그러나 모델이 매우 맞춤화된 경우 TFMA에서 알려지지 않은 이름으로 키를 출력합니다. 이러한 경우 출력이 저장된 키의 이름을 식별하기 위해 prediciton_key 설정을 tfma.ModelSpec 에 추가해야 합니다.