Treten Sie der SIG TFX-Addons-Community bei und helfen Sie mit, TFX noch besser zu machen! SIG TFX-Addons beitreten

Daten mit TensorFlow Transform vorverarbeiten

Die Feature Engineering-Komponente von TensorFlow Extended (TFX)

Dieses Beispiel-Colab-Notizbuch bietet ein sehr einfaches Beispiel dafür, wie TensorFlow Transform ( tf.Transform ) verwendet werden kann, um Daten mit genau demselben Code tf.Transform um sowohl ein Modell zu trainieren als auch Schlussfolgerungen in der Produktion zu liefern.

TensorFlow Transform ist eine Bibliothek zur Vorverarbeitung von Eingabedaten für TensorFlow, einschließlich der Erstellung von Funktionen, für die ein vollständiger Durchlauf des Trainingsdatensatzes erforderlich ist. Mit TensorFlow Transform können Sie beispielsweise:

  • Normalisieren Sie einen Eingabewert mithilfe des Mittelwerts und der Standardabweichung
  • Konvertieren Sie Zeichenfolgen in Ganzzahlen, indem Sie ein Vokabular über alle Eingabewerte generieren
  • Konvertieren Sie Floats in Ganzzahlen, indem Sie sie basierend auf der beobachteten Datenverteilung Buckets zuweisen

TensorFlow bietet integrierte Unterstützung für Manipulationen an einem einzelnen Beispiel oder einer Reihe von Beispielen. tf.Transform erweitert diese Funktionen, um vollständige Durchläufe über den gesamten Trainingsdatensatz zu unterstützen.

Die Ausgabe von tf.Transform wird als TensorFlow-Diagramm exportiert, das Sie sowohl für das Training als auch für das Servieren verwenden können. Die Verwendung des gleichen Diagramms sowohl für das Training als auch für das Servieren kann einen Versatz verhindern, da in beiden Phasen dieselben Transformationen angewendet werden.

Upgrade Pip

Um zu vermeiden, dass Pip in einem System aktualisiert wird, wenn es lokal ausgeführt wird, stellen Sie sicher, dass wir in Colab ausgeführt werden. Lokale Systeme können natürlich separat aktualisiert werden.

try:
  import colab
  !pip install --upgrade pip
except:
  pass

Installieren Sie TensorFlow Transform

pip install -q -U tensorflow_transform==0.24.1

Haben Sie die Laufzeit neu gestartet?

Wenn Sie Google Colab verwenden und die obige Zelle zum ersten Mal ausführen, müssen Sie die Laufzeit neu starten (Laufzeit> Laufzeit neu starten ...). Dies liegt an der Art und Weise, wie Colab Pakete lädt.

Importe

import pprint
import tempfile

import tensorflow as tf
import tensorflow_transform as tft

import tensorflow_transform.beam as tft_beam
from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils

Daten: Erstellen Sie einige Dummy-Daten

Wir werden einige einfache Dummy-Daten für unser einfaches Beispiel erstellen:

  • raw_data sind die anfänglichen Rohdaten, die wir vorverarbeiten werden
  • raw_data_metadata enthält das Schema, das die Typen der einzelnen Spalten in raw_data . In diesem Fall ist es sehr einfach.
raw_data = [
      {'x': 1, 'y': 1, 's': 'hello'},
      {'x': 2, 'y': 2, 's': 'world'},
      {'x': 3, 'y': 3, 's': 'hello'}
  ]

raw_data_metadata = dataset_metadata.DatasetMetadata(
    schema_utils.schema_from_feature_spec({
        'y': tf.io.FixedLenFeature([], tf.float32),
        'x': tf.io.FixedLenFeature([], tf.float32),
        's': tf.io.FixedLenFeature([], tf.string),
    }))

Transformieren: Erstellen Sie eine Vorverarbeitungsfunktion

Die Vorverarbeitungsfunktion ist das wichtigste Konzept von tf.Transform. Bei einer Vorverarbeitungsfunktion erfolgt die Transformation des Datensatzes tatsächlich. Es akzeptiert einSparseTensor und gibt es zurück, wobei ein Tensor einen Tensor oderSparseTensor . Es gibt zwei Hauptgruppen von API-Aufrufen, die normalerweise das Herzstück einer Vorverarbeitungsfunktion bilden:

  1. TensorFlow-Operationen: Jede Funktion, die Tensoren akzeptiert und zurückgibt, was normalerweise TensorFlow-Operationen bedeutet. Diese fügen dem Diagramm TensorFlow-Operationen hinzu, die Rohdaten einzeln in transformierte Daten transformieren. Diese werden für jedes Beispiel sowohl während des Trainings als auch während des Servierens ausgeführt.
  2. Tensorflow-Transformationsanalysatoren / Mapper: Alle von tf.Transform bereitgestellten Analysatoren / Mapper. Diese akzeptieren und geben auch Tensoren zurück und enthalten normalerweise eine Kombination aus Tensorflow-Operationen und Beam-Berechnung. Im Gegensatz zu TensorFlow-Operationen werden sie jedoch nur während der Analyse in der Beam-Pipeline ausgeführt, wobei ein vollständiger Durchlauf des gesamten Trainingsdatensatzes erforderlich ist. Die Strahlberechnung wird während des Trainings nur einmal ausgeführt und durchläuft normalerweise den gesamten Trainingsdatensatz vollständig. Sie erstellen Tensorkonstanten, die Ihrem Diagramm hinzugefügt werden. Beispielsweise berechnet tft.min das Minimum eines Tensors über dem Trainingsdatensatz, während tft.scale_by_min_max zuerst das Min und Max eines Tensors über dem Trainingsdatensatz berechnet und dann den Tensor so skaliert, dass er innerhalb eines benutzerdefinierten Bereichs liegt [output_min, output_max]. tf.Transform bietet einen festen Satz solcher Analysatoren / Mapper, der jedoch in zukünftigen Versionen erweitert wird.
def preprocessing_fn(inputs):
    """Preprocess input columns into transformed columns."""
    x = inputs['x']
    y = inputs['y']
    s = inputs['s']
    x_centered = x - tft.mean(x)
    y_normalized = tft.scale_to_0_1(y)
    s_integerized = tft.compute_and_apply_vocabulary(s)
    x_centered_times_y_normalized = (x_centered * y_normalized)
    return {
        'x_centered': x_centered,
        'y_normalized': y_normalized,
        's_integerized': s_integerized,
        'x_centered_times_y_normalized': x_centered_times_y_normalized,
    }

Alles zusammenfügen

Jetzt sind wir bereit, unsere Daten zu transformieren. Wir werden Apache Beam mit einem direkten Läufer verwenden und drei Eingänge liefern:

  1. raw_data - Die rohen Eingabedaten, die wir oben erstellt haben
  2. raw_data_metadata - Das Schema für die Rohdaten
  3. preprocessing_fn - Die Funktion, die wir für unsere Transformation erstellt haben
def main():
  # Ignore the warnings
  with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
    transformed_dataset, transform_fn = (  # pylint: disable=unused-variable
        (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
            preprocessing_fn))

  transformed_data, transformed_metadata = transformed_dataset  # pylint: disable=unused-variable

  print('\nRaw data:\n{}\n'.format(pprint.pformat(raw_data)))
  print('Transformed data:\n{}'.format(pprint.pformat(transformed_data)))

if __name__ == '__main__':
  main()
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:218: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use ref() instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:218: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use ref() instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:No assets to write.
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
INFO:tensorflow:SavedModel written to: /tmp/tmpyjqmd8zx/tftransform_tmp/a0812edd940447aeb9bd8cca86f19136/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpyjqmd8zx/tftransform_tmp/a0812edd940447aeb9bd8cca86f19136/saved_model.pb
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:No assets to write.
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
INFO:tensorflow:SavedModel written to: /tmp/tmpyjqmd8zx/tftransform_tmp/ec933f1f949d40dbb39bfadf8b963b3f/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpyjqmd8zx/tftransform_tmp/ec933f1f949d40dbb39bfadf8b963b3f/saved_model.pb
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['/home/kbuilder/.local/lib/python3.7/site-packages/ipykernel_launcher.py', '-f', '/tmp/tmpe_bjh6uw.json', '--HistoryManager.hist_file=:memory:']
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets written to: /tmp/tmpyjqmd8zx/tftransform_tmp/2492704f81904b2e9d2b471e8e67103c/assets
INFO:tensorflow:Assets written to: /tmp/tmpyjqmd8zx/tftransform_tmp/2492704f81904b2e9d2b471e8e67103c/assets
INFO:tensorflow:SavedModel written to: /tmp/tmpyjqmd8zx/tftransform_tmp/2492704f81904b2e9d2b471e8e67103c/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpyjqmd8zx/tftransform_tmp/2492704f81904b2e9d2b471e8e67103c/saved_model.pb
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
Raw data:
[{'s': 'hello', 'x': 1, 'y': 1},
 {'s': 'world', 'x': 2, 'y': 2},
 {'s': 'hello', 'x': 3, 'y': 3}]

Transformed data:
[{'s_integerized': 0,
  'x_centered': -1.0,
  'x_centered_times_y_normalized': -0.0,
  'y_normalized': 0.0},
 {'s_integerized': 1,
  'x_centered': 0.0,
  'x_centered_times_y_normalized': 0.0,
  'y_normalized': 0.5},
 {'s_integerized': 0,
  'x_centered': 1.0,
  'x_centered_times_y_normalized': 1.0,
  'y_normalized': 1.0}]

Ist das die richtige Antwort?

Zuvor haben wir dazu tf.Transform verwendet:

x_centered = x - tft.mean(x)
y_normalized = tft.scale_to_0_1(y)
s_integerized = tft.compute_and_apply_vocabulary(s)
x_centered_times_y_normalized = (x_centered * y_normalized)

x_centered

Bei Eingabe von [1, 2, 3] der Mittelwert von x 2, und wir subtrahieren ihn von x, um unsere x-Werte bei 0 zu zentrieren. Unser Ergebnis von [-1.0, 0.0, 1.0] ist also korrekt.

y_normalisiert

Wir wollten unsere y-Werte zwischen 0 und 1 skalieren. Unsere Eingabe war [1, 2, 3] daher ist unser Ergebnis von [0.0, 0.5, 1.0] korrekt.

s_integerized

Wir wollten unsere Zeichenfolgen Indizes in einem Vokabular zuordnen, und unser Vokabular enthielt nur zwei Wörter ("Hallo" und "Welt"). Mit der Eingabe von ["hello", "world", "hello"] unser Ergebnis von [0, 1, 0] korrekt. Da "Hallo" in diesen Daten am häufigsten vorkommt, ist dies der erste Eintrag im Vokabular.

x_centered_times_y_normalized

Wir wollten ein neues Feature erstellen, indem x_centered und y_normalized mithilfe der Multiplikation y_normalized . Beachten Sie, dass dies die Ergebnisse multipliziert, nicht die ursprünglichen Werte, und dass unser neues Ergebnis von [-0.0, 0.0, 1.0] korrekt ist.