TensorFlow Transform ile verileri ön işleme

TensorFlow Extended'ın (TFX) Özellik Mühendisliği Bileşeni

Bu örnek ortak çalışma not defteri, TensorFlow Transform'un ( tf.Transform ) hem bir modeli eğitmek hem de üretimde çıkarımlar sunmak için tamamen aynı kodu kullanarak verileri önceden işlemek için nasıl kullanılabileceğine dair çok basit bir örnek sağlar.

TensorFlow Transform, eğitim veri kümesi üzerinde tam geçiş gerektiren özelliklerin oluşturulması da dahil olmak üzere, TensorFlow için giriş verilerini ön işlemeye yönelik bir kitaplıktır. Örneğin, TensorFlow Transform kullanarak şunları yapabilirsiniz:

  • Ortalama ve standart sapmayı kullanarak bir giriş değerini normalleştirin
  • Tüm giriş değerleri üzerinde bir sözlük oluşturarak dizeleri tam sayılara dönüştürün
  • Gözlenen veri dağılımına dayalı olarak, kayan noktaları kovalara atayarak tam sayılara dönüştürün

TensorFlow, tek bir örnek veya bir grup örnek üzerinde manipülasyonlar için yerleşik desteğe sahiptir. tf.Transform , tüm eğitim veri kümesi üzerinde tam geçişleri desteklemek için bu yetenekleri genişletir.

tf.Transform çıktısı, hem eğitim hem de sunum için kullanabileceğiniz bir TensorFlow grafiği olarak dışa aktarılır. Her iki aşamada da aynı dönüşümler uygulandığından, hem eğitim hem de servis için aynı grafiğin kullanılması çarpıklığı önleyebilir.

Pip'i Yükselt

Yerel olarak çalışırken bir sistemde Pip'i yükseltmekten kaçınmak için Colab'da çalıştığımızdan emin olun. Yerel sistemler elbette ayrı ayrı yükseltilebilir.

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

TensorFlow Transform'u yükleyin

pip install -q -U tensorflow_transform

Çalışma zamanını yeniden başlattınız mı?

Google Colab kullanıyorsanız, yukarıdaki hücreyi ilk kez çalıştırdığınızda, çalışma zamanını yeniden başlatmanız gerekir (Çalışma Zamanı > Çalışma zamanını yeniden başlat...). Bunun nedeni Colab'ın paketleri yükleme şeklidir.

ithalat

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

Veri: Bazı yapay veriler oluşturun

Basit örneğimiz için bazı basit yapay veriler oluşturacağız:

  • raw_data , önceden işleyeceğimiz ilk ham veridir.
  • raw_data_metadata , raw_data içindeki her bir sütunun türünü bize söyleyen şemayı içerir. Bu durumda, çok basit.
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),
    }))

Dönüştür: Bir ön işleme işlevi oluşturun

Önişleme işlevi , tf.Transform'un en önemli kavramıdır. Bir ön işleme işlevi, veri kümesinin dönüşümünün gerçekten gerçekleştiği yerdir. Bir tensörün bir Tensor veyaSparseTensor anlamına geldiği bir tensör sözlüğünü kabul eder ve döndürür. Genellikle bir ön işleme işlevinin kalbini oluşturan iki ana API çağrısı grubu vardır:

  1. TensorFlow Ops: Genellikle TensorFlow ops anlamına gelen, tensörleri kabul eden ve döndüren herhangi bir işlev. Bunlar, ham verileri dönüştürülmüş verilere her seferinde bir özellik vektörü dönüştüren grafiğe TensorFlow işlemlerini ekler. Bunlar, hem antrenman hem de servis sırasında her örnek için çalışacaktır.
  2. Tensorflow Dönüşüm Çözümleyicileri/Eşleştiricileri: tf.Transform tarafından sağlanan çözümleyicilerden/eşleştiricilerden herhangi biri. Bunlar ayrıca tensörleri kabul eder ve döndürür ve tipik olarak Tensorflow ops ve Beam hesaplamasının bir kombinasyonunu içerir, ancak TensorFlow ops'un aksine, bunlar yalnızca tüm eğitim veri kümesi üzerinde tam bir geçiş gerektiren analiz sırasında Beam ardışık düzeninde çalışırlar. Işın hesaplaması, eğitim sırasında yalnızca bir kez çalışır ve tipik olarak tüm eğitim veri kümesi üzerinde tam bir geçiş yapar. Grafiğinize eklenen tensör sabitleri oluştururlar. Örneğin, tft.min, eğitim veri kümesi üzerindeki minimum tensörü hesaplarken tft.scale_by_min_max, önce eğitim veri kümesi üzerindeki bir tensörün minimum ve maksimum değerini hesaplar ve ardından tensörü, kullanıcı tarafından belirtilen bir aralık içinde olacak şekilde ölçekler, [output_min, çıktı_maks]. tf.Transform, bu tür çözümleyicilerin/eşleyicilerin sabit bir kümesini sağlar, ancak bu, gelecek sürümlerde genişletilecektir.
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,
    }

Hepsini bir araya koy

Artık verilerimizi dönüştürmeye hazırız. Apache Beam'i doğrudan bir koşucu ile kullanacağız ve üç girdi sağlayacağız:

  1. raw_data - Yukarıda oluşturduğumuz ham girdi verileri
  2. raw_data_metadata - Ham veriler için şema
  3. preprocessing_fn - Dönüşümümüzü yapmak için oluşturduğumuz fonksiyon
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()
tutucu6 l10n-yer
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: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:289: 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:289: 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: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/tmp8aif_7w8.json', '--HistoryManager.hist_file=:memory:']
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets
2022-02-03 10:18:41.378629: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:struct2tensor is not available.
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}]

Bu doğru cevap mı?

Önceden, bunu yapmak için tf.Transform kullanıyorduk:

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

[1, 2, 3] girişi ile x'in ortalaması 2'dir ve x değerlerimizi 0'da ortalamak için onu x'ten çıkarırız. Dolayısıyla [-1.0, 0.0, 1.0] sonucumuz doğrudur.

y_normalize

Y değerlerimizi 0 ile 1 arasında ölçeklendirmek istedik. Girdimiz [1, 2, 3] idi, dolayısıyla [0.0, 0.5, 1.0] sonucumuz doğru.

s_integerized

Dizelerimizi bir sözlükteki dizinlere eşlemek istedik ve kelime dağarcığımızda sadece 2 kelime vardı ("merhaba" ve "dünya"). Yani ["hello", "world", "hello"] girdisiyle [0, 1, 0] sonucumuz doğrudur. "Merhaba" en sık bu verilerde geçtiğinden, kelime dağarcığındaki ilk giriş olacaktır.

x_centered_times_y_normalized

x_centered ve y_normalized çarpımını kullanarak yeni bir özellik oluşturmak istedik. Bunun orijinal değerleri değil sonuçları çarptığını ve yeni [-0.0, 0.0, 1.0] doğru olduğunu unutmayın.