ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

مكون خط أنابيب تحويل TFX

ينفذ مكون خط أنابيب Transform TFX هندسة الميزات على أمثلة تنبعث من أحد مكونات ExampleGen ، باستخدام مخطط بيانات تم إنشاؤه بواسطة مكون SchemaGen ، ويصدر SavedModel. عند التنفيذ ، سيقبل SavedModel tf.Examples المنبعثة من مكون ExampleGen وإصدار بيانات الميزة المحولة.

  • يستهلك: tf.Examples من مكون ExampleGen ، ومخطط بيانات من مكون SchemaGen.
  • ينبعث: نموذج SavedModel إلى مكون المدرب

تكوين مكون التحويل

بمجرد كتابة preprocessing_fn ، يجب تحديده في وحدة Python النمطية التي يتم توفيرها بعد ذلك لمكون التحويل كمدخل. سيتم تحميل هذه الوحدة عن طريق التحويل وسيتم العثور على الوظيفة المسماة preprocessing_fn واستخدامها بواسطة Transform لبناء خط أنابيب المعالجة المسبقة.

transform_training = components.Transform(
    examples=examples_gen.outputs['training_examples'],
    schema=infer_schema.outputs['schema'],
    module_file=taxi_pipeline_utils,
    name='transform-training')

transform_eval = components.Transform(
    examples=examples_gen.outputs['eval_examples'],
    schema=infer_schema.outputs['schema'],
    transform_dir=transform_training.outputs['output'],
    name='transform-eval')

التحويل وتحويل TensorFlow

تستفيد Transform بشكل كبير من TensorFlow Transform لتنفيذ هندسة الميزات على مجموعة البيانات الخاصة بك. TensorFlow Transform هي أداة رائعة لتحويل بيانات الميزات قبل أن تنتقل إلى النموذج الخاص بك وكجزء من عملية التدريب. تشمل تحولات السمات الشائعة ما يلي:

  • التضمين : تحويل السمات المتفرقة (مثل المعرفات الصحيحة التي تنتجها المفردات) إلى سمات كثيفة من خلال إيجاد مخطط ذي معنى من مساحة عالية الأبعاد إلى مساحة ذات أبعاد منخفضة. راجع وحدة Embeddings في دورة Crash Course للتعلم الآلي للحصول على مقدمة عن حفلات الزفاف.
  • توليد المفردات : تحويل السلاسل أو الميزات غير الرقمية الأخرى إلى أعداد صحيحة عن طريق إنشاء مفردات تعين كل قيمة فريدة إلى رقم معرّف.
  • قيم التسوية : تحويل المعالم الرقمية بحيث تقع جميعها ضمن نطاق مماثل.
  • الجرافة : تحويل الميزات ذات القيمة المستمرة إلى ميزات فئوية عن طريق تعيين قيم للمجموعات المنفصلة.
  • إثراء ميزات النص : إنتاج ميزات من البيانات الأولية مثل الرموز المميزة ، و n-grams ، والكيانات ، والمشاعر ، وما إلى ذلك ، لإثراء مجموعة الميزات.

يوفر TensorFlow Transform الدعم لهذه وأنواع أخرى كثيرة من التحويلات:

  • قم بإنشاء مفردات تلقائيًا من أحدث بياناتك.

  • قم بإجراء تحويلات عشوائية على بياناتك قبل إرسالها إلى النموذج الخاص بك. ينشئ TensorFlow Transform تحويلات في الرسم البياني TensorFlow للنموذج الخاص بك بحيث يتم إجراء نفس التحويلات في وقت التدريب والاستنتاج. يمكنك تحديد التحويلات التي تشير إلى الخصائص العامة للبيانات ، مثل القيمة القصوى لميزة في جميع حالات التدريب.

يمكنك تحويل بياناتك كيفما تشاء قبل تشغيل TFX. ولكن إذا قمت بذلك داخل TensorFlow Transform ، فإن التحويلات تصبح جزءًا من الرسم البياني TensorFlow. يساعد هذا الأسلوب في تجنب التدريب / تقديم الانحراف.

تستخدم التحويلات داخل كود النمذجة الخاص بك FeatureColumns. باستخدام FeatureColumns ، يمكنك تحديد مجموعات ، أو أعداد صحيحة تستخدم مفردات محددة مسبقًا ، أو أي تحويلات أخرى يمكن تعريفها دون النظر إلى البيانات.

على النقيض من ذلك ، تم تصميم TensorFlow Transform للتحويلات التي تتطلب مرورًا كاملاً على البيانات لحساب القيم غير المعروفة مسبقًا. على سبيل المثال ، يتطلب إنشاء المفردات تمريرة كاملة للبيانات.

بالإضافة إلى قيم الحوسبة باستخدام Apache Beam ، يسمح TensorFlow Transform للمستخدمين بتضمين هذه القيم في رسم بياني TensorFlow ، والذي يمكن تحميله بعد ذلك في الرسم البياني للتدريب. على سبيل المثال ، عند تسوية الميزات ، tft.scale_to_z_score الدالة tft.scale_to_z_score المتوسط ​​والانحراف المعياري للميزة ، وأيضًا تمثيل ، في الرسم البياني TensorFlow ، للدالة التي تطرح المتوسط ​​وتقسم على الانحراف المعياري. من خلال إصدار رسم بياني TensorFlow ، وليس الإحصائيات فقط ، يعمل TensorFlow Transform على تبسيط عملية تأليف خط أنابيب المعالجة المسبقة.

نظرًا لأن المعالجة المسبقة يتم التعبير عنها كرسم بياني ، يمكن أن تحدث على الخادم ، وهي مضمونة لتكون متسقة بين التدريب والخدمة. هذا الاتساق يقضي على مصدر واحد للتدريب / انحراف الخدمة.

يسمح TensorFlow Transform للمستخدمين بتحديد خط أنابيب المعالجة المسبقة الخاصة بهم باستخدام كود TensorFlow. هذا يعني أن خط الأنابيب يتم إنشاؤه بنفس طريقة إنشاء الرسم البياني TensorFlow. إذا تم استخدام عمليات TensorFlow فقط في هذا الرسم البياني ، فسيكون خط الأنابيب عبارة عن خريطة خالصة تقبل دفعات من المدخلات وترجع دفعات من المخرجات. سيكون خط الأنابيب هذا مكافئًا لوضع هذا الرسم البياني داخل input_fn عند استخدام tf.Estimator API. من أجل تحديد عمليات التمرير الكامل مثل حسابات الكميات ، يوفر TensorFlow Transform وظائف خاصة تسمى analyzers التي تظهر مثل عمليات TensorFlow ، ولكنها في الواقع تحدد حسابًا مؤجلًا سيتم إجراؤه بواسطة Apache Beam ، ويتم إدراج الإخراج في الرسم البياني باعتباره ثابت. في حين أن عملية TensorFlow العادية ستأخذ دفعة واحدة كمدخلاتها ، وتقوم ببعض العمليات الحسابية على تلك الدفعة فقط وتنبعث منها دفعة ، سيقوم analyzer بإجراء تخفيض عام (يتم تنفيذه في Apache Beam) على جميع الدفعات ويعيد النتيجة.

من خلال الجمع بين عمليات TensorFlow العادية ومحللات TensorFlow Transform ، يمكن للمستخدمين إنشاء خطوط أنابيب معقدة للمعالجة المسبقة لبياناتهم. على سبيل المثال ، تأخذ الدالة tft.scale_to_z_score موتر إدخال وتعيد الموتر الذي تم ضبطه ليكون يعني 0 والتباين 1 . يقوم بذلك عن طريق استدعاء محللي mean و var تحت الغطاء ، والذي سيولد بشكل فعال ثوابت في الرسم البياني تساوي متوسط ​​وتباين موتر الإدخال. سيستخدم بعد ذلك عمليات TensorFlow لطرح المتوسط ​​والقسمة على الانحراف المعياري.

تحويل TensorFlow preprocessing_fn

يبسط مكون تحويل TFX استخدام التحويل من خلال معالجة مكالمات API المتعلقة بقراءة البيانات وكتابتها ، وكتابة الإخراج SavedModel على القرص. بصفتك مستخدم TFX ، ما عليك سوى تحديد وظيفة واحدة تسمى preprocessing_fn . في preprocessing_fn تقوم بتعريف سلسلة من الوظائف التي تتعامل مع إملاء إدخال الموترات لإنتاج إملاء الإخراج الخاص بالموترات. يمكنك العثور على وظائف المساعدة مثل scale_to_0_1 و compute_and_apply_vocabulary واجهة برمجة تطبيقات TensorFlow Transform أو استخدام وظائف 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:
    # Preserve this feature as a dense float, setting nan's to the mean.
    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 على قائمة Feature ، ويقوم التحويل بتحويلها إلى "مواصفات ميزة" (تسمى أحيانًا "مواصفات التحليل") وهي عبارة عن إملاء تكون مفاتيحها أسماء ميزات وقيمها إحدى قيم FixedLenFeature أو VarLenFeature (أو غير خيارات لا يستخدمها TensorFlow Transform).

قواعد استنتاج مواصفات الميزة من Schema هي

  • كل feature مع مجموعة shape ستؤدي إلى tf.FixedLenFeature مع شكل و default_value=None . presence.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 and dog ، فيجب أن يكون ناتج input_fn هو هذه السلاسل الأولية ، ويجب input_fn المفاتيح ["cat", "dog"] إلى المُقدِّر كمعامل (انظر التفاصيل أدناه).

من أجل التعامل مع تعيين تسميات السلسلة إلى أعداد صحيحة ، يجب عليك استخدام TensorFlow Transform لتوليد مفردات. نوضح ذلك في مقتطف الشفرة أدناه:

def _preprocessing_fn(inputs):
  """Preprocess input features into transformed features."""

  ...


  education = inputs[features.RAW_LABEL_KEY]
  _ = tft.uniques(education, vocab_filename=features.RAW_LABEL_KEY)

  ...

تأخذ وظيفة المعالجة المسبقة أعلاه ميزة الإدخال الأولي (والتي سيتم إرجاعها أيضًا كجزء من ناتج وظيفة المعالجة المسبقة) وتستدعي tft.uniques عليها. ينتج عن هذا إنشاء مفردات education يمكن الوصول إليها في النموذج.

يوضح المثال أيضًا كيفية تحويل تسمية ثم إنشاء مفردات للتسمية المحولة. على وجه الخصوص ، يأخذ education الملصق الأولي ويحول جميع الملصقات الخمس الأولى (حسب التردد) إلى UNKNOWN ، دون تحويل التسمية إلى عدد صحيح.

في مدونة نموذجية، يجب أن تعطى المصنف المفردات التي تولدها tft.uniques كما 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,
      ...)