הצטרף לקהילת SIG TFX-Addons ועזור לשפר את TFX!
דף זה תורגם על ידי Cloud Translation API.
Switch to English

עיבוד נתונים מראש עם טרנספורמציה של TensorFlow

הרכיב ההנדסי לתכונות של TensorFlow מורחב (TFX)

מחברת colab לדוגמא זו מספקת דוגמה מאוד פשוטה לאופן שבו ניתן להשתמש ב- TensorFlow Transform ( tf.Transform ) tf.Transform נתונים מראש באמצעות אותו קוד בדיוק הן לאימון מודל והן להגשת מסקנות בייצור.

TensorFlow Transform היא ספרייה לעיבוד נתונים מראש של קלט עבור TensorFlow, כולל יצירת תכונות הדורשות מעבר מלא על מערך האימונים. לדוגמה, באמצעות TensorFlow Transform אתה יכול:

  • מנרמל ערך קלט על ידי שימוש בסטיית התקן והממוצע
  • להמיר מחרוזות למספרים שלמים על ידי יצירת אוצר מילים מעל כל ערכי הקלט
  • המר צפים למספרים שלמים על ידי הקצאתם לדליים, בהתבסס על התפלגות הנתונים שנצפתה

ל- TensorFlow תמיכה מובנית במניפולציות על דוגמה אחת או על קבוצה של דוגמאות. tf.Transform מרחיב יכולות אלה כדי לתמוך במעברים מלאים על כל מערך האימונים.

הפלט של tf.Transform מיוצא כגרף TensorFlow בו אתה יכול להשתמש הן לאימון והן להגשה. שימוש באותה גרף לאימון ולהגשה יכול למנוע הטייה, מכיוון שאותן טרנספורמציות מוחלות בשני השלבים.

שדרוג פיפ

כדי להימנע משדרוג Pip במערכת בעת ריצה מקומית, בדוק כדי לוודא שאנחנו פועלים ב- Colab. ניתן כמובן לשדרג מערכות מקומיות בנפרד.

try:
  import colab
  !pip install --upgrade pip
except:
  pass

התקן את TensorFlow Transform

pip install -q -U tensorflow_transform==0.24.1

האם הפעלת מחדש את זמן הריצה?

אם אתה משתמש ב- Google Colab, בפעם הראשונה שאתה מפעיל את התא למעלה, עליך להפעיל מחדש את זמן הריצה (זמן ריצה> הפעל מחדש זמן ריצה ...). הסיבה לכך היא הדרך שבה קולאב טוענת חבילות.

יבוא

import pprint
import tempfile

import tensorflow as tf
import tensorflow_transform as tft

import tensorflow_transform.beam as tft_beam
from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils

נתונים: צור כמה נתוני דמה

ניצור כמה נתוני דמה פשוטים לדוגמא הפשוטה שלנו:

  • raw_data הם הנתונים הגולמיים הראשוניים שאנו הולכים raw_data מראש
  • raw_data_metadata מכיל את הסכימה שמספרת לנו את סוגי כל העמודות ב- raw_data . במקרה זה, זה פשוט מאוד.
raw_data = [
      {'x': 1, 'y': 1, 's': 'hello'},
      {'x': 2, 'y': 2, 's': 'world'},
      {'x': 3, 'y': 3, 's': 'hello'}
  ]

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

Transform: צור פונקציית עיבוד מקדים

פונקציית העיבוד המקדים היא המושג החשוב ביותר של tf.Transform. פונקציית עיבוד מקדים היא המקום שבו באמת מתרחשת טרנספורמציה של מערך הנתונים. היא מקבלת ומחזירה מילון של טנזורים, שבו מותח פירושו Tensor אוSparseTensor . ישנן שתי קבוצות עיקריות של קריאות API המהוות בדרך כלל לב לפונקציה של עיבוד מקדים:

  1. TensorFlow Ops: כל פונקציה שמקבלת ומחזירה טנסורים, שפירוש הדבר בדרך כלל TensorFlow ops. אלה מוסיפים פעולות TensorFlow לגרף ההופך נתונים גולמיים לנתונים שהופכו וקטור תכונות אחד בכל פעם. אלה ירוצו לכל דוגמה, גם במהלך האימונים וגם ההגשה.
  2. מנתחי / מיפוי טרנספורמציה של Tensorflow: כל המנתחים / ממפים המסופקים על ידי tf.Transform. אלה גם מקבלים ומחזירים טנזורים, ובדרך כלל מכילים שילוב של אופנס טנסורופ ו חישוב קרן, אך שלא כמו אופ טנסור פלואו הם פועלים רק בצינור קרן במהלך הניתוח הדורש מעבר מלא על כל מערך האימונים. חישוב ה- Beam פועל פעם אחת בלבד, במהלך האימון, ובדרך כלל מבצע מעבר מלא על כל מערך האימונים. הם יוצרים קבועי טנסור, המתווספים לגרף שלך. לדוגמא, tft.min מחשבת את המינימום של טנסור על פני מערך האימונים ואילו tft.scale_by_min_max מחשבת תחילה את המינימום והמקסימום של טנסור על פני מערך האימונים ואז מאזמת את הטנסור להיות בטווח שצוין על ידי המשתמש, [output_min, פלט_מקס]. tf.Transform מספק קבוצה קבועה של מנתחים / ממפים כאלה, אך זה יורחב בגרסאות עתידיות.
def preprocessing_fn(inputs):
    """Preprocess input columns into transformed columns."""
    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,
        's_integerized': s_integerized,
        'x_centered_times_y_normalized': x_centered_times_y_normalized,
    }

לשים את הכל ביחד

עכשיו אנחנו מוכנים לשנות את הנתונים שלנו. נשתמש באפצ'י קרן עם רץ ישיר ונספק שלוש כניסות:

  1. raw_data - נתוני הקלט הגולמיים שיצרנו לעיל
  2. raw_data_metadata - הסכימה של הנתונים הגולמיים
  3. preprocessing_fn - הפונקציה שיצרנו כדי להפוך את השינוי שלנו
def main():
  # Ignore the warnings
  with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
    transformed_dataset, transform_fn = (  # pylint: disable=unused-variable
        (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
            preprocessing_fn))

  transformed_data, transformed_metadata = transformed_dataset  # pylint: disable=unused-variable

  print('\nRaw data:\n{}\n'.format(pprint.pformat(raw_data)))
  print('Transformed data:\n{}'.format(pprint.pformat(transformed_data)))

if __name__ == '__main__':
  main()
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_transform/tf_utils.py:218: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use ref() instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_transform/tf_utils.py:218: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use ref() instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:No assets to write.
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
INFO:tensorflow:SavedModel written to: /tmp/tmpj6tgub64/tftransform_tmp/9e2c0b621b1c4dedbf545511b1171544/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpj6tgub64/tftransform_tmp/9e2c0b621b1c4dedbf545511b1171544/saved_model.pb
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:No assets to write.
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'
INFO:tensorflow:SavedModel written to: /tmp/tmpj6tgub64/tftransform_tmp/7e8a47e651934a98b60f04c2f38b3c88/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpj6tgub64/tftransform_tmp/7e8a47e651934a98b60f04c2f38b3c88/saved_model.pb
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended.
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['/home/kbuilder/.local/lib/python3.6/site-packages/ipykernel_launcher.py', '-f', '/tmp/tmp04j7jwel.json', '--HistoryManager.hist_file=:memory:']
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets written to: /tmp/tmpj6tgub64/tftransform_tmp/c43b09cecac94afaa878f14ade8b6e90/assets
INFO:tensorflow:Assets written to: /tmp/tmpj6tgub64/tftransform_tmp/c43b09cecac94afaa878f14ade8b6e90/assets
INFO:tensorflow:SavedModel written to: /tmp/tmpj6tgub64/tftransform_tmp/c43b09cecac94afaa878f14ade8b6e90/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tmpj6tgub64/tftransform_tmp/c43b09cecac94afaa878f14ade8b6e90/saved_model.pb
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
Raw data:
[{'s': 'hello', 'x': 1, 'y': 1},
 {'s': 'world', 'x': 2, 'y': 2},
 {'s': 'hello', 'x': 3, 'y': 3}]

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

האם זו התשובה הנכונה?

בעבר השתמשנו ב- tf.Transform לשם כך:

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)

x_centered

עם קלט [1, 2, 3] הממוצע של x הוא 2, ואנחנו מפחיתים אותו מ- x כדי למרכז את ערכי ה- x שלנו ב- 0. אז התוצאה שלנו של [-1.0, 0.0, 1.0] נכונה.

y_normalized

רצינו לשנות את ערכי ה- y שלנו בין 0 ל -1. הקלט שלנו היה [1, 2, 3] ולכן התוצאה שלנו של [0.0, 0.5, 1.0] נכונה.

s_integerized

רצינו למפות את המחרוזות שלנו לאינדקסים באוצר מילים, ובאוצר המילים שלנו היו רק 2 מילים ("שלום" ו"עולם "). אז עם קלט של ["hello", "world", "hello"] התוצאה שלנו של [0, 1, 0] נכונה. מכיוון ש"הלו "מופיע בתדירות הגבוהה ביותר בנתונים אלה, זה יהיה הערך הראשון באוצר המילים.

x_center_times_y_normalized

רצינו ליצור תכונה חדשה על ידי מעבר של x_centered ו- y_normalized באמצעות כפל. שים לב שהדבר מכפיל את התוצאות, ולא את הערכים המקוריים, והתוצאה החדשה שלנו של [-0.0, 0.0, 1.0] נכונה.