مساعدة في حماية الحاجز المرجاني العظيم مع TensorFlow على Kaggle تاريخ التحدي

ابدأ مع TensorFlow Transform

هذا الدليل يقدم المفاهيم الأساسية لل tf.Transform وكيفية استخدامها. سوف تكون:

  • تعريف دالة تجهيزها، ووصف منطقي من خط الأنابيب الذي يحول البيانات الخام إلى البيانات تستخدم لتدريب نموذج التعلم الآلي.
  • عرض أباتشي شعاع تنفيذ المستخدمة لتحويل البيانات من خلال تحويل وظيفة تجهيزها في خط أنابيب شعاع.
  • عرض أمثلة استخدام إضافية.

تحديد وظيفة المعالجة المسبقة

وظيفة تجهيزها هو الأكثر مفهوم هام من tf.Transform . وظيفة المعالجة المسبقة هي وصف منطقي لتحول مجموعة البيانات. يقبل الدالة تجهيزها وإرجاع القاموس من التنسورات، حيث يعني موتر Tensor أو SparseTensor . هناك نوعان من الوظائف المستخدمة لتحديد وظيفة المعالجة المسبقة:

  1. أي دالة تقبل وتعيد موترات. تضيف هذه العمليات TensorFlow إلى الرسم البياني الذي يحول البيانات الأولية إلى بيانات محولة.
  2. أي من تحليل المقدمة من tf.Transform . المحللون أيضا قبول والعودة التنسورات، ولكن على عكس وظائف TensorFlow، فإنها لا تضيف العمليات إلى الرسم البياني. بدلا من ذلك، تحليل سبب tf.Transform لحساب كامل تمرير عملية خارج TensorFlow. يستخدمون قيم موتر الإدخال على مجموعة البيانات بأكملها لإنشاء موتر ثابت يتم إرجاعه كناتج. على سبيل المثال، tft.min يحسب الحد الأدنى من موتر على البيانات. 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 الصورة التي تمثل ملامح المدخلات. موتر الجديد الأول الذي تم إنشاؤه، x_centered ، بنيت من خلال تطبيق tft.mean إلى x وطرح هذا من x . tft.mean(x) بإرجاع موتر تمثل متوسط موتر x . x_centered هو موتر x مع متوسط تطرح.

موتر الثاني الجديد، y_normalized ، يتم إنشاء بطريقة مماثلة ولكن باستخدام أسلوب الراحة tft.scale_to_0_1 . وهذه الطريقة لا شيء مماثل لالحوسبة x_centered ، وهي الحوسبة الأقصى والحد الأدنى واستخدام هذه لتوسيع نطاق y .

موتر s_integerized يظهر مثال على التلاعب السلسلة. في هذه الحالة ، نأخذ سلسلة ونرسمها إلى عدد صحيح. هذا يستخدم الدالة الراحة tft.compute_and_apply_vocabulary . تستخدم هذه الوظيفة محللًا لحساب القيم الفريدة المأخوذة من سلاسل الإدخال ، ثم تستخدم عمليات TensorFlow لتحويل سلاسل الإدخال إلى مؤشرات في جدول القيم الفريدة.

يوضح العمود الأخير أنه من الممكن استخدام عمليات TensorFlow لإنشاء ميزات جديدة من خلال الجمع بين الموترات.

تحدد وظيفة المعالجة المسبقة خط أنابيب للعمليات على مجموعة بيانات. من أجل تطبيق خط أنابيب، ونحن نعتمد على تنفيذ الخرسانة من tf.Transform API. يوفر تنفيذ أباتشي شعاع PTransform الذي ينطبق ظيفة تجهيزها المستخدم إلى البيانات. سير العمل نموذجية من tf.Transform سوف المستعمل بناء وظيفة تجهيزها، ثم دمج هذه في خط أنابيب شعاع أكبر، وخلق بيانات للتدريب.

الخلط

يعد التجميع جزءًا مهمًا من 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 يوفر تنفيذ الكنسي استخدامها على أباتشي شعاع. يوضح هذا التنفيذ الوظيفة المطلوبة من التنفيذ. لا توجد واجهة برمجة تطبيقات رسمية لهذه الوظيفة ، لذلك يمكن لكل تطبيق استخدام واجهة برمجة تطبيقات اصطلاحية لإطار عمل معالجة البيانات الخاص به.

يوفر تنفيذ أباتشي شعاع اثنين 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] تعتمد القيم -these حول كيفية عبارة 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 تتمثل باعتباره TensorFlow Graph التي يمكن أن تكون جزءا لا يتجزأ في الرسم البياني التقديم.

AnalyzeAndTransformDataset هو منصوص عليه تحسينات في هذه الحالة الخاصة. وهذا هو نفس النمط المستخدم في scikit التعلم ، وتوفير fit ، transform ، و fit_transform الأساليب.

تنسيقات البيانات والمخطط

يقبل تنفيذ TFT Beam تنسيقين مختلفين لبيانات الإدخال. شكل "المثال ديكت" (كما رأينا في المثال أعلاه وفي simple_example.py ) هي صيغة بديهية وغير مناسبة لمجموعات البيانات الصغيرة في حين أن TFXIO ( أباتشي السهم يوفر الشكل) تحسين الأداء وهو suitble للمجموعات البيانات الكبيرة.

يخبر تطبيق Beam عن التنسيق الذي ستكون عليه مجموعة الإدخال من خلال "البيانات الوصفية" المصاحبة لمجموعة PC:

(raw_data, raw_data_metadata) | tft.AnalyzeDataset(...)
  • إذا raw_data_metadata هو dataset_metadata.DatasetMetadata (انظر أدناه، "تنسيق" المثال ديكت "قسم)، ثم 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.Transform دفعات الحالات الفعلية Tensor سوف يمثل ميزة لها شكل (None,) حيث البعد غير معروف هو البعد دفعة واحدة.

تنسيق TFXIO

مع هذا الشكل، ومن المتوقع أن يتم الواردة في البيانات pyarrow.RecordBatch . لجداول البيانات، تنفيذنا أباتشي شعاع يقبل السهم 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 يجري اللازمة لمرافقة شكل "المثال ديكت"، وهو tfxio.TensorAdapterConfig هناك حاجة لمرافقة RecordBatch وفاق. وهو يتألف من مخطط السهم من RecordBatch وفاق، و TensorRepresentations إلى فريد تحديد كيفية الأعمدة في RecordBatch يمكن تفسير وفاق كما TensorFlow التنسورات (بما في ذلك سبيل المثال لا الحصر tf.Tensor، tf.SparseTensor).

TensorRepresentations هو Dict[Text, TensorRepresentation] الذي يحدد العلاقة بين التنسور أن 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 ينبغي أن تكون كثيفة tf.Tensor، الذي قيم تأتي من عمود اسم 'col1' في المدخلات RecordBatch وفاق، ولها (دفعات) شكل ينبغي أن يكون [batch_size, 2] .

TensorRepresentation هو Protobuf المحددة في TensorFlow الفوقية .

التوافق مع TensorFlow

tf.Transform يقدم الدعم لتصدير transform_fn فوق إما 1.X TF أو SavedModel TF الإصدار 2.x. السلوك الافتراضي قبل 0.30 الافراج تصديرها إلى SavedModel TF 1.X. بدءا من 0.30 الإفراج عنهم، السلوك الافتراضي لتصدير SavedModel TF الإصدار 2.x ما لم يتم تعطيل صراحة السلوكيات TF الإصدار 2.x (عن طريق الاتصال tf.compat.v1.disable_v2_behavior() على سبيل المثال).

في حالة استخدام المفاهيم TF 1.X مثل Estimators و Sessions ، يمكنك الاحتفاظ السلوك السابق عن طريق تمرير force_tf_compat_v1=True ل tft_beam.Context في حالة استخدام tf.Transform كمكتبة مستقل أو ل تحويل العنصر في TFX.

عند تصدير transform_fn باعتباره SavedModel TF الإصدار 2.x، و preprocessing_fn ومن المتوقع أن تتبعها باستخدام tf.function . بالإضافة إلى ذلك، إذا تشغيل خط أنابيب عن بعد (على سبيل المثال مع DataflowRunner )، تأكد من أن preprocessing_fn وأي تبعيات يتم تعبئتها بشكل صحيح كما هو موضح هنا .

المشكلات المعروفة باستخدام tf.Transform لتصدير الإصدار 2.x TF موثقة SavedModel هنا .

الإدخال والإخراج مع Apache Beam

وحتى الآن، شهدنا بيانات المدخلات والمخرجات في قوائم الثعبان (من RecordBatch وفاق أو القواميس سبيل المثال). هذا هو تبسيط التي تعتمد على قدرة أباتشي شعاع لعمل مع القوائم وكذلك تمثيل الرئيسي للبيانات، و PCollection .

A PCollection هو تمثيل البيانات التي تشكل جزءا من خط أنابيب شعاع. ويتكون خط أنابيب شعاع من خلال تطبيق مختلف PTransform ، بما AnalyzeDataset و TransformDataset ، وتشغيل خط أنابيب. A PCollection لم يتم إنشاء في ذاكرة الثنائي الرئيسي، ولكن بدلا من ذلك يتم توزيعها بين العمال (على الرغم من هذا القسم يستخدم طريقة إعدام في الذاكرة).

المعلبة قبل PCollection مصادر ( TFXIO )

و RecordBatch الشكل الذي تنفيذنا يقبل هو شكل شائع أن المكتبات TFX أخرى تقبل. لذلك TFX العروض مريحة "مصادر" (الملقب TFXIO ) أن قراءة الملفات من أشكال مختلفة على القرص والمنتجات RecordBatch وفاق ويمكن أيضا إعطاء TensorAdapterConfig ، بما في ذلك الاستدلال 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 التحقق من صحة البيانات .

  • قائمة بأسماء الأعمدة ، بالترتيب الذي تظهر به في ملف CSV. لاحظ أن هذه الأسماء يجب أن تتطابق مع أسماء الميزات في المخطط.

في هذا المثال سمحنا ل education-num الميزة ليكون في عداد المفقودين. وهذا يعني أن يتم تمثيل أنها tf.io.VarLenFeature في feature_spec، ونتيجة ل tf.SparseTensor في preprocessing_fn . وغيرها من الميزات تصبح tf.Tensor الصورة التي تحمل الاسم نفسه في preprocessing_fn .

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 للتعامل مع كل من قراءة الملفات وترجمة ل 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 وفاق. و tensor_adapter_config تعطى من قبل csv_tfxio ، التي يستدل من SCHEMA (وفي نهاية المطاف، في هذا المثال، من المواصفات TF الاعراب).

المرحلة الأخيرة هي كتابة البيانات المحولة إلى قرص ولها شكل مماثل لقراءة البيانات الأولية. المخطط استخدامها للقيام بذلك هو جزء من إخراج AnalyzeAndTransformDataset التي يستدل مخطط لإخراج البيانات. يظهر رمز الكتابة على القرص أدناه. المخطط هو جزء من البيانات الوصفية لكن يستخدم بالتبادل في tf.Transform API (أي تمرير البيانات الوصفية إلى ExampleProtoCoder ). اعلم أن هذا يكتب بتنسيق مختلف. بدلا من textio.WriteToText ، استخدم شعاع الذي بني في دعم ل 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)

تشغيل خط أنابيب شعاع كامل مع p.run().wait_until_finish() . حتى هذه النقطة ، يمثل خط أنابيب الشعاع حسابًا مؤجلًا وموزعًا. يوفر تعليمات لما سيتم عمله ، ولكن لم يتم تنفيذ التعليمات. هذا الاستدعاء الأخير ينفذ خط الأنابيب المحدد.

قم بتنزيل مجموعة بيانات التعداد

قم بتنزيل مجموعة بيانات التعداد باستخدام أوامر shell التالية:

  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 عرض كيفية استخدام البيانات preprocessed لتدريب نموذجا. اطلع على وثائق المقدرون لمزيد من التفاصيل. وتتمثل الخطوة الأولى لبناء Estimator الأمر الذي يتطلب وصفا من الأعمدة preprocessed. يتم وصف كل عمود رقمي باعتباره 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 ليس مطلوبا منذ المواصفات ميزة لتحليل البيانات المحولة. بدلاً من ذلك ، استخدم البيانات الوصفية للبيانات المحولة لإنشاء مواصفات الميزة.

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 التي تخدم أو ML محرك الغيمة .