Dołącz do TensorFlow na Google I/O, 11-12 maja Zarejestruj się teraz

Architektura analizy modelu Tensorflow

Przegląd

Potok TensorFlow Model Analysis (TFMA) jest przedstawiony w następujący sposób:

Rurociąg TFMA

Rurociąg składa się z czterech głównych elementów:

  • Przeczytaj dane wejściowe
  • Ekstrakcja
  • Ocena
  • Zapisz wyniki

Składniki te skorzystać z dwóch podstawowych typów: tfma.Extracts i tfma.evaluators.Evaluation . W typ tfma.Extracts reprezentują dane, które jest uwolnione w przetwarzaniu potokowym podczas typu tfma.evaluators.Evaluation oznacza wyjście z oceny ekstrakty w różnych punktach w procesie ekstrakcji. Aby zapewnić elastyczne API, te typy są po prostu dyktami, w których klucze są zdefiniowane (zarezerwowane do użytku) przez różne implementacje. Rodzaje są zdefiniowane w następujący sposób:

# Extracts represent data extracted during pipeline processing.
# For example, the PredictExtractor stores the data for the
# features, labels, and predictions under the keys "features",
# "labels", and "predictions".
Extracts = Dict[Text, Any]

# Evaluation represents the output from evaluating extracts at
# particular point in the pipeline. The evaluation outputs are
# keyed by their associated output type. For example, the metric / plot
# dictionaries from evaluating metrics and plots will be stored under
# "metrics" and "plots" respectively.
Evaluation = Dict[Text, beam.pvalue.PCollection]

Zauważ, że tfma.Extracts nigdy nie są zapisywane bezpośrednio zawsze muszą przejść przez oceniającego w celu wytworzenia tfma.evaluators.Evaluation który jest następnie zapisywane na zewnątrz. Należy również zauważyć, że tfma.Extracts są dicts, które są przechowywane w beam.pvalue.PCollection (tj beam.PTransform s odbioru jako wejście beam.pvalue.PCollection[tfma.Extracts] ), natomiast tfma.evaluators.Evaluation jest dict których wartości są beam.pvalue.PCollection s (tj beam.PTransform s podjąć dict się jako argument dla beam.value.PCollection wejściu). Innymi słowy tfma.evaluators.Evaluation jest używany w czasie budowy gazociągu, ale tfma.Extracts są używane w czasie wykonywania rurociągu.

Przeczytaj dane wejściowe

ReadInputs etap składa się z transformacji, która bierze surowe wejść (tf.train.Example, CSV, ...) i konwertuje je do wyciągów. Dziś ekstrakty są reprezentowane jako wejście surowe bajty przechowywane w tfma.INPUT_KEY jednak ekstrakty mogą być w dowolnej postaci, która jest zgodna z rurociągu Ekstrakcja - sposób, że tworzy tfma.Extracts jako wyjście i że te ekstrakty są kompatybilne z prądem ekstraktory. Od różnych ekstraktorów zależy, czy jasno udokumentowają to, czego potrzebują.

Ekstrakcja

Proces ekstrakcji jest lista beam.PTransform s, które są prowadzone w seriach. Ekstraktorów wziąć tfma.Extracts jako wejście i powrót tfma.Extracts jako wyjście. Proto-typowy wyciąg jest tfma.extractors.PredictExtractor który wykorzystuje ekstrakt wejściowego produkowanego przez odczytu wejść przekształcać i prowadzi go przez model prognoz produce ekstraktów. Dostosowane odciągi mogą być umieszczone w dowolnym miejscu pod warunkiem ich transformacje zgodne z tfma.Extracts wi tfma.Extracts spośród API. Ekstraktor definiuje się w następujący sposób:

# An Extractor is a PTransform that takes Extracts as input and returns
# Extracts as output. A typical example is a PredictExtractor that receives
# an 'input' placeholder for input and adds additional 'predictions' extracts.
Extractor = NamedTuple('Extractor', [
    ('stage_name', Text),
    ('ptransform', beam.PTransform)])  # Extracts -> Extracts

Należy pamiętać, że poza bardzo szczególnych przypadkach, to jest prawie zawsze zdarza się, że jeden tfma.Extracts w beam.pvalue.PCollection odpowiadać będzie jeden przykład z modelu.

InputExtractor

tfma.extractors.InputExtractor służy do wyodrębniania surowych możliwości, surowe etykiet i surowce przykładowe ciężary z tf.train.Example zapisów do stosowania w metryki krojenia i obliczeń. Domyślnie wartości są przechowywane pod klawiszami wyodrębnić features , labels i example_weights odpowiednio. Single-wyjścia modelowe przykłady etykiet i ciężary są przechowywane bezpośrednio jako np.ndarray wartości. Wielu wyjściowe modelu etykiety i przykładowe ciężary są przechowywane jako dicts z np.ndarray wartości (kluczach wg nazwy wyjściu). Jeśli wykonywana jest ocena wielu modeli, etykiety i przykładowe wagi zostaną dalej osadzone w innym dykcie (kluczem według nazwy modelu).

PredictExtractor

tfma.extractors.PredictExtractor biegnie modeli przewidywania i przechowuje je pod kluczowych predictions w tfma.Extracts dict. Prognozy modelu z jednym wyjściem są przechowywane bezpośrednio jako przewidywane wartości wyjściowe. Prognozy modelu wielowyjściowego są przechowywane jako dykta wartości wyjściowych (kluczowych według nazwy danych wyjściowych). Jeśli przeprowadzana jest ocena wielomodelowa, predykcja zostanie dalej osadzona w innym dykcie (oznaczonym nazwą modelu). Rzeczywista wartość wyjściową stosuje się w zależności od typu (np TF estymator na wyjście powrotne w postaci dict natomiast Keras powraca np.ndarray wartości).

SliceKeyExtractor

tfma.extractors.SliceKeyExtractor wykorzystuje spec krojenia w celu określenia, które stosuje się plastry do każdego wejścia przykład na podstawie wyodrębnionych cech i dodaje coresponding wartości Odcinanie na ekstraktach w celu późniejszego użycia przez oceniających.

Ocena

Ocena to proces pobierania wyciągu i oceny go. Chociaż często przeprowadza się ocenę na końcu potoku ekstrakcji, istnieją przypadki użycia, które wymagają oceny na wcześniejszym etapie procesu ekstrakcji. W związku z tym ewaluatorzy są powiązani z ekstraktorami, których wyniki powinny być oceniane. Ewaluatora definiuje się w następujący sposób:

# An evaluator is a PTransform that takes Extracts as input and
# produces an Evaluation as output. A typical example of an evaluator
# is the MetricsAndPlotsEvaluator that takes the 'features', 'labels',
# and 'predictions' extracts from the PredictExtractor and evaluates
# them using post export metrics to produce metrics and plots dictionaries.
Evaluator = NamedTuple('Evaluator', [
  ('stage_name', Text),
  ('run_after', Text),              # Extractor.stage_name
  ('ptransform', beam.PTransform)]) # Extracts -> Evaluation

Zauważ, że ewaluator jest beam.PTransform że trwa tfma.Extracts jako wejścia. Nic nie powstrzymuje implementacji przed wykonaniem dodatkowych przekształceń na ekstraktach w ramach procesu oceny. W przeciwieństwie do wirówek, że musi wrócić do tfma.Extracts dict, nie istnieją żadne ograniczenia dotyczące rodzajów wyjść ewaluator może produkują choć większość Oceniający również zwrócić dict (np nazw i wartości metrycznych).

Ewaluator metryk i wykresów

tfma.evaluators.MetricsAndPlotsEvaluator wykonuje features , labels i predictions na wejściu, prowadzi ich przez tfma.slicer.FanoutSlices pogrupować je przez plasterki, a następnie wykonuje metryk i działek obliczeń. Wytwarza wyjścia w postaci słowników danych i wykreśla kluczy i wartości (wartości te są następnie przekształcane do serializacji PROTOS jako wyjścia tfma.writers.MetricsAndPlotsWriter ).

Zapisz wyniki

WriteResults etap jest gdzie wyjście ocena zostanie zapisana na dysku. WriteResults używa pisarzy do zapisywania danych na podstawie kluczy wyjściowych. Na przykład, tfma.evaluators.Evaluation może zawierać klucze metrics i plots . Zostaną one następnie powiązane ze słownikami metryk i wykresów, zwanymi „metrykami” i „wykresami”. Autorzy określają, jak zapisać każdy plik:

# A writer is a PTransform that takes evaluation output as input and
# serializes the associated PCollections of data to a sink.
Writer = NamedTuple('Writer', [
  ('stage_name', Text),
  ('ptransform', beam.PTransform)])    # Evaluation -> PDone

Pisarz metryk i wykresów

Zapewniamy tfma.writers.MetricsAndPlotsWriter który przetwarza dane i działek słowniki do serializacji PROTOS i zapisuje je na dysku.

Jeśli chcesz użyć innego formatu serializacji, możesz utworzyć niestandardowy program do zapisywania i użyć go zamiast tego. Ponieważ tfma.evaluators.Evaluation przekazywane do pisarzy zawiera wyjście dla wszystkich oceniających połączonych, o tfma.writers.Write pomocnik przekształcić się pod warunkiem, że autorzy mogą używać w swoich ptransform wdrożeń, aby wybrać odpowiedni beam.PCollection s oparte na zasadzie klawisz wyjścia (patrz przykład poniżej).

Dostosowywanie

tfma.run_model_analysis metoda bierze extractors , evaluators i writers argumenty za customing ekstraktorów ewaluatorzy, a twórcy wykorzystywane przez rurociąg. Jeśli żadne argumenty są następnie tfma.default_extractors , tfma.default_evaluators i tfma.default_writers są stosowane domyślnie.

Ekstraktory niestandardowe

Aby utworzyć własny wyciąg, tworzyć tfma.extractors.Extractor typ, który owija beam.PTransform biorąc tfma.Extracts jak wejście i powrót tfma.Extracts jako wyjście. Przykłady odessanie pod tfma.extractors .

Niestandardowi oceniający

Aby utworzyć niestandardową oceniającego stworzyć tfma.evaluators.Evaluator typ, który owija beam.PTransform biorąc tfma.Extracts jak wejście i powrót tfma.evaluators.Evaluation jako wyjście. To bardzo prosty oceniający może po prostu wziąć przychodzące tfma.Extracts i wyjście je do przechowywania w tabeli. To jest dokładnie to, co tfma.evaluators.AnalysisTableEvaluator robi. Bardziej skomplikowany ewaluator może wykonać dodatkowe przetwarzanie i agregację danych. Zobacz tfma.evaluators.MetricsAndPlotsEvaluator jako przykład ..

Należy zauważyć, że tfma.evaluators.MetricsAndPlotsEvaluator samo można dostosować do wsparcia niestandardowych danych (patrz dane o więcej szczegółów).

Niestandardowi pisarze

Aby utworzyć niestandardową pisarza utwórz tfma.writers.Writer typ, który owija beam.PTransform podejmowania tfma.evaluators.Evaluation na wejściu i powrocie beam.pvalue.PDone jako wyjście. Poniżej znajduje się podstawowy przykład pisarza do zapisywania TFRecords zawierających metryki:

tfma.writers.Writer(
  stage_name='WriteTFRecord(%s)' % tfma.METRICS_KEY,
  ptransform=tfma.writers.Write(
    key=tfma.METRICS_KEY,
    ptransform=beam.io.WriteToTFRecord(file_path_prefix=output_file))

Dane wejściowe pisarza zależą od danych wyjściowych skojarzonego oceniającego. W powyższym przykładzie, wyjście jest szeregowana proto wytwarzane przez tfma.evaluators.MetricsAndPlotsEvaluator . Pisarz dla tfma.evaluators.AnalysisTableEvaluator byłby odpowiedzialny za wypisywanie beam.pvalue.PCollection z tfma.Extracts .

Należy pamiętać, że pisarz jest związany z wyjściem oceniającego poprzez klucza stosowanego wyjściowego (np tfma.METRICS_KEY , tfma.ANALYSIS_KEY , etc).

Przykład krok po kroku

Poniżej znajduje się przykład z etapów ekstrakcji i oceny rurociągu, gdy zarówno tfma.evaluators.MetricsAndPlotsEvaluator i tfma.evaluators.AnalysisTableEvaluator stosuje się:

run_model_analysis(
    ...
    extractors=[
        tfma.extractors.InputExtractor(...),
        tfma.extractors.PredictExtractor(...),
        tfma.extractors.SliceKeyExtrator(...)
    ],
    evaluators=[
        tfma.evaluators.MetricsAndPlotsEvaluator(...),
        tfma.evaluators.AnalysisTableEvaluator(...)
    ])

ReadInputs

# Out
Extracts {
  'input': bytes                 # CSV, Proto, ...
}

ExtractAndEvaluate

# In:  ReadInputs Extracts
# Out:
Extracts {
  'input': bytes                    # CSV, Proto, ...
  'features': tensor_like           # Raw features
  'labels': tensor_like             # Labels
  'example_weights': tensor_like    # Example weights
}
# In:  InputExtractor Extracts
# Out:
Extracts {
  'input': bytes                    # CSV, Proto, ...
  'features': tensor_like           # Raw features
  'labels': tensor_like             # Labels
  'example_weights': tensor_like    # Example weights
  'predictions': tensor_like        # Predictions
}
# In: PredictExtractor Extracts
# Out:
Extracts {
  'features': tensor_like           # Raw features
  'labels': tensor_like             # Labels
  'example_weights': tensor_like    # Example weights
  'predictions': tensor_like        # Predictions
  'slice_key': Tuple[bytes...]      # Slice
}
# In: SliceKeyExtractor Extracts
# Out:
Evaluation {
  'metrics': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from metric key to metric values)
  'plots': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from plot key to plot values)
}
# In: SliceKeyExtractor Extracts
# Out:
Evaluation {
  'analysis': PCollection[Extracts] # Final Extracts
}

WriteResults

# In:
Evaluation {
  'metrics': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from metric key to metric values)
  'plots': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from plot key to plot values)
  'analysis': PCollection[Extracts] # Final Extracts
}
# Out: metrics, plots, and analysis files