Pomoc chronić Wielkiej Rafy Koralowej z TensorFlow na Kaggle Dołącz Wyzwanie

Wstępne przetwarzanie danych za pomocą TensorFlow Transform

Komponent inżynierii funkcji TensorFlow Extended (TFX)

Ten przykład colab notebook zapewnia bardzo prosty przykład jak TensorFlow Transform ( tf.Transform ) mogą być stosowane do danych przetwarzania wstępnego stosując dokładnie ten sam kod zarówno szkolenia modelu i obsługujących wnioski w produkcji.

TensorFlow Transform to biblioteka do wstępnego przetwarzania danych wejściowych dla TensorFlow, w tym tworzenia funkcji wymagających pełnego przejścia przez treningowy zestaw danych. Na przykład za pomocą TensorFlow Transform możesz:

  • Normalizuj wartość wejściową, używając średniej i odchylenia standardowego
  • Konwertuj łańcuchy na liczby całkowite, generując słownik dla wszystkich wartości wejściowych
  • Konwertuj liczby zmiennoprzecinkowe na liczby całkowite, przypisując je do segmentów na podstawie obserwowanego rozkładu danych

TensorFlow ma wbudowaną obsługę manipulacji na pojedynczym przykładzie lub partii przykładów. tf.Transform rozszerza te możliwości, aby wspierać pełne przechodzi nad całym zbiorze treningowym.

Wyjście tf.Transform jest eksportowana w postaci wykresu TensorFlow, które można wykorzystać zarówno do treningu i serwowania. Używanie tego samego wykresu zarówno do trenowania, jak i obsługi może zapobiec przekrzywieniu, ponieważ te same przekształcenia są stosowane na obu etapach.

Ulepsz Pip

Aby uniknąć aktualizacji Pip w systemie uruchomionym lokalnie, upewnij się, że działamy w Colab. Systemy lokalne można oczywiście aktualizować oddzielnie.

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

Zainstaluj TensorFlow Transform

pip install -q -U tensorflow_transform==0.24.1

Czy uruchomiłeś ponownie środowisko wykonawcze?

Jeśli używasz Google Colab, przy pierwszym uruchomieniu powyższej komórki musisz ponownie uruchomić środowisko wykonawcze (Runtime > Restart runtime ...). Wynika to ze sposobu, w jaki Colab ładuje paczki.

Import

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
2021-12-04 10:36:49.432439: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory

Dane: Utwórz fałszywe dane

Stworzymy kilka prostych fikcyjnych danych dla naszego prostego przykładu:

  • raw_data jest początkową surowe dane, które mamy zamiar Preprocesuj
  • raw_data_metadata zawiera schemat, który mówi nam typy każdej z kolumn w raw_data . W tym przypadku sprawa jest bardzo prosta.
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),
    }))

Przekształć: Utwórz funkcję przetwarzania wstępnego

Funkcja przerób jest najważniejsza koncepcja tf.Transform. Funkcja przetwarzania wstępnego to miejsce, w którym naprawdę zachodzi transformacja zestawu danych. Przyjmuje i zwraca słownika tensorów którym napinacz oznacza Tensor lubSparseTensor . Istnieją dwie główne grupy wywołań API, które zazwyczaj tworzą serce funkcji przetwarzania wstępnego:

  1. TensorFlow ops: Każda funkcja, która przyjmuje i powraca tensory, co zazwyczaj oznacza, ops TensorFlow. Dodają one operacje TensorFlow do wykresu, który przekształca nieprzetworzone dane w dane przekształcone po jednym wektorze cech naraz. Będą one działać na każdym przykładzie, zarówno podczas treningu, jak i podania.
  2. Tensorflow Transform Analizatory / odwzorowujące: Każdy z analizatorów / mappers świadczonych przez tf.Transform. Akceptują one również i zwracają tensory i zazwyczaj zawierają kombinację operacji Tensorflow i obliczeń Beam, ale w przeciwieństwie do operacji TensorFlow działają one tylko w potoku Beam podczas analizy wymagającej pełnego przejścia przez cały zestaw danych treningowych. Obliczenie wiązki jest wykonywane tylko raz, podczas uczenia i zazwyczaj wykonuje pełny przebieg przez cały uczący zestaw danych. Tworzą one stałe tensorowe, które są dodawane do Twojego wykresu. Na przykład tft.min oblicza minimum tensora w uczącym zestawie danych, podczas gdy tft.scale_by_min_max najpierw oblicza min i maksimum tensora w uczącym zestawie danych, a następnie skaluje tensor tak, aby mieścił się w zakresie określonym przez użytkownika, [output_min, output_max]. tf.Transform zapewnia stały zestaw takich analizatorów/maperów, ale zostanie on rozszerzony w przyszłych wersjach.
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,
    }

Kładąc wszystko razem

Teraz jesteśmy gotowi do przekształcenia naszych danych. Użyjemy Apache Beam z bezpośrednim runnerem i dostarczymy trzy dane wejściowe:

  1. raw_data - Surowe dane wejściowe, które stworzyliśmy powyżej
  2. raw_data_metadata - Schemat dla danych surowych
  3. preprocessing_fn - Funkcja które stworzyliśmy, aby wykonać naszą transformację
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.4) 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.4) 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.4) 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.
2021-12-04 10:36:53.509410: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory
2021-12-04 10:36:53.509550: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcublas.so.10'; dlerror: libcublas.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:53.511132: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:53.511207: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcusparse.so.10'; dlerror: libcusparse.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:55.915819: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1753] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
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/tmpkna9acoi/tftransform_tmp/a5ed953ca79c40928ed395f17a62dd60/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpkna9acoi/tftransform_tmp/a5ed953ca79c40928ed395f17a62dd60/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/tmpkna9acoi/tftransform_tmp/8cf4760564cd4ca883a37862ebd6adf3/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpkna9acoi/tftransform_tmp/8cf4760564cd4ca883a37862ebd6adf3/saved_model.pb
WARNING:tensorflow:Tensorflow version (2.3.4) 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.4) 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: ['/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py', '-f', '/tmp/tmp1e0i3s6r.json', '--HistoryManager.hist_file=:memory:']
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
2021-12-04 10:36:57.429894: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory
2021-12-04 10:36:57.430028: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcublas.so.10'; dlerror: libcublas.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:57.430105: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:57.430179: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcusparse.so.10'; dlerror: libcusparse.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:57.430197: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1753] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
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/tmpkna9acoi/tftransform_tmp/8347ab3739e64ab4ab4ef1ec0e3f5b3c/assets
INFO:tensorflow:Assets written to: /tmp/tmpkna9acoi/tftransform_tmp/8347ab3739e64ab4ab4ef1ec0e3f5b3c/assets
INFO:tensorflow:SavedModel written to: /tmp/tmpkna9acoi/tftransform_tmp/8347ab3739e64ab4ab4ef1ec0e3f5b3c/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpkna9acoi/tftransform_tmp/8347ab3739e64ab4ab4ef1ec0e3f5b3c/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"
2021-12-04 10:36:58.058030: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory
2021-12-04 10:36:58.058120: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcublas.so.10'; dlerror: libcublas.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:58.058198: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:58.058256: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcusparse.so.10'; dlerror: libcusparse.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:36:58.058291: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1753] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
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}]

Czy to właściwa odpowiedź?

Wcześniej używaliśmy tf.Transform aby to zrobić:

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

Przy wejściu [1, 2, 3] średnia x oznacza 2, i odjąć go od x do Center wartości X w 0. Dlatego nasz wynikiem [-1.0, 0.0, 1.0] jest prawidłowe.

y_znormalizowane

Chcieliśmy dopasowywać y wartości pomiędzy 0 i 1. Nasze wsadowego [1, 2, 3] , więc nasz wyniku [0.0, 0.5, 1.0] jest prawidłowe.

s_zintegrowany

Chcieliśmy odwzorować nasze łańcuchy na indeksy w słowniku, a w naszym słowniku były tylko 2 słowa („hello” i „world”). Więc z wejściem ["hello", "world", "hello"] nasza wyniku [0, 1, 0] jest prawidłowe. Ponieważ słowo „cześć” występuje w tych danych najczęściej, będzie to pierwszy wpis w słowniku.

x_centered_times_y_normalized

Chcieliśmy stworzyć nową funkcję przez skrzyżowanie x_centered i y_normalized za pomocą mnożenia. Należy zauważyć, że ten mnoży wyniki, a nie oryginalne wartości, i nowo wynikiem [-0.0, 0.0, 1.0] jest prawidłowe.