جزء انتقال 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 در دوره تصادفی یادگیری ماشینی مراجعه کنید.
  • تولید واژگان : تبدیل رشته ها یا سایر ویژگی های غیر عددی به اعداد صحیح با ایجاد واژگانی که هر مقدار منحصر به فرد را به یک شماره شناسه نگاشت می کند.
  • عادی سازی مقادیر : تبدیل ویژگی های عددی به طوری که همه آنها در یک محدوده مشابه قرار گیرند.
  • سطل سازی : تبدیل ویژگی های با ارزش پیوسته به ویژگی های طبقه بندی شده با تخصیص مقادیر به سطل های گسسته.
  • غنی‌سازی ویژگی‌های متن : تولید ویژگی‌هایی از داده‌های خام مانند نشانه‌ها، n-gram، موجودیت‌ها، احساسات و غیره برای غنی‌سازی مجموعه ویژگی‌ها.

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

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

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

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

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

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

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

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

TensorFlow Transform به کاربران اجازه می دهد خط لوله پیش پردازش خود را با استفاده از کد TensorFlow مشخص کنند. این بدان معنی است که یک خط لوله به همان روشی که یک نمودار 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 مجموعه‌ای از عملیات‌ها را بر روی تانسورها (یعنی Tensor s یا SparseTensor s) توصیف می‌کند و بنابراین برای نوشتن preprocessing_fn به درستی لازم است بدانید که چگونه داده‌های شما به عنوان تانسور نشان داده می‌شوند. ورودی preprocessing_fn توسط طرحواره تعیین می شود. پروتو Schema حاوی لیستی از Features است، و Transform آنها را به یک "مشخصات Feature " (که گاهی اوقات "مشخصات تجزیه" نامیده می شود) تبدیل می کند که یک دستور است که کلیدهای آن نام ویژگی ها و مقادیر آن یکی از FixedLenFeature یا VarLenFeature (یا موارد دیگر) است. گزینه هایی که توسط TensorFlow Transform استفاده نمی شوند).

قوانین برای استنباط یک ویژگی از Schema هستند

  • هر feature با مجموعه shape منجر به tf.FixedLenFeature با shape و default_value=None می شود. presence.min_fraction .min_fraction باید 1 باشد در غیر این صورت خطا ایجاد می شود، زیرا وقتی مقدار پیش فرض وجود ندارد، یک tf.FixedLenFeature نیاز دارد که این ویژگی همیشه وجود داشته باشد.
  • هر feature با shape تنظیم نشده منجر به یک VarLenFeature خواهد شد.
  • هر sparse_feature منجر به tf.SparseFeature می شود که size و is_sorted آن توسط fixed_shape و is_sorted پیام SparseFeature می شود.
  • ویژگی هایی که به عنوان index_feature یا value_feature یک sparse_feature می شوند، ورودی خود را در مشخصات ویژگی ایجاد نمی کنند.
  • مطابقت بین type فیلد feature (یا ویژگی مقادیر یک پروتو sparse_feature ) و نوع dtype مشخصات ویژگی توسط جدول زیر ارائه شده است:
type dtype
schema_pb2.INT tf.int64
schema_pb2.FLOAT tf.float32
schema_pb2.BYTES tf.string

استفاده از 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 برچسب خام را در نظر می گیرد و بدون تبدیل برچسب به عدد صحیح، همه به جز 5 برچسب برتر (بر اساس فرکانس) را به UNKNOWN تبدیل می کند.

در کد مدل، طبقه‌بندی‌کننده باید واژگان تولید شده توسط 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 کرد.