پیش پردازش داده ها با TensorFlow Transform

مؤلفه مهندسی ویژگی TensorFlow Extended (TFX)

این نمونه نوت بوک colab مثال بسیار ساده ای از چگونگی استفاده از TensorFlow Transform ( tf.Transform ) برای پیش پردازش داده ها با استفاده از کدهای مشابه برای آموزش یک مدل و ارائه استنتاج در تولید ارائه می دهد.

TensorFlow Transform یک کتابخانه برای پیش پردازش داده های ورودی برای TensorFlow است، از جمله ایجاد ویژگی هایی که نیاز به عبور کامل از مجموعه داده آموزشی دارد. به عنوان مثال، با استفاده از TensorFlow Transform می توانید:

  • یک مقدار ورودی را با استفاده از میانگین و انحراف استاندارد عادی کنید
  • تبدیل رشته ها به اعداد صحیح با ایجاد یک واژگان بر روی تمام مقادیر ورودی
  • با تخصیص آنها به سطل ها، بر اساس توزیع داده های مشاهده شده، شناورها را به اعداد صحیح تبدیل کنید.

TensorFlow دارای پشتیبانی داخلی برای دستکاری در یک نمونه یا مجموعه ای از نمونه ها است. tf.Transform این قابلیت ها را برای پشتیبانی از پاس های کامل در کل مجموعه داده آموزشی گسترش می دهد.

خروجی tf.Transform به عنوان یک نمودار TensorFlow صادر می شود که می توانید هم برای آموزش و هم برای ارائه از آن استفاده کنید. استفاده از نمودار یکسان برای آموزش و سرویس دهی می تواند از انحراف جلوگیری کند، زیرا در هر دو مرحله تغییرات یکسانی اعمال می شود.

پیپ را ارتقا دهید

برای جلوگیری از ارتقاء Pip در سیستم هنگام اجرای محلی، بررسی کنید که در Colab در حال اجرا هستیم. البته سیستم های محلی را می توان به طور جداگانه ارتقا داد.

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

TensorFlow Transform را نصب کنید

pip install -q -U tensorflow_transform

آیا زمان اجرا را مجدداً راه اندازی کردید؟

اگر از Google Colab استفاده می کنید، اولین باری که سلول بالا را اجرا می کنید، باید زمان اجرا را مجدداً راه اندازی کنید (Runtime > Restart runtime ...). این به دلیل روشی است که Colab بسته ها را بارگذاری می کند.

واردات

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

داده: تعدادی داده ساختگی ایجاد کنید

ما چند داده ساختگی ساده برای مثال ساده خود ایجاد خواهیم کرد:

  • raw_data داده های خام اولیه ای است که ما قصد داریم آن را پیش پردازش کنیم
  • raw_data_metadata شامل طرحی است که انواع هر یک از ستون های raw_data را به ما می گوید. در این مورد، بسیار ساده است.
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),
    }))

تبدیل: ایجاد یک تابع پیش پردازش

تابع پیش پردازش مهمترین مفهوم tf.Transform است. یک تابع پیش پردازش جایی است که تبدیل مجموعه داده واقعاً اتفاق می افتد. فرهنگ لغت تانسورها را می پذیرد و برمی گرداند، که در آن تانسور به معنای Tensor یاSparseTensor است. دو گروه اصلی از فراخوانی های API وجود دارد که معمولا قلب یک تابع پیش پردازش را تشکیل می دهند:

  1. TensorFlow Ops: هر تابعی که تانسورها را می‌پذیرد و برمی‌گرداند که معمولاً به معنای عملیات تنسورفلو است. اینها عملیات TensorFlow را به نمودار اضافه می‌کنند که داده‌های خام را در یک بردار ویژگی به داده‌های تبدیل شده تبدیل می‌کند. اینها برای هر نمونه، هم در حین آموزش و هم در حین خدمت اجرا خواهند شد.
  2. Tensorflow Transform Analyzer/Mappers: هر یک از تحلیلگرها/نقشه نگارهای ارائه شده توسط tf.Transform. اینها همچنین تانسورها را می‌پذیرند و برمی‌گردانند و معمولاً شامل ترکیبی از عملیات Tensorflow و محاسبات پرتو هستند، اما بر خلاف عملیات‌های TensorFlow، آنها فقط در خط لوله Beam در طول تجزیه‌وتحلیل اجرا می‌شوند که نیاز به عبور کامل از کل مجموعه داده آموزشی دارد. محاسبات Beam فقط یک بار در طول آموزش اجرا می شود و معمولاً کل مجموعه داده آموزشی را به طور کامل عبور می دهد. آنها ثابت های تانسور را ایجاد می کنند که به نمودار شما اضافه می شوند. به عنوان مثال، tft.min حداقل یک تانسور را روی مجموعه داده آموزشی محاسبه می‌کند، در حالی که tft.scale_by_min_max ابتدا حداقل و حداکثر یک تانسور را روی مجموعه داده آموزشی محاسبه می‌کند و سپس تانسور را در محدوده تعیین‌شده توسط کاربر مقیاس می‌دهد، [output_min, output_max]. tf.Transform مجموعه ثابتی از این تحلیلگرها/نقشه نگارها را فراهم می کند، اما این در نسخه های بعدی گسترش خواهد یافت.
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,
    }

همه اش را بگذار کنار هم

اکنون ما آماده ایم تا داده های خود را تغییر دهیم. ما از Apache Beam با رانر مستقیم استفاده می کنیم و سه ورودی را ارائه می دهیم:

  1. raw_data - داده های ورودی خامی که در بالا ایجاد کردیم
  2. raw_data_metadata - طرحی برای داده های خام
  3. preprocessing_fn - تابعی که برای انجام تبدیل خود ایجاد کردیم
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: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}]

آیا این پاسخ درست است؟

قبلاً برای انجام این کار از tf.Transform استفاده می کردیم:

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] ، میانگین x برابر 2 است، و آن را از x کم می کنیم تا مقادیر x خود را در 0 قرار دهیم. بنابراین نتیجه ما از [-1.0, 0.0, 1.0] صحیح است.

y_normalized

ما می خواستیم مقادیر y خود را بین 0 و 1 مقیاس کنیم. ورودی ما [1, 2, 3] بود، بنابراین نتیجه ما از [0.0, 0.5, 1.0] صحیح است.

s_integerized

ما می‌خواستیم رشته‌های خود را به نمایه‌های یک واژگان نگاشت کنیم و فقط 2 کلمه در واژگان ما وجود داشت ("سلام" و "دنیا"). بنابراین با ورودی ["hello", "world", "hello"] نتیجه ما از [0, 1, 0] صحیح است. از آنجایی که "سلام" بیشتر در این داده ها رخ می دهد، اولین ورودی در واژگان خواهد بود.

x_centered_times_y_normalized

ما می‌خواستیم با عبور از x_centered و y_normalized با ضرب کردن یک ویژگی جدید ایجاد کنیم. توجه داشته باشید که این نتایج را ضرب می کند، نه مقادیر اصلی، و نتیجه جدید ما از [-0.0, 0.0, 1.0] صحیح است.