Komponent potoku Transform TFX

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Komponent potoku Transform TFX wykonuje inżynierię funkcji na tf.Examples emitowanych z komponentu ExampleGen , używając schematu danych utworzonego przez komponent SchemaGen i emituje zarówno SavedModel, jak i statystyki dotyczące danych przed i po transformacji. Po uruchomieniu SavedModel zaakceptuje tf.Examples wyemitowane z komponentu ExampleGen i wyemituje przekształcone dane funkcji.

  • Zużywa: tf.Examples ze składnika ExampleGen i schemat danych ze składnika SchemaGen.
  • Emituje: SavedModel do komponentu Trainer, statystyki przed i po transformacji.

Konfigurowanie komponentu transformacji

Po zapisaniu preprocessing_fn należy go zdefiniować w module Pythona, który jest następnie dostarczany do komponentu Transform jako dane wejściowe. Ten moduł zostanie załadowany przez transformację, a funkcja o nazwie preprocessing_fn zostanie znaleziona i użyta przez Transform do skonstruowania potoku przetwarzania wstępnego.

transform = Transform(
    examples=example_gen.outputs['examples'],
    schema=schema_gen.outputs['schema'],
    module_file=os.path.abspath(_taxi_transform_module_file))

Dodatkowo możesz chcieć udostępnić opcje obliczeń statystyk przed i po transformacji opartych na TFDV . Aby to zrobić, zdefiniuj stats_options_updater_fn w tym samym module.

Transformacja i transformacja TensorFlow

Transform szeroko wykorzystuje TensorFlow Transform do wykonywania inżynierii funkcji w zestawie danych. TensorFlow Transform to świetne narzędzie do przekształcania danych cech, zanim trafią one do Twojego modelu i jako część procesu szkoleniowego. Typowe transformacje cech obejmują:

  • Osadzanie : przekształcanie rzadkich cech (takich jak całkowite identyfikatory utworzone przez słownictwo) w gęste cechy poprzez znalezienie znaczącego mapowania z przestrzeni wielowymiarowej do przestrzeni niskowymiarowej. Zapoznaj się z jednostką osadzania w Crash Course uczenia maszynowego, aby zapoznać się z wprowadzeniem do osadzania.
  • Generowanie słownika : konwertowanie ciągów znaków lub innych elementów nienumerycznych na liczby całkowite poprzez tworzenie słownika, który odwzorowuje każdą unikalną wartość na numer identyfikacyjny.
  • Normalizowanie wartości : przekształcanie cech liczbowych tak, aby wszystkie mieściły się w podobnym zakresie.
  • Bucketyzacja : przekształcanie cech o wartościach ciągłych w cechy kategoryczne poprzez przypisywanie wartości do dyskretnych segmentów.
  • Wzbogacanie funkcji tekstowych : tworzenie funkcji z surowych danych, takich jak tokeny, n-gramy, jednostki, tonacja itp., aby wzbogacić zestaw funkcji.

TensorFlow Transform zapewnia obsługę tych i wielu innych rodzajów transformacji:

  • Automatycznie generuj słownictwo z najnowszych danych.

  • Dokonuj dowolnych przekształceń danych przed wysłaniem ich do modelu. TensorFlow Transform buduje przekształcenia na wykresie TensorFlow dla twojego modelu, więc te same przekształcenia są wykonywane w czasie uczenia i wnioskowania. Możesz zdefiniować przekształcenia odnoszące się do globalnych właściwości danych, takich jak maksymalna wartość funkcji we wszystkich instancjach szkoleniowych.

Możesz przekształcić swoje dane w dowolny sposób przed uruchomieniem TFX. Ale jeśli zrobisz to w TensorFlow Transform, transformacje staną się częścią wykresu TensorFlow. Takie podejście pomaga uniknąć przekrzywiania treningu/obsługi.

Transformacje wewnątrz kodu modelowania używają FeatureColumns. Korzystając z FeatureColumns, możesz definiować kubełki, integeryzacje wykorzystujące predefiniowane słowniki lub dowolne inne przekształcenia, które można zdefiniować bez przeglądania danych.

Natomiast TensorFlow Transform jest przeznaczony do przekształceń, które wymagają pełnego przejścia przez dane w celu obliczenia wartości, które nie są znane z góry. Na przykład generowanie słownictwa wymaga pełnego przejścia przez dane.

Oprócz obliczania wartości przy użyciu Apache Beam, TensorFlow Transform umożliwia użytkownikom osadzenie tych wartości w wykresie TensorFlow, który można następnie załadować do wykresu szkoleniowego. Na przykład podczas normalizacji funkcji funkcja tft.scale_to_z_score obliczy średnią i odchylenie standardowe cechy, a także reprezentację na wykresie TensorFlow funkcji, która odejmuje średnią i dzieli przez odchylenie standardowe. Emitując wykres TensorFlow, a nie tylko statystyki, TensorFlow Transform upraszcza proces tworzenia potoku przetwarzania wstępnego.

Ponieważ wstępne przetwarzanie jest wyrażone w postaci wykresu, może mieć miejsce na serwerze i gwarantuje spójność między szkoleniem a serwowaniem. Ta spójność eliminuje jedno źródło przekrzywienia treningu/serwisu.

TensorFlow Transform umożliwia użytkownikom określenie potoku przetwarzania wstępnego przy użyciu kodu TensorFlow. Oznacza to, że potok jest skonstruowany w taki sam sposób, jak wykres TensorFlow. Gdyby na tym grafie były używane tylko operacje TensorFlow, potok byłby czystą mapą, która akceptuje partie danych wejściowych i zwraca partie danych wyjściowych. Taki potok byłby równoznaczny z umieszczeniem tego wykresu w input_fn podczas korzystania z interfejsu API tf.Estimator . Aby określić operacje pełnego przejścia, takie jak obliczanie kwantyli, TensorFlow Transform zapewnia specjalne funkcje zwane analyzers , które wyglądają jak operacje TensorFlow, ale w rzeczywistości określają odroczone obliczenia, które zostaną wykonane przez Apache Beam, a dane wyjściowe zostaną wstawione do wykresu jako stały. Podczas gdy zwykła operacja TensorFlow pobiera pojedynczą partię jako dane wejściowe, wykonuje obliczenia tylko na tej partii i emituje partię, analyzer przeprowadzi globalną redukcję (zaimplementowaną w Apache Beam) dla wszystkich partii i zwróci wynik.

Łącząc zwykłe analizatory TensorFlow ops i TensorFlow Transform, użytkownicy mogą tworzyć złożone potoki do wstępnego przetwarzania swoich danych. Na przykład funkcja tft.scale_to_z_score pobiera wejściowy tensor i zwraca ten tensor znormalizowany, aby miał średnią 0 i wariancję 1 . Robi to, wywołując pod maską analizatory mean i var , które skutecznie generują stałe na wykresie równe średniej i wariancji tensora wejściowego. Następnie użyje operacji TensorFlow do odjęcia średniej i podzielenia przez odchylenie standardowe.

TensorFlow Transform preprocessing_fn

Komponent TFX Transform upraszcza korzystanie z Transform poprzez obsługę wywołań API związanych z odczytem i zapisem danych oraz zapisem danych wyjściowych SavedModel na dysk. Jako użytkownik TFX musisz zdefiniować tylko jedną funkcję o nazwie preprocessing_fn . W preprocessing_fn definiujesz serię funkcji, które manipulują wejściowym dyktatem tensorów w celu wytworzenia wyjściowego dyktatu tensorów. Funkcje pomocnicze, takie jak scale_to_0_1 i compute_and_apply_vocabulary, można znaleźć w interfejsie API transformacji TensorFlow lub użyć zwykłych funkcji TensorFlow, jak pokazano poniżej.

def preprocessing_fn(inputs):
  """tf.transform's callback function for preprocessing inputs.

  Args:
    inputs: map from feature keys to raw not-yet-transformed features.

  Returns:
    Map from string feature key to transformed feature operations.
  """
  outputs = {}
  for key in _DENSE_FLOAT_FEATURE_KEYS:
    # If sparse make it dense, setting nan's to 0 or '', and apply zscore.
    outputs[_transformed_name(key)] = transform.scale_to_z_score(
        _fill_in_missing(inputs[key]))

  for key in _VOCAB_FEATURE_KEYS:
    # Build a vocabulary for this feature.
    outputs[_transformed_name(
        key)] = transform.compute_and_apply_vocabulary(
            _fill_in_missing(inputs[key]),
            top_k=_VOCAB_SIZE,
            num_oov_buckets=_OOV_SIZE)

  for key in _BUCKET_FEATURE_KEYS:
    outputs[_transformed_name(key)] = transform.bucketize(
        _fill_in_missing(inputs[key]), _FEATURE_BUCKET_COUNT)

  for key in _CATEGORICAL_FEATURE_KEYS:
    outputs[_transformed_name(key)] = _fill_in_missing(inputs[key])

  # Was this passenger a big tipper?
  taxi_fare = _fill_in_missing(inputs[_FARE_KEY])
  tips = _fill_in_missing(inputs[_LABEL_KEY])
  outputs[_transformed_name(_LABEL_KEY)] = tf.where(
      tf.is_nan(taxi_fare),
      tf.cast(tf.zeros_like(taxi_fare), tf.int64),
      # Test if the tip was > 20% of the fare.
      tf.cast(
          tf.greater(tips, tf.multiply(taxi_fare, tf.constant(0.2))), tf.int64))

  return outputs

Zrozumienie danych wejściowych do preprocessing_fn

preprocessing_fn opisuje serię operacji na tensorach (czyli Tensor s, SparseTensor s lub RaggedTensor s). Aby poprawnie zdefiniować preprocessing_fn , konieczne jest zrozumienie, w jaki sposób dane są reprezentowane jako tensory. Dane wejściowe do preprocessing_fn są określane przez schemat. Proto Schema jest ostatecznie konwertowane na „specyfikację funkcji” (czasami nazywaną „specyfikacją parsowania”), która jest używana do analizowania danych, zobacz więcej szczegółów na temat logiki konwersji tutaj .

Używanie TensorFlow Transform do obsługi etykiet łańcuchowych

Zwykle chce się użyć TensorFlow Transform zarówno do generowania słownictwa, jak i stosowania tego słownictwa do konwersji ciągów znaków na liczby całkowite. Podczas wykonywania tego przepływu pracy input_fn skonstruowany w modelu spowoduje wyprowadzenie ciągu całkowitoliczbowego. Jednak etykiety są wyjątkiem, ponieważ aby model mógł odwzorować etykiety wyjściowe (liczby całkowite) z powrotem na ciągi, model potrzebuje input_fn do wyprowadzenia etykiety ciągu wraz z listą możliwych wartości etykiety. Np. jeśli etykietami są cat i dog , to wyjściem input_fn powinny być te nieprzetworzone ciągi znaków, a klucze ["cat", "dog"] muszą zostać przekazane do estymatora jako parametr (szczegóły poniżej).

Aby obsłużyć mapowanie etykiet ciągów na liczby całkowite, należy użyć TensorFlow Transform do wygenerowania słownictwa. Pokazujemy to w poniższym fragmencie kodu:

def _preprocessing_fn(inputs):
  """Preprocess input features into transformed features."""

  ...


  education = inputs[features.RAW_LABEL_KEY]
  _ = tft.vocabulary(education, vocab_filename=features.RAW_LABEL_KEY)

  ...

Powyższa funkcja przetwarzania wstępnego pobiera surową cechę wejściową (która również zostanie zwrócona jako część danych wyjściowych funkcji przetwarzania wstępnego) i wywołuje na niej tft.vocabulary . Powoduje to wygenerowanie słownictwa dla education , do którego można uzyskać dostęp w modelu.

Przykład pokazuje również, jak przekształcić etykietę, a następnie wygenerować słownik dla przekształconej etykiety. W szczególności zajmuje się surową education etykiet i konwertuje wszystkie etykiety oprócz 5 najlepszych (według częstotliwości) na UNKNOWN , bez konwersji etykiety na liczbę całkowitą.

W kodzie modelu klasyfikator musi otrzymać słownictwo wygenerowane przez tft.vocabulary jako argument label_vocabulary . Odbywa się to poprzez pierwsze przeczytanie tego słownictwa jako listy z funkcją pomocniczą. Widać to na poniższym fragmencie. Zwróć uwagę, że przykładowy kod używa przekształconej etykiety omówionej powyżej, ale tutaj pokazujemy kod do używania surowej etykiety.

def create_estimator(pipeline_inputs, hparams):

  ...

  tf_transform_output = trainer_util.TFTransformOutput(
      pipeline_inputs.transform_dir)

  # vocabulary_by_name() returns a Python list.
  label_vocabulary = tf_transform_output.vocabulary_by_name(
      features.RAW_LABEL_KEY)

  return tf.contrib.learn.DNNLinearCombinedClassifier(
      ...
      n_classes=len(label_vocab),
      label_vocabulary=label_vocab,
      ...)

Konfigurowanie statystyk przed i po transformacji

Jak wspomniano powyżej, komponent Transform wywołuje TFDV w celu obliczenia statystyk zarówno przed, jak i po transformacji. TFDV przyjmuje jako dane wejściowe opcjonalny obiekt StatsOptions . Użytkownicy mogą chcieć skonfigurować ten obiekt, aby włączyć pewne dodatkowe statystyki (np. statystyki NLP) lub ustawić sprawdzane progi (np. minimalna / maksymalna częstotliwość tokenów). Aby to zrobić, zdefiniuj stats_options_updater_fn w pliku modułu.

def stats_options_updater_fn(stats_type, stats_options):
  ...
  if stats_type == stats_options_util.StatsType.PRE_TRANSFORM:
    # Update stats_options to modify pre-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  if stats_type == stats_options_util.StatsType.POST_TRANSFORM
    # Update stats_options to modify post-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  return stats_options

Statystyki po transformacji często korzystają ze znajomości słownictwa używanego do wstępnego przetwarzania funkcji. Nazwa słownika do mapowania ścieżki jest dostarczana do StatsOptions (a więc TFDV) dla każdego słownika generowanego przez TFT. Dodatkowo, mapowania dla słowników tworzonych zewnętrznie mogą być dodawane przez (i) bezpośrednią modyfikację słownika vocab_paths w StatsOptions lub przez (ii) użycie tft.annotate_asset .

,

Komponent potoku Transform TFX wykonuje inżynierię funkcji na tf.Examples emitowanych z komponentu ExampleGen , używając schematu danych utworzonego przez komponent SchemaGen i emituje zarówno SavedModel, jak i statystyki dotyczące danych przed i po transformacji. Po uruchomieniu SavedModel zaakceptuje tf.Examples wyemitowane z komponentu ExampleGen i wyemituje przekształcone dane funkcji.

  • Zużywa: tf.Examples ze składnika ExampleGen i schemat danych ze składnika SchemaGen.
  • Emituje: SavedModel do komponentu Trainer, statystyki przed i po transformacji.

Konfigurowanie komponentu transformacji

Po zapisaniu preprocessing_fn należy go zdefiniować w module Pythona, który jest następnie dostarczany do komponentu Transform jako dane wejściowe. Ten moduł zostanie załadowany przez transformację, a funkcja o nazwie preprocessing_fn zostanie znaleziona i użyta przez Transform do skonstruowania potoku przetwarzania wstępnego.

transform = Transform(
    examples=example_gen.outputs['examples'],
    schema=schema_gen.outputs['schema'],
    module_file=os.path.abspath(_taxi_transform_module_file))

Dodatkowo możesz chcieć udostępnić opcje obliczeń statystyk przed i po transformacji opartych na TFDV . Aby to zrobić, zdefiniuj stats_options_updater_fn w tym samym module.

Transformacja i transformacja TensorFlow

Transform szeroko wykorzystuje TensorFlow Transform do wykonywania inżynierii funkcji w zestawie danych. TensorFlow Transform to świetne narzędzie do przekształcania danych cech, zanim trafią one do Twojego modelu i jako część procesu szkoleniowego. Typowe transformacje cech obejmują:

  • Osadzanie : przekształcanie rzadkich cech (takich jak całkowite identyfikatory utworzone przez słownictwo) w gęste cechy poprzez znalezienie znaczącego mapowania z przestrzeni wielowymiarowej do przestrzeni niskowymiarowej. Zapoznaj się z jednostką osadzania w Crash Course uczenia maszynowego, aby zapoznać się z wprowadzeniem do osadzania.
  • Generowanie słownika : konwertowanie ciągów znaków lub innych elementów nienumerycznych na liczby całkowite poprzez tworzenie słownika, który odwzorowuje każdą unikalną wartość na numer identyfikacyjny.
  • Normalizowanie wartości : przekształcanie cech liczbowych tak, aby wszystkie mieściły się w podobnym zakresie.
  • Bucketyzacja : przekształcanie cech o wartościach ciągłych w cechy kategoryczne poprzez przypisywanie wartości do dyskretnych segmentów.
  • Wzbogacanie funkcji tekstowych : tworzenie funkcji z surowych danych, takich jak tokeny, n-gramy, jednostki, tonacja itp., aby wzbogacić zestaw funkcji.

TensorFlow Transform zapewnia obsługę tych i wielu innych rodzajów transformacji:

  • Automatycznie generuj słownictwo z najnowszych danych.

  • Dokonuj dowolnych przekształceń danych przed wysłaniem ich do modelu. TensorFlow Transform buduje przekształcenia na wykresie TensorFlow dla twojego modelu, więc te same przekształcenia są wykonywane w czasie uczenia i wnioskowania. Możesz zdefiniować przekształcenia odnoszące się do globalnych właściwości danych, takich jak maksymalna wartość funkcji we wszystkich instancjach szkoleniowych.

Możesz przekształcić swoje dane w dowolny sposób przed uruchomieniem TFX. Ale jeśli zrobisz to w TensorFlow Transform, transformacje staną się częścią wykresu TensorFlow. Takie podejście pomaga uniknąć przekrzywiania treningu/obsługi.

Transformacje wewnątrz kodu modelowania używają FeatureColumns. Korzystając z FeatureColumns, możesz definiować kubełki, integeryzacje wykorzystujące predefiniowane słowniki lub dowolne inne przekształcenia, które można zdefiniować bez przeglądania danych.

Natomiast TensorFlow Transform jest przeznaczony do przekształceń, które wymagają pełnego przejścia przez dane w celu obliczenia wartości, które nie są znane z góry. Na przykład generowanie słownictwa wymaga pełnego przejścia przez dane.

Oprócz obliczania wartości przy użyciu Apache Beam, TensorFlow Transform umożliwia użytkownikom osadzenie tych wartości w wykresie TensorFlow, który można następnie załadować do wykresu szkoleniowego. Na przykład podczas normalizacji funkcji funkcja tft.scale_to_z_score obliczy średnią i odchylenie standardowe cechy, a także reprezentację na wykresie TensorFlow funkcji, która odejmuje średnią i dzieli przez odchylenie standardowe. Emitując wykres TensorFlow, a nie tylko statystyki, TensorFlow Transform upraszcza proces tworzenia potoku przetwarzania wstępnego.

Ponieważ wstępne przetwarzanie jest wyrażone w postaci wykresu, może mieć miejsce na serwerze i gwarantuje spójność między szkoleniem a serwowaniem. Ta spójność eliminuje jedno źródło przekrzywienia treningu/serwisu.

TensorFlow Transform umożliwia użytkownikom określenie potoku przetwarzania wstępnego przy użyciu kodu TensorFlow. Oznacza to, że potok jest skonstruowany w taki sam sposób, jak wykres TensorFlow. Gdyby na tym grafie były używane tylko operacje TensorFlow, potok byłby czystą mapą, która akceptuje partie danych wejściowych i zwraca partie danych wyjściowych. Taki potok byłby równoznaczny z umieszczeniem tego wykresu w input_fn podczas korzystania z interfejsu API tf.Estimator . Aby określić operacje pełnego przejścia, takie jak obliczanie kwantyli, TensorFlow Transform zapewnia specjalne funkcje zwane analyzers , które wyglądają jak operacje TensorFlow, ale w rzeczywistości określają odroczone obliczenia, które zostaną wykonane przez Apache Beam, a dane wyjściowe zostaną wstawione do wykresu jako stały. Podczas gdy zwykła operacja TensorFlow pobiera pojedynczą partię jako dane wejściowe, wykonuje obliczenia tylko na tej partii i emituje partię, analyzer przeprowadzi globalną redukcję (zaimplementowaną w Apache Beam) dla wszystkich partii i zwróci wynik.

Łącząc zwykłe analizatory TensorFlow ops i TensorFlow Transform, użytkownicy mogą tworzyć złożone potoki do wstępnego przetwarzania swoich danych. Na przykład funkcja tft.scale_to_z_score pobiera wejściowy tensor i zwraca ten tensor znormalizowany, aby miał średnią 0 i wariancję 1 . Robi to, wywołując pod maską analizatory mean i var , które skutecznie generują stałe na wykresie równe średniej i wariancji tensora wejściowego. Następnie użyje operacji TensorFlow do odjęcia średniej i podzielenia przez odchylenie standardowe.

TensorFlow Transform preprocessing_fn

Komponent TFX Transform upraszcza korzystanie z Transform poprzez obsługę wywołań API związanych z odczytem i zapisem danych oraz zapisem danych wyjściowych SavedModel na dysk. Jako użytkownik TFX musisz zdefiniować tylko jedną funkcję o nazwie preprocessing_fn . W preprocessing_fn definiujesz serię funkcji, które manipulują wejściowym dyktatem tensorów w celu wytworzenia wyjściowego dyktatu tensorów. Funkcje pomocnicze, takie jak scale_to_0_1 i compute_and_apply_vocabulary, można znaleźć w interfejsie API transformacji TensorFlow lub użyć zwykłych funkcji TensorFlow, jak pokazano poniżej.

def preprocessing_fn(inputs):
  """tf.transform's callback function for preprocessing inputs.

  Args:
    inputs: map from feature keys to raw not-yet-transformed features.

  Returns:
    Map from string feature key to transformed feature operations.
  """
  outputs = {}
  for key in _DENSE_FLOAT_FEATURE_KEYS:
    # If sparse make it dense, setting nan's to 0 or '', and apply zscore.
    outputs[_transformed_name(key)] = transform.scale_to_z_score(
        _fill_in_missing(inputs[key]))

  for key in _VOCAB_FEATURE_KEYS:
    # Build a vocabulary for this feature.
    outputs[_transformed_name(
        key)] = transform.compute_and_apply_vocabulary(
            _fill_in_missing(inputs[key]),
            top_k=_VOCAB_SIZE,
            num_oov_buckets=_OOV_SIZE)

  for key in _BUCKET_FEATURE_KEYS:
    outputs[_transformed_name(key)] = transform.bucketize(
        _fill_in_missing(inputs[key]), _FEATURE_BUCKET_COUNT)

  for key in _CATEGORICAL_FEATURE_KEYS:
    outputs[_transformed_name(key)] = _fill_in_missing(inputs[key])

  # Was this passenger a big tipper?
  taxi_fare = _fill_in_missing(inputs[_FARE_KEY])
  tips = _fill_in_missing(inputs[_LABEL_KEY])
  outputs[_transformed_name(_LABEL_KEY)] = tf.where(
      tf.is_nan(taxi_fare),
      tf.cast(tf.zeros_like(taxi_fare), tf.int64),
      # Test if the tip was > 20% of the fare.
      tf.cast(
          tf.greater(tips, tf.multiply(taxi_fare, tf.constant(0.2))), tf.int64))

  return outputs

Zrozumienie danych wejściowych do preprocessing_fn

preprocessing_fn opisuje serię operacji na tensorach (czyli Tensor s, SparseTensor s lub RaggedTensor s). Aby poprawnie zdefiniować preprocessing_fn , konieczne jest zrozumienie, w jaki sposób dane są reprezentowane jako tensory. Dane wejściowe do preprocessing_fn są określane przez schemat. Proto Schema jest ostatecznie konwertowane na „specyfikację funkcji” (czasami nazywaną „specyfikacją parsowania”), która jest używana do analizowania danych, zobacz więcej szczegółów na temat logiki konwersji tutaj .

Używanie TensorFlow Transform do obsługi etykiet łańcuchowych

Zwykle chce się użyć TensorFlow Transform zarówno do generowania słownictwa, jak i stosowania tego słownictwa do konwersji ciągów znaków na liczby całkowite. Podczas wykonywania tego przepływu pracy input_fn skonstruowany w modelu spowoduje wyprowadzenie ciągu całkowitoliczbowego. Jednak etykiety są wyjątkiem, ponieważ aby model mógł odwzorować etykiety wyjściowe (liczby całkowite) z powrotem na ciągi, model potrzebuje input_fn do wyprowadzenia etykiety ciągu wraz z listą możliwych wartości etykiety. Np. jeśli etykietami są cat i dog , to wyjściem input_fn powinny być te nieprzetworzone ciągi znaków, a klucze ["cat", "dog"] muszą zostać przekazane do estymatora jako parametr (szczegóły poniżej).

Aby obsłużyć mapowanie etykiet ciągów na liczby całkowite, należy użyć TensorFlow Transform do wygenerowania słownika. Pokazujemy to w poniższym fragmencie kodu:

def _preprocessing_fn(inputs):
  """Preprocess input features into transformed features."""

  ...


  education = inputs[features.RAW_LABEL_KEY]
  _ = tft.vocabulary(education, vocab_filename=features.RAW_LABEL_KEY)

  ...

Powyższa funkcja przetwarzania wstępnego pobiera surową cechę wejściową (która również zostanie zwrócona jako część danych wyjściowych funkcji przetwarzania wstępnego) i wywołuje na niej tft.vocabulary . Powoduje to wygenerowanie słownictwa dla education , do którego można uzyskać dostęp w modelu.

Przykład pokazuje również, jak przekształcić etykietę, a następnie wygenerować słownik dla przekształconej etykiety. W szczególności zajmuje się surową education etykiet i konwertuje wszystkie etykiety oprócz 5 najlepszych (według częstotliwości) na UNKNOWN , bez konwersji etykiety na liczbę całkowitą.

W kodzie modelu klasyfikator musi otrzymać słownictwo wygenerowane przez tft.vocabulary jako argument label_vocabulary . Odbywa się to poprzez pierwsze przeczytanie tego słownictwa jako listy z funkcją pomocniczą. Widać to na poniższym fragmencie. Zwróć uwagę, że przykładowy kod używa przekształconej etykiety omówionej powyżej, ale tutaj pokazujemy kod do używania surowej etykiety.

def create_estimator(pipeline_inputs, hparams):

  ...

  tf_transform_output = trainer_util.TFTransformOutput(
      pipeline_inputs.transform_dir)

  # vocabulary_by_name() returns a Python list.
  label_vocabulary = tf_transform_output.vocabulary_by_name(
      features.RAW_LABEL_KEY)

  return tf.contrib.learn.DNNLinearCombinedClassifier(
      ...
      n_classes=len(label_vocab),
      label_vocabulary=label_vocab,
      ...)

Konfigurowanie statystyk przed i po transformacji

Jak wspomniano powyżej, komponent Transform wywołuje TFDV w celu obliczenia statystyk zarówno przed, jak i po transformacji. TFDV przyjmuje jako dane wejściowe opcjonalny obiekt StatsOptions . Użytkownicy mogą chcieć skonfigurować ten obiekt, aby włączyć pewne dodatkowe statystyki (np. statystyki NLP) lub ustawić sprawdzane progi (np. minimalna / maksymalna częstotliwość tokenów). Aby to zrobić, zdefiniuj stats_options_updater_fn w pliku modułu.

def stats_options_updater_fn(stats_type, stats_options):
  ...
  if stats_type == stats_options_util.StatsType.PRE_TRANSFORM:
    # Update stats_options to modify pre-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  if stats_type == stats_options_util.StatsType.POST_TRANSFORM
    # Update stats_options to modify post-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  return stats_options

Statystyki po transformacji często korzystają ze znajomości słownictwa używanego do wstępnego przetwarzania funkcji. Nazwa słownika do mapowania ścieżek jest dostarczana do StatsOptions (a więc TFDV) dla każdego słownika generowanego przez TFT. Dodatkowo, mapowania dla słowników tworzonych zewnętrznie mogą być dodawane przez (i) bezpośrednią modyfikację słownika vocab_paths w StatsOptions lub przez (ii) użycie tft.annotate_asset .