به انجمن SIG TFX-Addons بپیوندید و به پیشرفت TFX کمک کنید!
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

با TensorFlow Transform شروع کنید

این راهنما مفاهیم اساسی tf.Transform و نحوه استفاده از آنها را معرفی می کند. این:

  • تعریف یک تابع پیش پردازش ، یک توصیف منطقی از خط لوله که داده های خام را به داده های مورد استفاده برای آموزش یک مدل یادگیری ماشین تبدیل می کند.
  • اجرای پرتو Apache را که برای تبدیل داده ها با تبدیل عملکرد پیش پردازش به خط لوله Beam استفاده می شود ، نشان دهید .
  • مثالهای استفاده اضافی را نشان دهید.

یک تابع پیش پردازش را تعریف کنید

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

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

مثال عملکرد پیش پردازش

با ترکیب تجزیه و تحلیل و توابع منظم TensorFlow ، کاربران می توانند خطوط لوله انعطاف پذیر برای تبدیل داده ها ایجاد کنند. عملکرد پیش پردازش زیر هر یک از سه ویژگی را به طرق مختلف تغییر داده و دو ویژگی را با هم ترکیب می کند:

import tensorflow as tf
import tensorflow_transform as tft
import tensorflow_transform.beam as tft_beam

def preprocessing_fn(inputs):
  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,
      'x_centered_times_y_normalized': x_centered_times_y_normalized,
      's_integerized': s_integerized
  }

در اینجا ، x ، y و s Tensor s هستند که ویژگی های ورودی را نشان می دهند. اولین تانسور جدید که ایجاد شده است، x_centered است، با استفاده از ساخته شده tft.mean به x و کم کردن این از x . tft.mean(x) یک تانسور را بازنمایی می کند که میانگین تانسور x . x_centered ، tensor x با میانگین تفریق است.

دومین y_normalized جدید ، y_normalized ، به روشی مشابه اما با استفاده از روش راحتی tft.scale_to_0_1 . این روش چیزی شبیه به محاسبه x_centered ، یعنی محاسبه حداکثر و حداقل و استفاده از اینها برای مقیاس y .

tensor s_integerized نمونه ای از دستکاری رشته را نشان می دهد. در این حالت ، یک رشته را می گیریم و آن را به یک عدد صحیح ترسیم می کنیم. این از تابع راحتیtft.compute_and_apply_vocabulary . این تابع از یک تجزیه و تحلیلگر برای محاسبه مقادیر منحصر به فرد گرفته شده توسط رشته های ورودی استفاده می کند و سپس از عملیات TensorFlow برای تبدیل رشته های ورودی به شاخص های جدول مقادیر منحصر به فرد استفاده می کند.

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

تابع پیش پردازش خط لوله ای از عملیات را روی یک مجموعه داده تعریف می کند. برای استفاده از خط لوله ، ما به پیاده سازی tf.Transform API tf.Transform . اجرای Apache Beam PTransform فراهم می کند که عملکرد پیش پردازش کاربر را روی داده اعمال می کند. گردش کار معمول یک tf.Transform کاربر tf.Transform یک تابع پیش پردازش را ایجاد می کند ، سپس این را در یک خط لوله بزرگتر Beam قرار می دهد ، و داده ها را برای آموزش ایجاد می کند.

دسته بندی

بچینگ قسمت مهمی از TensorFlow است. از آنجا که یکی از اهداف tf.Transform تهیه نمودار TensorFlow برای پیش پردازش است که می تواند در نمودار خدمت (و به صورت اختیاری نمودار آموزش) قرار گیرد ، دسته بندی نیز یک مفهوم مهم در tf.Transform .

اگرچه در مثال بالا مشخص نیست ، اما عملکرد پیش پردازش تعریف شده توسط کاربر از سنسورهایی که به عنوان دسته و نه موارد مجزا ارائه می شوند ، منتقل می شود ، همانطور که در هنگام آموزش و خدمت با TensorFlow اتفاق می افتد. از طرف دیگر ، تجزیه و تحلیل ها در کل مجموعه داده یک محاسبه انجام می دهند که یک مقدار واحد و نه یک دسته مقادیر را برمی گرداند. x یک Tensor با شکلی از (batch_size,) ، در حالی که tft.mean(x) یک Tensor با شکل () . تفریق x - tft.mean(x) در جایی پخش می شود که مقدار tft.mean(x) از هر عنصر دسته ای که با x نشان داده می شود ، کم شود.

پیاده سازی پرتو آپاچی

در حالی که تابع پیش پردازش به عنوان توصیفی منطقی از خط لوله پیش پردازش اجرا شده در چندین چارچوب پردازش داده در نظر گرفته شده است ، tf.Transform یک اجرای متعارف مورد استفاده در Apache Beam را فراهم می کند. این پیاده سازی عملکرد مورد نیاز یک پیاده سازی را نشان می دهد. هیچ API رسمی برای این قابلیت وجود ندارد ، بنابراین هر پیاده سازی می تواند از یک API استفاده کند که برای چارچوب پردازش داده های خاص آن اصطلاحی است.

اجرای Apache Beam دو PTransform برای پردازش داده ها برای عملکرد پیش پردازش فراهم می کند. در زیر استفاده از کامپوزیت PTransform AnalyzeAndTransformDataset :

raw_data = [
    {'x': 1, 'y': 1, 's': 'hello'},
    {'x': 2, 'y': 2, 's': 'world'},
    {'x': 3, 'y': 3, 's': 'hello'}
]

raw_data_metadata = ...
transformed_dataset, transform_fn = (
    (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
        preprocessing_fn))
transformed_data, transformed_metadata = transformed_dataset

محتوای transformed_data در زیر نشان داده شده است و شامل ستون های تبدیل شده در همان قالب داده های خام است. به طور خاص ، مقادیر s_integerized [0, 1, 0] هستند - این مقادیر به نحوه نگاشت کلمات hello و world به اعداد صحیح بستگی دارد که تعیین کننده است. برای ستون x_centered ، میانگین را کم می کنیم بنابراین مقادیر ستون x ، که [1.0, 2.0, 3.0] ، به [-1.0, 0.0, 1.0] . به همین ترتیب ، بقیه ستون ها با مقادیر مورد انتظار آنها مطابقت دارند.

[{u's_integerized': 0,
  u'x_centered': -1.0,
  u'x_centered_times_y_normalized': -0.0,
  u'y_normalized': 0.0},
 {u's_integerized': 1,
  u'x_centered': 0.0,
  u'x_centered_times_y_normalized': 0.0,
  u'y_normalized': 0.5},
 {u's_integerized': 0,
  u'x_centered': 1.0,
  u'x_centered_times_y_normalized': 1.0,
  u'y_normalized': 1.0}]

داده های raw_data و داده های transformed_data مجموعه داده ها هستند. دو بخش بعدی نشان می دهد که چگونه اجرای Beam مجموعه داده ها و نحوه خواندن و نوشتن داده ها را روی دیسک نشان می دهد. مقدار برگشتی دیگر ، transform_fn ، نشان دهنده تحولی است که در داده ها اعمال می شود و در زیر به طور مفصل آورده شده است.

AnalyzeAndTransformDataset ترکیبی از دو تغییر اساسی است که توسط AnalyzeDataset و TransformDataset . بنابراین دو قطعه کد زیر برابر هستند:

transformed_data, transform_fn = (
    my_data | tft_beam.AnalyzeAndTransformDataset(preprocessing_fn))
transform_fn = my_data | tft_beam.AnalyzeDataset(preprocessing_fn)
transformed_data = (my_data, transform_fn) | tft_beam.TransformDataset()

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

یکی از ویژگی های مهم tf.Transform این است که transform_fn نشان دهنده یک نقشه از روی سطرها است - این یک عملکرد خالص است که برای هر سطر جداگانه اعمال می شود. تمام محاسبات جمع آوری سطرها در AnalyzeDataset انجام می شود. علاوه بر این ، transform_fn به عنوان یک Graph TensorFlow نشان داده شده است که می تواند در نمودار خدمت تعبیه شود.

AnalyzeAndTransformDataset برای بهینه سازی در این حالت خاص ارائه شده است. این همان الگویی است که در یادگیری scikit استفاده می شود و روشهای fit ، transform و fit_transform سازی را فراهم می کند.

قالب ها و طرح داده ها

پیاده سازی TFT Beam دو قالب داده ورودی مختلف را می پذیرد. قالب "dict dict" (همانطور که در مثال بالا و در simple_example.py ) یک قالب بصری است و برای مجموعه های داده کوچک مناسب است در حالی که قالب TFXIO ( Apache Arrow ) عملکرد بهتری را ارائه می دهد و برای مجموعه های داده بزرگ مناسب است.

پیاده سازی Beam نشان می دهد که جمع آوری ورودی PC با "فراداده" همراه با PCollection در کدام قالب قرار دارد:

(raw_data, raw_data_metadata) | tft.AnalyzeDataset(...)
  • اگر raw_data_metadata یک مجموعه dataset_metadata.DatasetMetadata (به بخش "قالب" نمونه raw_data "مراجعه کنید) ، raw_data انتظار می رود که در قالب" نمونه نمونه "باشد.
  • اگر raw_data_metadata یک tfxio.TensorAdapterConfig (به بخش "قالب TFXIO" در زیر مراجعه کنید) ، داده های raw_data در قالب TFXIO قرار دارند.

قالب "نمونه نمونه"

در مثال های کد قبلی ، کدی که raw_data_metadata تعریف می کند حذف شده است. فراداده حاوی طرح واره ای است که طرح داده ها را تعریف می کند ، بنابراین آنها از قالب های مختلف خوانده و نوشته می شوند. حتی قالب حافظه ای که در بخش آخر نشان داده شده است ، خود توصیفی نیست و برای اینکه به عنوان سنسور تعبیر شود ، به طرحواره نیاز دارد.

در اینجا تعریف طرحواره برای داده های مثال آورده شده است:

from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils

raw_data_metadata = dataset_metadata.DatasetMetadata(
      schema_utils.schema_from_feature_spec({
        's': tf.io.FixedLenFeature([], tf.string),
        'y': tf.io.FixedLenFeature([], tf.float32),
        'x': tf.io.FixedLenFeature([], tf.float32),
    }))

نمونه اولیه Schema شامل اطلاعاتی است که برای تجزیه داده ها از قالب روی دیسک یا حافظه ، به سنسورها احتیاج دارد. این به طور معمول با فراخوانی schema_utils.schema_from_feature_spec با کلیدهای مشخصه نقشه برداری به tf.io.FixedLenFeature ، tf.io.VarLenFeature و tf.io.SparseFeature . برای جزئیات بیشتر به اسناد tf.parse_example مراجعه کنید.

در بالا ما از tf.io.FixedLenFeature استفاده می tf.io.FixedLenFeature تا نشان دهیم هر ویژگی شامل تعداد مشخصی از مقادیر است ، در این حالت یک مقیاس واحد. از آنجا که نمونه های tf.Transform نمونه هایی را نشان می دهد ، Tensor واقعی نمایانگر این ویژگی دارای شکل (None,) که بعد ناشناخته بعد دسته ای است.

قالب TFXIO

با این قالب ، انتظار می رود داده ها در یک pyarrow.RecordBatch . برای داده های جدولی ، پیاده سازی Apache Beam ما Arrow RecordBatch متشکل از ستون هایی از انواع زیر می پذیرد:

  • pa.list_(<primitive>) ، که در آن <primitive> pa.int64() ، pa.float32() pa.binary() یا pa.large_binary() .

  • pa.large_list(<primitive>)

مجموعه داده ورودی اسباب بازی که در بالا استفاده کردیم ، وقتی به عنوان RecordBatch نشان داده می شود ، به صورت زیر است:

raw_data = [
    pa.record_batch([
        pa.array([[1], [2], [3]], pa.list_(pa.float32())),
        pa.array([[1], [2], [3]], pa.list_(pa.float32())),
        pa.array([['hello'], ['world'], ['hello']], pa.list_(pa.binary())),
    ], ['x', 'y', 's'])
]

مشابه DatasetMetadata که برای همراهی با قالب "instance dict" مورد نیاز است ، یک tfxio.TensorAdapterConfig برای همراهی با RecordBatch مورد نیاز است. این شامل طرح Arrow از RecordBatch و TensorRepresentations تا تعیین کند که چگونه ستونها در RecordBatch می توانند به عنوان TensorFlow Tensors تفسیر شوند (شامل tf.Tensor ، tf.SparseTensor).

TensorRepresentations یک Dict[Text, TensorRepresentation] که رابطه بین Tensor را که preprocessing_fn قبول می کند و ستون ها در RecordBatch . مثلا:

tensor_representation = {
    'x': text_format.Parse(
        """dense_tensor { column_name: "col1" shape { dim { size: 2 } } }"""
        schema_pb2.TensorRepresentation())
}

این بدان معنی است که inputs['x'] در preprocessing_fn پردازش_fn باید یک tf متراکم باشد. سنسوری که مقادیر آن از ستونی به نام 'col1' در ورودی RecordBatch وارد می شود ، و شکل (دسته ای) آن باید [batch_size, 2] باشد.

TensorRepresentation یک Protobuf تعریف شده در متادیتای TensorRepresentation است.

ورودی و خروجی با Apache Beam

تاکنون ، داده های ورودی و خروجی را در لیست های پایتون (از RecordBatch یا دیکشنری های نمونه) مشاهده کرده ایم. این یک ساده سازی است که به توانایی Apache Beam برای کار با لیست ها و همچنین نمایش اصلی داده ها ، PCollection .

PCollection نمایش داده ای است که بخشی از خط لوله Beam را تشکیل می دهد. خط لوله Beam با استفاده از PTransform های مختلف از جمله AnalyzeDataset و TransformDataset و اجرای خط لوله شکل می گیرد. PCollection در حافظه باینری اصلی ایجاد نمی شود ، بلکه در عوض بین کارگران توزیع می شود (اگرچه این بخش از حالت اجرای حافظه استفاده می کند).

منابع PCollection از قبل کنسرو شده ( TFXIO )

قالب RecordBatch که پیاده سازی ما آن را می پذیرد ، یک قالب معمول است که سایر کتابخانه های TFX آن را می پذیرند. بنابراین TFX "منابع" مناسبی (با نام مستعار TFXIO ) را ارائه می دهد که فایلهای با فرمت های مختلف را بر روی دیسک می RecordBatch و RecordBatch تولید می کنند و همچنین می توانند TensorAdapterConfig ، از جمله TensorRepresentations استنباط شده را ارائه TensorRepresentations .

این TFXIO ها را می توانید در بسته tfx_bsl ( tfx_bsl.public.tfxio ) پیدا کنید.

مثال: مجموعه داده "درآمد سرشماری"

مثال زیر به خواندن و نوشتن داده ها بر روی دیسک و نمایش داده ها به عنوان یک PCollection (نه یک لیست) نیاز دارد ، به: census_example.py . در زیر نحوه بارگیری داده ها و اجرای این مثال نشان داده شده است. مجموعه داده "درآمد سرشماری" توسط مخزن یادگیری ماشین UCI ارائه شده است. این مجموعه داده هم شامل داده های طبقه ای و هم عددی است.

داده ها در قالب CSV هستند ، در اینجا دو خط اول وجود دارد:

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K

ستون های مجموعه داده یا دسته ای یا عددی هستند. این مجموعه داده یک مشکل طبقه بندی را توصیف می کند: پیش بینی آخرین ستون که در آن فرد سالانه بیش از 50 هزار درآمد کسب می کند. با این حال ، از دیدگاه tf.Transform ، این برچسب فقط یک ستون طبقه بندی دیگر است.

ما از یک TFXIO ، BeamRecordCsvTFXIO از قبل کنسرو شده برای ترجمه خطوط CSV به RecordBatches . TFXIO به دو اطلاعات مهم نیاز دارد:

  • یک طرح متاداده TensorFlow که شامل اطلاعات نوع و شکل در مورد هر ستون CSV است. TensorRepresentation یک بخش اختیاری از طرح است. در صورت عدم ارائه (که در این مثال وجود دارد) ، آنها از اطلاعات نوع و شکل استنباط می شوند. با استفاده از یک تابع کمکی که ما برای ترجمه از مشخصات تجزیه TF (در این مثال نشان داده شده است) یا با اجرای اعتبار سنجی داده TensorFlow می توان Schema را دریافت کرد.

  • لیستی از نام ستون ها به ترتیب نمایش در فایل CSV. توجه داشته باشید که این نام ها باید با نام ویژگی های موجود در Schema مطابقت داشته باشند.

در این مثال ما اجازه می دهیم education-num نداشته باشد. این بدان معنی است که به عنوان tf.io.VarLenFeature در feature_spec و به عنوان tf.SparseTensor در preprocessing_fn tf.SparseTensor می شود. سایر ویژگی ها در preprocessing_fn tf.Tensor به tf.Tensor به همین نام تبدیل می شوند.

csv_tfxio = tfxio.BeamRecordCsvTFXIO(
    physical_format='text', column_names=ordered_columns, schema=SCHEMA)

record_batches = (
    p
    | 'ReadTrainData' >> textio.ReadFromText(train_data_file)
    | ...  # fix up csv lines
    | 'ToRecordBatches' >> csv_tfxio.BeamSource())

tensor_adapter_config = csv_tfxio.TensorAdapterConfig()

توجه داشته باشید که بعد از خواندن خطوط CSV مجبور به رفع برخی مشکلات اضافی شدیم. در غیر این صورت ، ما می توانیم به CsvTFXIO اعتماد CsvTFXIO تا هم خواندن فایل ها را ترجمه کنیم و هم به RecordBatch es ترجمه RecordBatch :

csv_tfxio = tfxio.CsvTFXIO(train_data_file, column_name=ordered_columns,
                           schema=SCHEMA)
record_batches = p | 'TFXIORead' >> csv_tfxio.BeamSource()
tensor_adapter_config = csv_tfxio.TensorAdapterConfig()

پیش پردازش مانند نمونه قبلی است ، با این تفاوت که عملکرد پیش پردازش به جای مشخص کردن دستی هر ستون ، از طریق برنامه تولید می شود. در تابع پیش پردازش زیر ، NUMERICAL_COLUMNS و CATEGORICAL_COLUMNS لیستی هستند که حاوی نام ستون های عددی و دسته ای هستند:

def preprocessing_fn(inputs):
  """Preprocess input columns into transformed columns."""
  # Since we are modifying some features and leaving others unchanged, we
  # start by setting `outputs` to a copy of `inputs.
  outputs = inputs.copy()

  # Scale numeric columns to have range [0, 1].
  for key in NUMERIC_FEATURE_KEYS:
    outputs[key] = tft.scale_to_0_1(outputs[key])

  for key in OPTIONAL_NUMERIC_FEATURE_KEYS:
    # This is a SparseTensor because it is optional. Here we fill in a default
    # value when it is missing.
      sparse = tf.sparse.SparseTensor(outputs[key].indices, outputs[key].values,
                                      [outputs[key].dense_shape[0], 1])
      dense = tf.sparse.to_dense(sp_input=sparse, default_value=0.)
    # Reshaping from a batch of vectors of size 1 to a batch to scalars.
    dense = tf.squeeze(dense, axis=1)
    outputs[key] = tft.scale_to_0_1(dense)

  # For all categorical columns except the label column, we generate a
  # vocabulary but do not modify the feature.  This vocabulary is instead
  # used in the trainer, by means of a feature column, to convert the feature
  # from a string to an integer id.
  for key in CATEGORICAL_FEATURE_KEYS:
    tft.vocabulary(inputs[key], vocab_filename=key)

  # For the label column we provide the mapping from string to index.
  initializer = tf.lookup.KeyValueTensorInitializer(
      keys=['>50K', '<=50K'],
      values=tf.cast(tf.range(2), tf.int64),
      key_dtype=tf.string,
      value_dtype=tf.int64)
  table = tf.lookup.StaticHashTable(initializer, default_value=-1)

  outputs[LABEL_KEY] = table.lookup(outputs[LABEL_KEY])

  return outputs

یک تفاوت با مثال قبلی ستون برچسب است که به طور دستی نقشه از رشته را به یک فهرست مشخص می کند. بنابراین '>50' به 0 و '<=50K' به 1 زیرا دانستن اینکه کدام شاخص در مدل آموزش دیده با کدام برچسب مطابقت دارد مفید است.

متغیر record_batches نمایانگر PCollection آوری pyarrow.RecordBatch es است. tensor_adapter_config توسط csv_tfxio داده شده است که از SCHEMA (و در نهایت ، در این مثال ، از مشخصات تجزیه TF) استنباط می شود.

مرحله آخر نوشتن داده های تبدیل شده روی دیسک است و شکلی مشابه با خواندن داده های خام دارد. طرح مورد استفاده برای انجام این کار بخشی از خروجی AnalyzeAndTransformDataset که یک طرحواره را برای داده های خروجی AnalyzeAndTransformDataset می کند. کد نوشتن روی دیسک در زیر نشان داده شده است. طرحواره بخشی از فراداده است اما از این دو به جای هم در tf.Transform API استفاده می کند (یعنی فراداده را به مثال ExampleProtoCoder ). توجه داشته باشید که این فرمت با قالب دیگری می نویسد. به جای textio.WriteToText ، از پشتیبانی داخلی TFRecord برای قالب TFRecord استفاده کنید و برای رمزگذاری داده ها به عنوان Example اولیه از رمزگذار استفاده کنید. همانطور که در بخش بعدی نشان داده شده است ، این قالب بهتر برای استفاده در آموزش است. transformed_eval_data_base نام پرونده پایه را برای تکه های جداگانه نوشته شده فراهم می کند.

transformed_data | "WriteTrainData" >> tfrecordio.WriteToTFRecord(
    transformed_eval_data_base,
    coder=tft.coders.ExampleProtoCoder(transformed_metadata))

علاوه بر داده های آموزش ، transform_fn نیز با فراداده نوشته می شود:

_ = (
    transform_fn
    | 'WriteTransformFn' >> tft_beam.WriteTransformFn(working_dir))
transformed_metadata | 'WriteMetadata' >> tft_beam.WriteMetadata(
    transformed_metadata_file, pipeline=p)

کل خط لوله Beam را با p.run().wait_until_finish() . تا این مرحله ، خط لوله Beam یک محاسبه توزیع شده به تعویق افتاده را نشان می دهد. این دستورالعمل هایی برای آنچه انجام می شود ارائه می دهد ، اما دستورالعمل ها اجرا نشده اند. این فراخوان نهایی خط لوله مشخص شده را اجرا می کند.

مجموعه داده سرشماری را بارگیری کنید

با استفاده از دستورات پوسته زیر مجموعه داده سرشماری را بارگیری کنید:

  wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
  wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test

هنگام اجرای اسکریپت census_example.py ، دایرکتوری حاوی این داده ها را به عنوان اولین آرگومان عبور دهید. اسکریپت برای اضافه کردن داده های پیش پردازش شده ، یک زیر شاخه فرعی ایجاد می کند.

با آموزش TensorFlow ادغام شوید

بخش آخر census_example.py نحوه استفاده از داده های پیش پردازش شده برای آموزش یک مدل را نشان می دهد. برای جزئیات به اسناد برآوردگر مراجعه کنید. اولین قدم ساخت یک Estimator که به توصیف ستون های پیش پردازش شده نیاز دارد. هر ستون عددی به عنوان یک real_valued_column شده توصیف می شود که یک لفافه به دور بردار متراکم با اندازه ثابت است ( 1 در این مثال) هر ستون طبقه از رشته به اعداد صحیح نگاشته و سپس می شود به تصویب indicator_column . tft.TFTransformOutput برای یافتن مسیر فایل واژگان برای هر ویژگی طبقه ای استفاده می شود.

real_valued_columns = [feature_column.real_valued_column(key)
                       for key in NUMERIC_FEATURE_KEYS]

one_hot_columns = [
    tf.feature_column.indicator_column(
        tf.feature_column.categorical_column_with_vocabulary_file(
            key=key,
            vocabulary_file=tf_transform_output.vocabulary_file_by_name(
                vocab_filename=key)))
    for key in CATEGORICAL_FEATURE_KEYS]

estimator = tf.estimator.LinearClassifier(real_valued_columns + one_hot_columns)

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

def _make_training_input_fn(tf_transform_output, transformed_examples,
                            batch_size):
  ...
  def input_fn():
    """Input function for training and eval."""
    dataset = tf.data.experimental.make_batched_features_dataset(
        ..., tf_transform_output.transformed_feature_spec(), ...)

    transformed_features = tf.compat.v1.data.make_one_shot_iterator(
        dataset).get_next()
    ...

  return input_fn

کد باقیمانده همان استفاده از کلاس Estimator . این مثال همچنین حاوی کدی برای صادرات مدل در قالب SavedModel است. مدل صادر شده را می توان توسط Tensorflow Serving یا Cloud ML Engine استفاده کرد .