جزء انتقال TFX Pipeline

مؤلفه خط لوله Transform TFX مهندسی ویژگی را روی tf انجام می دهد. مثال هایی که از یک مؤلفه ExampleGen با استفاده از یک طرح داده ایجاد شده توسط مؤلفه SchemaGen ایجاد شده است، و هم SavedModel و هم آماری را در مورد داده های قبل و بعد از تبدیل منتشر می کند. هنگام اجرا، SavedModel tf.Examples منتشر شده از یک جزء ExampleGen را می پذیرد و داده های ویژگی تبدیل شده را منتشر می کند.

  • مصرف می کند: tf.Examples از یک جزء ExampleGen، و یک طرح داده از یک جزء SchemaGen.
  • Emits: SavedModel to a Trainer Component، آمارهای قبل و بعد از تبدیل.

پیکربندی کامپوننت تبدیل

هنگامی که preprocessing_fn شما نوشته شد، باید در یک ماژول پایتون تعریف شود که سپس به عنوان ورودی به کامپوننت Transform ارائه می شود. این ماژول با تبدیل بارگذاری می شود و تابعی به نام preprocessing_fn پیدا می شود و توسط Transform برای ساخت خط لوله پیش پردازش استفاده می شود.

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

علاوه بر این، ممکن است بخواهید گزینه هایی را برای محاسبات آماری پیش از تبدیل یا پس از تبدیل مبتنی بر TFDV ارائه دهید. برای انجام این کار، یک stats_options_updater_fn در همان ماژول تعریف کنید.

تبدیل و تبدیل TensorFlow

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

  • جاسازی : تبدیل ویژگی‌های پراکنده (مانند شناسه‌های عدد صحیح تولید شده توسط واژگان) به ویژگی‌های متراکم با یافتن یک نقشه‌برداری معنادار از فضای با ابعاد بالا به فضای کم ابعاد. برای مقدمه‌ای بر جاسازی‌ها ، واحد Embeddings را در دوره آموزشی Crash-Learning Machine ببینید.
  • تولید واژگان : تبدیل رشته ها یا سایر ویژگی های غیر عددی به اعداد صحیح با ایجاد واژگانی که هر مقدار منحصر به فرد را به یک شماره شناسه نگاشت می کند.
  • عادی سازی مقادیر : تبدیل ویژگی های عددی به طوری که همه آنها در یک محدوده مشابه قرار گیرند.
  • سطل سازی : تبدیل ویژگی های با ارزش پیوسته به ویژگی های طبقه بندی شده با تخصیص مقادیر به سطل های گسسته.
  • غنی‌سازی ویژگی‌های متن : تولید ویژگی‌هایی از داده‌های خام مانند نشانه‌ها، n-gram، موجودیت‌ها، احساسات و غیره برای غنی‌سازی مجموعه ویژگی‌ها.

TensorFlow Transform از این و بسیاری از انواع دیگر تبدیل ها پشتیبانی می کند:

  • به طور خودکار یک واژگان از آخرین داده های خود ایجاد کنید.

  • قبل از ارسال داده ها به مدل خود، تغییرات دلخواه را روی داده های خود انجام دهید. TensorFlow Transform تبدیل‌ها را در نمودار TensorFlow برای مدل شما ایجاد می‌کند، بنابراین همان تبدیل‌ها در زمان آموزش و استنتاج انجام می‌شود. می‌توانید تبدیل‌هایی را تعریف کنید که به ویژگی‌های کلی داده‌ها، مانند حداکثر مقدار یک ویژگی در تمام نمونه‌های آموزشی اشاره می‌کنند.

قبل از اجرای TFX می توانید داده های خود را هر طور که دوست دارید تغییر دهید. اما اگر این کار را در TensorFlow Transform انجام دهید، تبدیل‌ها بخشی از نمودار TensorFlow می‌شوند. این رویکرد به جلوگیری از کج بودن آموزش/سرویس کمک می‌کند.

تبدیل‌های درون کد مدل‌سازی شما از FeatureColumns استفاده می‌کنند. با استفاده از FeatureColumns، می‌توانید سطل‌سازی‌ها، integerizationهایی که از واژگان از پیش تعریف‌شده استفاده می‌کنند، یا هر تبدیل دیگری که می‌تواند بدون نگاه کردن به داده‌ها تعریف شود را تعریف کنید.

در مقابل، TensorFlow Transform برای تبدیل‌هایی طراحی شده است که نیاز به عبور کامل از داده‌ها برای محاسبه مقادیری دارند که از قبل مشخص نیستند. به عنوان مثال، تولید واژگان نیاز به عبور کامل از داده ها دارد.

علاوه بر محاسبه مقادیر با استفاده از پرتو آپاچی، TensorFlow Transform به کاربران اجازه می دهد تا این مقادیر را در یک نمودار TensorFlow جاسازی کنند، که سپس می تواند در گراف آموزشی بارگذاری شود. به عنوان مثال هنگام عادی سازی ویژگی ها، تابع tft.scale_to_z_score میانگین و انحراف استاندارد یک ویژگی را محاسبه می کند، و همچنین در نمودار TensorFlow، تابعی را که میانگین را کم کرده و بر انحراف استاندارد تقسیم می کند، محاسبه می کند. با انتشار یک نمودار TensorFlow، نه فقط آمار، TensorFlow Transform فرآیند نوشتن خط لوله پیش پردازش شما را ساده می کند.

از آنجایی که پیش پردازش به صورت یک نمودار بیان می شود، می تواند در سرور اتفاق بیفتد و تضمین می شود که بین آموزش و سرویس دهی سازگار باشد. این یکنواختی یک منبع کج بودن آموزش/سرویس را حذف می کند.

TensorFlow Transform به کاربران اجازه می دهد تا خط لوله پیش پردازش خود را با استفاده از کد TensorFlow مشخص کنند. این بدان معنی است که یک خط لوله به همان روشی که یک نمودار TensorFlow ساخته می شود. اگر فقط از عملیات تنسورفلو در این نمودار استفاده می شد، خط لوله یک نقشه خالص خواهد بود که دسته های ورودی را می پذیرد و دسته هایی از خروجی را برمی گرداند. چنین خط لوله ای معادل قرار دادن این نمودار در داخل input_fn شما هنگام استفاده از tf.Estimator API است. به منظور مشخص کردن عملیات تمام گذر مانند چندک های محاسباتی، TensorFlow Transform توابع خاصی به نام analyzers ارائه می دهد که شبیه عملیات TensorFlow به نظر می رسد، اما در واقع یک محاسبه معوق را مشخص می کند که توسط پرتو آپاچی انجام می شود و خروجی به عنوان یک نمودار درج می شود. ثابت. در حالی که یک عملیات TensorFlow معمولی یک دسته را به عنوان ورودی خود می گیرد، مقداری محاسبات را فقط روی آن دسته انجام می دهد و یک دسته را منتشر می کند، یک analyzer یک کاهش سراسری (اجرا شده در Apache Beam) روی همه دسته ها انجام می دهد و نتیجه را برمی گرداند.

با ترکیب عملیات معمولی TensorFlow و تحلیلگرهای TensorFlow Transform، کاربران می توانند خطوط لوله پیچیده ای را برای پیش پردازش داده های خود ایجاد کنند. برای مثال تابع tft.scale_to_z_score یک تانسور ورودی می گیرد و آن تانسور نرمال شده را به میانگین 0 و واریانس 1 برمی گرداند. این کار را با فراخوانی تحلیلگرهای mean و var در زیر هود انجام می دهد، که به طور موثر ثابت هایی را در نمودار برابر با میانگین و واریانس تانسور ورودی ایجاد می کند. سپس از TensorFlow ops برای تفریق میانگین و تقسیم بر انحراف استاندارد استفاده می کند.

TensorFlow Transform preprocessing_fn

مؤلفه TFX Transform استفاده از Transform را با مدیریت فراخوانی های API مربوط به خواندن و نوشتن داده ها و نوشتن خروجی SavedModel روی دیسک ساده می کند. به عنوان یک کاربر TFX، فقط باید یک تابع به نام preprocessing_fn تعریف کنید. در preprocessing_fn شما یک سری توابع را تعریف می کنید که دیکت ورودی تانسورها را برای تولید دیکته خروجی تانسورها دستکاری می کند. می‌توانید توابع کمکی مانند scale_to_0_1 و compute_and_apply_vocabulary TensorFlow Transform API را پیدا کنید یا از توابع معمولی TensorFlow مانند شکل زیر استفاده کنید.

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

درک ورودی های preprocessing_fn

preprocessing_fn یک سری عملیات روی تانسورها (یعنی TensorSparseTensor s یا RaggedTensor s) را توصیف می کند. به منظور تعریف صحیح preprocessing_fn لازم است درک کنیم که چگونه داده ها به عنوان تانسور نمایش داده می شوند. ورودی preprocessing_fn توسط طرحواره تعیین می شود. یک پروتو Schema در نهایت به یک "مشخصات ویژگی" (که گاهی اوقات "مشخصات تجزیه" نامیده می شود) تبدیل می شود که برای تجزیه داده ها استفاده می شود، جزئیات بیشتر در مورد منطق تبدیل را اینجا ببینید.

استفاده از TensorFlow Transform برای رسیدگی به برچسب های رشته

معمولاً کسی می خواهد از TensorFlow Transform استفاده کند تا هم یک واژگان تولید کند و هم از آن واژگان برای تبدیل رشته ها به اعداد صحیح استفاده کند. هنگام دنبال کردن این گردش کار، input_fn ساخته شده در مدل، رشته صحیح را خروجی می‌دهد. با این حال، برچسب‌ها یک استثنا هستند، زیرا برای اینکه مدل بتواند برچسب‌های خروجی (اعداد صحیح) را به رشته‌ها نگاشت کند، مدل به input_fn برای خروجی یک برچسب رشته، همراه با لیستی از مقادیر ممکن برچسب نیاز دارد. به عنوان مثال، اگر برچسب‌ها cat و dog هستند، خروجی input_fn باید این رشته‌های خام باشد، و کلیدهای ["cat", "dog"] باید به عنوان پارامتر به تخمین‌گر منتقل شوند (جزئیات را در زیر ببینید).

به منظور نگاشت برچسب های رشته به اعداد صحیح، باید از TensorFlow Transform برای تولید واژگان استفاده کنید. ما این را در قطعه کد زیر نشان می دهیم:

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)

  ...

تابع پیش پردازش بالا ویژگی ورودی خام را می گیرد (که به عنوان بخشی از خروجی تابع پیش پردازش نیز بازگردانده می شود) و tft.vocabulary را روی آن فراخوانی می کند. این منجر به تولید واژگانی برای education می شود که در مدل قابل دسترسی است.

این مثال همچنین نحوه تبدیل یک برچسب و سپس تولید واژگان برای برچسب تبدیل شده را نشان می دهد. به ویژه education برچسب خام را در نظر می گیرد و بدون تبدیل برچسب به UNKNOWN ، همه به جز 5 برچسب برتر (بر اساس فرکانس) را به ناشناخته تبدیل می کند.

در کد مدل، طبقه‌بندی‌کننده باید واژگان تولید شده توسط tft.vocabulary را به عنوان آرگومان label_vocabulary داده شود. این کار با خواندن ابتدا این واژگان به عنوان یک لیست با یک تابع کمکی انجام می شود. این در قطعه زیر نشان داده شده است. توجه داشته باشید که کد مثال از برچسب تبدیل شده استفاده می‌کند، اما در اینجا کدی را برای استفاده از برچسب خام نشان می‌دهیم.

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,
      ...)

پیکربندی آمار قبل و بعد از تبدیل

همانطور که در بالا ذکر شد، مولفه Transform برای محاسبه آمار قبل و بعد از تبدیل TFDV را فراخوانی می کند. TFDV یک شی StatsOptions اختیاری را به عنوان ورودی می گیرد. کاربران ممکن است بخواهند این شیء را برای فعال کردن آمارهای اضافی خاص (مثلاً آمار NLP) یا تعیین آستانه هایی که تأیید شده اند (مثلاً حداقل / حداکثر فرکانس نشانه) پیکربندی کنند. برای انجام این کار، یک stats_options_updater_fn در فایل ماژول تعریف کنید.

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

آمار پس از تبدیل اغلب از دانش واژگانی که برای پیش پردازش یک ویژگی استفاده می شود سود می برد. نام واژگان به نگاشت مسیر به StatsOptions (و بنابراین TFDV) برای هر واژگان تولید شده توسط TFT ارائه می شود. علاوه بر این، نگاشت واژگان ایجاد شده خارجی را می توان با (i) تغییر مستقیم فرهنگ لغت vocab_paths در StatsOptions یا (ii) با استفاده از tft.annotate_asset اضافه کرد.