টেনসরফ্লো ট্রান্সফর্মের সাথে ডেটা প্রিপ্রসেস করুন

টেনসরফ্লো এক্সটেন্ডেড (TFX) এর ফিচার ইঞ্জিনিয়ারিং কম্পোনেন্ট

এই উদাহরণ কোল্যাব নোটবুকটি একটি খুব সহজ উদাহরণ প্রদান করে যে কিভাবে টেনসরফ্লো ট্রান্সফর্ম ( tf.Transform ) একটি মডেলকে প্রশিক্ষণ দেওয়া এবং উৎপাদনে অনুমান পরিবেশন উভয়ের জন্য ঠিক একই কোড ব্যবহার করে ডেটা প্রিপ্রসেস করতে ব্যবহার করা যেতে পারে।

টেনসরফ্লো ট্রান্সফর্ম হল টেনসরফ্লো-এর জন্য ইনপুট ডেটা প্রি-প্রসেস করার জন্য একটি লাইব্রেরি, যার মধ্যে এমন বৈশিষ্ট্যগুলি তৈরি করা যা প্রশিক্ষণ ডেটাসেটের উপর সম্পূর্ণ পাসের প্রয়োজন। উদাহরণস্বরূপ, TensorFlow Transform ব্যবহার করে আপনি করতে পারেন:

  • গড় এবং মানক বিচ্যুতি ব্যবহার করে একটি ইনপুট মান স্বাভাবিক করুন
  • সমস্ত ইনপুট মানগুলির উপর একটি শব্দভাণ্ডার তৈরি করে স্ট্রিংগুলিকে পূর্ণসংখ্যাতে রূপান্তর করুন
  • পর্যবেক্ষণ করা ডেটা বিতরণের উপর ভিত্তি করে ফ্লোটগুলিকে বালতিতে বরাদ্দ করে পূর্ণসংখ্যাতে রূপান্তর করুন

TensorFlow একটি একক উদাহরণ বা উদাহরণের একটি ব্যাচে ম্যানিপুলেশনের জন্য অন্তর্নির্মিত সমর্থন রয়েছে। tf.Transform সমগ্র প্রশিক্ষণ ডেটাসেটে সম্পূর্ণ পাস সমর্থন করার জন্য এই ক্ষমতাগুলি প্রসারিত করে।

tf.Transform এর আউটপুট একটি tf.Transform গ্রাফ হিসাবে রপ্তানি করা হয় যা আপনি প্রশিক্ষণ এবং পরিবেশন উভয়ের জন্য ব্যবহার করতে পারেন। প্রশিক্ষণ এবং পরিবেশন উভয়ের জন্য একই গ্রাফ ব্যবহার করা তির্যক প্রতিরোধ করতে পারে, যেহেতু একই রূপান্তর উভয় পর্যায়ে প্রয়োগ করা হয়।

পিপ আপগ্রেড করুন

স্থানীয়ভাবে চালানোর সময় একটি সিস্টেমে পিপ আপগ্রেড করা এড়াতে, আমরা Colab-এ চলছি কিনা তা নিশ্চিত করুন। স্থানীয় সিস্টেম অবশ্যই আলাদাভাবে আপগ্রেড করা যেতে পারে।

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

টেনসরফ্লো ট্রান্সফর্ম ইনস্টল করুন

pip install -q -U tensorflow_transform

আপনি কি রানটাইম রিস্টার্ট করেছেন?

আপনি যদি Google Colab ব্যবহার করেন, প্রথমবার উপরের সেলটি চালানোর সময়, আপনাকে অবশ্যই রানটাইমটি পুনরায় চালু করতে হবে (রানটাইম > রানটাইম পুনরায় চালু করুন ...)। 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_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),
    }))

রূপান্তর: একটি প্রিপ্রসেসিং ফাংশন তৈরি করুন

প্রিপ্রসেসিং ফাংশন হল tf.Transform-এর সবচেয়ে গুরুত্বপূর্ণ ধারণা। একটি প্রিপ্রসেসিং ফাংশন হল যেখানে ডেটাসেটের রূপান্তর সত্যিই ঘটে। এটি টেনসরের একটি অভিধান গ্রহণ করে এবং ফেরত দেয়, যেখানে একটি টেনসর মানে একটি Tensor বাSparseTensor । API কলগুলির দুটি প্রধান গ্রুপ রয়েছে যা সাধারণত একটি প্রিপ্রসেসিং ফাংশনের হৃদয় গঠন করে:

  1. TensorFlow Ops: যেকোনো ফাংশন যা টেনসর গ্রহণ করে এবং ফেরত দেয়, যার মানে সাধারণত TensorFlow অপস। এগুলি গ্রাফে TensorFlow ক্রিয়াকলাপ যুক্ত করে যা কাঁচা ডেটাকে একবারে একটি বৈশিষ্ট্য ভেক্টরে রূপান্তরিত করে। এগুলি প্রশিক্ষণ এবং পরিবেশন উভয় সময়ে প্রতিটি উদাহরণের জন্য চলবে।
  2. টেনসরফ্লো ট্রান্সফর্ম বিশ্লেষক/ম্যাপার: tf.Transform দ্বারা প্রদত্ত যেকোন বিশ্লেষক/ম্যাপার। এগুলি টেনসরগুলি গ্রহণ করে এবং ফেরত দেয় এবং সাধারণত টেনসরফ্লো অপস এবং বিম কম্পিউটেশনের সংমিশ্রণ ধারণ করে, তবে টেনসরফ্লো অপ্সের বিপরীতে এগুলি বিশ্লেষণের সময় শুধুমাত্র বিম পাইপলাইনে চলে যার জন্য সমগ্র প্রশিক্ষণ ডেটাসেটের উপর সম্পূর্ণ পাসের প্রয়োজন হয়। বীম কম্পিউটেশন শুধুমাত্র একবারই চলে, প্রশিক্ষণের সময়, এবং সাধারণত পুরো ট্রেনিং ডেটাসেটের উপর সম্পূর্ণ পাস করে। তারা টেনসর ধ্রুবক তৈরি করে, যা আপনার গ্রাফে যোগ করা হয়। উদাহরণস্বরূপ, tft.min প্রশিক্ষণ ডেটাসেটের উপর একটি টেনসরের সর্বনিম্ন গণনা করে যখন tft.scale_by_min_max প্রথমে প্রশিক্ষণ ডেটাসেটের উপর একটি টেনসরের সর্বনিম্ন এবং সর্বোচ্চ গণনা করে এবং তারপর টেনসরটিকে ব্যবহারকারী-নির্দিষ্ট পরিসরের মধ্যে স্কেল করে, [output_min, output_max]। 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,
    }

সবগুলোকে একত্রে রাখ

এখন আমরা আমাদের ডেটা রূপান্তর করতে প্রস্তুত। আমরা সরাসরি রানারের সাথে Apache Beam ব্যবহার করব এবং তিনটি ইনপুট সরবরাহ করব:

  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: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: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.7/site-packages/tensorflow_transform/tf_utils.py:289: 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.7/site-packages/tensorflow_transform/tf_utils.py:289: 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: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: ['/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py', '-f', '/tmp/tmp8aif_7w8.json', '--HistoryManager.hist_file=:memory:']
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets
2022-02-03 10:18:41.378629: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:struct2tensor is not available.
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_কেন্দ্রিক

ইনপুট দিয়ে [1, 2, 3] x এর গড় হল 2, এবং আমরা x থেকে বিয়োগ করে আমাদের x মানকে কেন্দ্র করে 0 এ। সুতরাং আমাদের [-1.0, 0.0, 1.0] এর ফলাফল সঠিক।

y_নর্মালাইজড

আমরা 0 এবং 1 এর মধ্যে আমাদের y মান স্কেল করতে চেয়েছিলাম। আমাদের ইনপুট ছিল [1, 2, 3] তাই আমাদের ফলাফল [0.0, 0.5, 1.0] সঠিক।

s_integerized

আমরা একটি শব্দভান্ডারে আমাদের স্ট্রিংগুলিকে সূচীতে ম্যাপ করতে চেয়েছিলাম এবং আমাদের শব্দভান্ডারে ("হ্যালো" এবং "ওয়ার্ল্ড") মাত্র 2টি শব্দ ছিল। সুতরাং ["hello", "world", "hello"] এর ইনপুট দিয়ে আমাদের [0, 1, 0] এর ফলাফল সঠিক। যেহেতু "হ্যালো" এই ডেটাতে প্রায়শই ঘটে, তাই এটি শব্দভান্ডারে প্রথম এন্ট্রি হবে।

x_centered_times_y_normalized

আমরা গুণন ব্যবহার করে x_centered এবং y_normalized অতিক্রম করে একটি নতুন বৈশিষ্ট্য তৈরি করতে চেয়েছিলাম। লক্ষ্য করুন যে এটি ফলাফলকে গুণ করে, মূল মান নয়, এবং আমাদের নতুন ফলাফল [-0.0, 0.0, 1.0] সঠিক।