ট্রান্সফর্ম TFX পাইপলাইন উপাদান

ট্রান্সফর্ম TFX পাইপলাইন কম্পোনেন্ট টিএফ-এ ফিচার ইঞ্জিনিয়ারিং সম্পাদন করে। একটি ExampleGen কম্পোনেন্ট থেকে নির্গত একটি SchemaGen কম্পোনেন্ট দ্বারা তৈরি একটি ডেটা স্কিমা ব্যবহার করে, এবং প্রি-ট্রান্সফর্ম এবং পোস্ট-ট্রান্সফর্ম ডেটা উভয়েরই একটি SavedModel পাশাপাশি পরিসংখ্যান নির্গত করে। কার্যকর করা হলে, SavedModel একটি ExampleGen উপাদান থেকে নির্গত tf. উদাহরণ গ্রহণ করবে এবং রূপান্তরিত বৈশিষ্ট্য ডেটা নির্গত করবে।

  • Consumes: tf. ExampleGen কম্পোনেন্ট থেকে উদাহরণ এবং SchemaGen কম্পোনেন্ট থেকে ডেটা স্কিমা।
  • নির্গত: প্রশিক্ষক উপাদানের জন্য একটি সংরক্ষিত মডেল, প্রি-ট্রান্সফর্ম এবং পোস্ট-ট্রান্সফর্ম পরিসংখ্যান।

একটি ট্রান্সফর্ম কম্পোনেন্ট কনফিগার করা হচ্ছে

একবার আপনার preprocessing_fn লেখা হয়ে গেলে, এটি একটি পাইথন মডিউলে সংজ্ঞায়িত করা প্রয়োজন যা একটি ইনপুট হিসাবে ট্রান্সফর্ম উপাদানকে প্রদান করা হয়। এই মডিউলটি ট্রান্সফর্ম দ্বারা লোড করা হবে এবং preprocessing_fn নামের ফাংশনটি খুঁজে পাবে এবং প্রিপ্রসেসিং পাইপলাইন নির্মাণের জন্য ট্রান্সফর্ম ব্যবহার করবে।

transform = Transform(
    examples=example_gen.outputs['examples'],
    schema=schema_gen.outputs['schema'],
    module_file=os.path.abspath(_taxi_transform_module_file))

অতিরিক্তভাবে, আপনি TFDV- ভিত্তিক প্রি-ট্রান্সফর্ম বা পোস্ট-ট্রান্সফর্ম পরিসংখ্যান গণনার বিকল্পগুলি প্রদান করতে চাইতে পারেন। এটি করতে, একই মডিউলের মধ্যে একটি stats_options_updater_fn সংজ্ঞায়িত করুন।

ট্রান্সফর্ম এবং টেনসরফ্লো ট্রান্সফর্ম

ট্রান্সফর্ম আপনার ডেটাসেটে ফিচার ইঞ্জিনিয়ারিং করার জন্য টেনসরফ্লো ট্রান্সফর্মের ব্যাপক ব্যবহার করে। টেনসরফ্লো ট্রান্সফর্ম আপনার মডেলে যাওয়ার আগে এবং প্রশিক্ষণ প্রক্রিয়ার অংশ হিসাবে বৈশিষ্ট্য ডেটা রূপান্তর করার জন্য একটি দুর্দান্ত সরঞ্জাম। সাধারণ বৈশিষ্ট্য রূপান্তর অন্তর্ভুক্ত:

  • এমবেডিং : উচ্চ-মাত্রিক স্থান থেকে নিম্ন মাত্রিক স্থান পর্যন্ত একটি অর্থপূর্ণ ম্যাপিং খুঁজে বের করার মাধ্যমে বিক্ষিপ্ত বৈশিষ্ট্যগুলি (যেমন একটি শব্দভান্ডার দ্বারা উত্পাদিত পূর্ণসংখ্যা আইডি) ঘন বৈশিষ্ট্যগুলিতে রূপান্তর করা। এম্বেডিংয়ের পরিচিতির জন্য মেশিন-লার্নিং ক্র্যাশ কোর্সে এমবেডিং ইউনিট দেখুন।
  • ভোকাবুলারি জেনারেশন : স্ট্রিং বা অন্যান্য অ-সংখ্যিক বৈশিষ্ট্যকে পূর্ণসংখ্যাতে রূপান্তর করা একটি শব্দভাণ্ডার তৈরি করে যা প্রতিটি অনন্য মানকে একটি আইডি নম্বরে ম্যাপ করে।
  • মানকে স্বাভাবিক করা : সাংখ্যিক বৈশিষ্ট্যগুলিকে রূপান্তরিত করা যাতে সেগুলি সব একই পরিসরের মধ্যে পড়ে।
  • বালতিকরণ : বিচ্ছিন্ন বালতিতে মান নির্ধারণ করে ক্রমাগত-মূল্যবান বৈশিষ্ট্যগুলিকে স্বতন্ত্র বৈশিষ্ট্যে রূপান্তর করা।
  • টেক্সট বৈশিষ্ট্য সমৃদ্ধ করা : টোকেন, এন-গ্রাম, সত্তা, সেন্টিমেন্ট ইত্যাদির মতো কাঁচা ডেটা থেকে বৈশিষ্ট্যগুলি তৈরি করা, বৈশিষ্ট্য সেটটিকে সমৃদ্ধ করতে।

টেনসরফ্লো ট্রান্সফর্ম এই এবং অন্যান্য অনেক ধরনের রূপান্তরের জন্য সমর্থন প্রদান করে:

  • আপনার সাম্প্রতিক ডেটা থেকে স্বয়ংক্রিয়ভাবে একটি শব্দভান্ডার তৈরি করুন।

  • আপনার মডেলে পাঠানোর আগে আপনার ডেটাতে নির্বিচারে রূপান্তরগুলি সম্পাদন করুন৷ টেনসরফ্লো ট্রান্সফর্ম আপনার মডেলের জন্য টেনসরফ্লো গ্রাফে রূপান্তর তৈরি করে যাতে প্রশিক্ষণ এবং অনুমানের সময়ে একই রূপান্তরগুলি সঞ্চালিত হয়। আপনি রূপান্তরগুলিকে সংজ্ঞায়িত করতে পারেন যা ডেটার বৈশ্বিক বৈশিষ্ট্যগুলিকে নির্দেশ করে, যেমন সমস্ত প্রশিক্ষণ দৃষ্টান্ত জুড়ে একটি বৈশিষ্ট্যের সর্বোচ্চ মান।

TFX চালানোর আগে আপনি আপনার ডেটা পরিবর্তন করতে পারেন। কিন্তু আপনি যদি এটি টেনসরফ্লো ট্রান্সফর্মের মধ্যে করেন তবে রূপান্তরগুলি টেনসরফ্লো গ্রাফের অংশ হয়ে যায়। এই পদ্ধতিটি প্রশিক্ষণ/সার্ভিং স্কু এড়াতে সাহায্য করে।

আপনার মডেলিং কোডের মধ্যে রূপান্তরগুলি ফিচারকলাম ব্যবহার করে। FeatureColumns ব্যবহার করে, আপনি bucketizations, integerizations যা পূর্বনির্ধারিত শব্দভান্ডার ব্যবহার করে, অথবা অন্য কোন রূপান্তর যা ডেটা না দেখে সংজ্ঞায়িত করা যেতে পারে তা সংজ্ঞায়িত করতে পারেন।

বিপরীতে, টেনসরফ্লো ট্রান্সফর্ম এমন রূপান্তরগুলির জন্য ডিজাইন করা হয়েছে যেগুলির মানগুলি গণনা করার জন্য ডেটার উপর সম্পূর্ণ পাস প্রয়োজন যা আগে থেকে জানা যায় না। উদাহরণস্বরূপ, শব্দভান্ডার তৈরির জন্য ডেটার উপর সম্পূর্ণ পাস প্রয়োজন।

Apache Beam ব্যবহার করে মান গণনা করার পাশাপাশি, TensorFlow Transform ব্যবহারকারীদের এই মানগুলিকে একটি TensorFlow গ্রাফে এম্বেড করার অনুমতি দেয়, যা তারপর প্রশিক্ষণ গ্রাফে লোড করা যেতে পারে। উদাহরণস্বরূপ বৈশিষ্ট্যগুলিকে স্বাভাবিক করার সময়, tft.scale_to_z_score ফাংশনটি একটি বৈশিষ্ট্যের গড় এবং মানক বিচ্যুতি গণনা করবে, এবং একটি উপস্থাপনা, একটি TensorFlow গ্রাফে, যে ফাংশনের গড় বিয়োগ করে এবং আদর্শ বিচ্যুতি দ্বারা ভাগ করে। শুধুমাত্র পরিসংখ্যান নয়, একটি টেনসরফ্লো গ্রাফ নির্গত করে, টেনসরফ্লো ট্রান্সফর্ম আপনার প্রিপ্রসেসিং পাইপলাইন লেখার প্রক্রিয়াটিকে সহজ করে।

যেহেতু প্রিপ্রসেসিং একটি গ্রাফ হিসাবে প্রকাশ করা হয়, তাই এটি সার্ভারে ঘটতে পারে এবং এটি প্রশিক্ষণ এবং পরিবেশনের মধ্যে সামঞ্জস্যপূর্ণ হওয়ার নিশ্চয়তা। এই সামঞ্জস্যতা প্রশিক্ষণ/পরিষেবা স্কুয়ের একটি উৎসকে বাদ দেয়।

TensorFlow Transform ব্যবহারকারীদের TensorFlow কোড ব্যবহার করে তাদের প্রিপ্রসেসিং পাইপলাইন নির্দিষ্ট করতে দেয়। এর মানে হল যে একটি পাইপলাইন টেনসরফ্লো গ্রাফের মতো একইভাবে তৈরি করা হয়েছে। যদি এই গ্রাফে শুধুমাত্র TensorFlow অপ্স ব্যবহার করা হয়, তাহলে পাইপলাইনটি একটি বিশুদ্ধ মানচিত্র হবে যা ইনপুটের ব্যাচ গ্রহণ করে এবং আউটপুটের ব্যাচ প্রদান করে। tf.Estimator API ব্যবহার করার সময় এই ধরনের একটি পাইপলাইন আপনার input_fn ভিতরে এই গ্রাফটি স্থাপন করার সমতুল্য হবে। কম্পিউটিং কোয়ান্টাইলের মতো ফুল-পাস ক্রিয়াকলাপগুলি নির্দিষ্ট করার জন্য, টেনসরফ্লো ট্রান্সফর্ম analyzers নামে বিশেষ ফাংশন সরবরাহ করে যা টেনসরফ্লো অপসের মতো প্রদর্শিত হয়, তবে প্রকৃতপক্ষে একটি বিলম্বিত গণনা নির্দিষ্ট করে যা Apache Beam দ্বারা করা হবে এবং আউটপুটটি গ্রাফে একটি হিসাবে ঢোকানো হবে। ধ্রুবক যখন একটি সাধারণ TensorFlow op একটি একক ব্যাচকে তার ইনপুট হিসাবে নেবে, ঠিক সেই ব্যাচে কিছু গণনা করবে এবং একটি ব্যাচ নির্গত করবে, একজন analyzer সমস্ত ব্যাচের উপর একটি বিশ্বব্যাপী হ্রাস (Apache Beam এ প্রয়োগ করা হয়েছে) সঞ্চালন করবে এবং ফলাফল প্রদান করবে।

সাধারণ TensorFlow ops এবং TensorFlow ট্রান্সফর্ম বিশ্লেষক একত্রিত করে, ব্যবহারকারীরা তাদের ডেটা প্রিপ্রসেস করার জন্য জটিল পাইপলাইন তৈরি করতে পারে। উদাহরণস্বরূপ tft.scale_to_z_score ফাংশনটি একটি ইনপুট টেনসর নেয় এবং ফেরত দেয় যে টেনসরকে স্বাভাবিক করা হয়েছে মানে 0 এবং ভ্যারিয়েন্স 1 । এটি হুডের নীচে mean এবং var বিশ্লেষককে কল করে এটি করে, যা কার্যকরভাবে ইনপুট টেনসরের গড় এবং বৈচিত্র্যের সমান গ্রাফে ধ্রুবক তৈরি করবে। এটি তখন গড় বিয়োগ করতে এবং আদর্শ বিচ্যুতি দ্বারা ভাগ করতে TensorFlow অপ্স ব্যবহার করবে।

TensorFlow Transform preprocessing_fn

TFX ট্রান্সফর্ম কম্পোনেন্ট ডেটা পড়া এবং লেখার সাথে সম্পর্কিত API কলগুলি পরিচালনা করে এবং আউটপুট SavedModel ডিস্কে লিখে ট্রান্সফর্মের ব্যবহারকে সহজ করে। একজন TFX ব্যবহারকারী হিসাবে, আপনাকে শুধুমাত্র preprocessing_fn নামে একটি একক ফাংশন সংজ্ঞায়িত করতে হবে। preprocessing_fn -এ আপনি ফাংশনের একটি সিরিজ সংজ্ঞায়িত করেন যা টেনসরের আউটপুট ডিক্ট তৈরি করতে টেনসরের ইনপুট ডিক্টকে ম্যানিপুলেট করে। আপনি টেনসরফ্লো ট্রান্সফর্ম এপিআই-এ স্কেল_টু_0_1 এবং কম্পিউট_এন্ড_অ্যাপ্লাই_ভোকাবুলারির মতো সহায়ক ফাংশনগুলি খুঁজে পেতে পারেন বা নীচে দেখানো হিসাবে নিয়মিত টেনসরফ্লো ফাংশনগুলি ব্যবহার করতে পারেন।

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:
    # If sparse make it dense, setting nan's to 0 or '', and apply zscore.
    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 টেনসরগুলির উপর একটি সিরিজের ক্রিয়াকলাপ বর্ণনা করে (অর্থাৎ, Tensor , SparseTensor , বা RaggedTensor )। preprocessing_fn সঠিকভাবে সংজ্ঞায়িত করার জন্য ডেটা কীভাবে টেনসর হিসাবে উপস্থাপন করা হয় তা বোঝা দরকার। preprocessing_fn এর ইনপুট স্কিমা দ্বারা নির্ধারিত হয়। একটি Schema প্রোটো শেষ পর্যন্ত একটি "ফিচার স্পেক" এ রূপান্তরিত হয় (কখনও কখনও "পার্সিং স্পেক" বলা হয়) যা ডেটা পার্সিংয়ের জন্য ব্যবহৃত হয়, এখানে রূপান্তর যুক্তি সম্পর্কে আরও বিশদ দেখুন।

স্ট্রিং লেবেল পরিচালনা করতে টেনসরফ্লো ট্রান্সফর্ম ব্যবহার করে

সাধারণত কেউ একটি শব্দভাণ্ডার তৈরি করতে এবং স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করতে সেই শব্দভাণ্ডারটি প্রয়োগ করতে উভয়ের জন্য টেনসরফ্লো ট্রান্সফর্ম ব্যবহার করতে চায়। এই ওয়ার্কফ্লো অনুসরণ করার সময়, মডেলে নির্মিত input_fn ইন্টিজারাইজড স্ট্রিং আউটপুট করবে। তবে লেবেলগুলি একটি ব্যতিক্রম, কারণ মডেলটি আউটপুট (পূর্ণসংখ্যা) লেবেলগুলিকে স্ট্রিংগুলিতে ম্যাপ করতে সক্ষম হওয়ার জন্য, লেবেলের সম্ভাব্য মানগুলির একটি তালিকা সহ একটি স্ট্রিং লেবেল আউটপুট করতে মডেলটির input_fn প্রয়োজন৷ যেমন যদি লেবেল cat এবং dog হয় তাহলে input_fn এর আউটপুট এই কাঁচা স্ট্রিং হওয়া উচিত, এবং কীগুলি ["cat", "dog"] একটি প্যারামিটার হিসাবে অনুমানকারীতে পাস করতে হবে (নীচে বিস্তারিত দেখুন)।

পূর্ণসংখ্যাতে স্ট্রিং লেবেলের ম্যাপিং পরিচালনা করার জন্য, আপনার একটি শব্দভাণ্ডার তৈরি করতে TensorFlow Transform ব্যবহার করা উচিত। আমরা নীচের কোড স্নিপেটে এটি প্রদর্শন করি:

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

  ...


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

  ...

উপরের প্রিপ্রসেসিং ফাংশনটি কাঁচা ইনপুট বৈশিষ্ট্যটি নেয় (যা প্রিপ্রসেসিং ফাংশনের আউটপুটের অংশ হিসাবেও ফেরত দেওয়া হবে) এবং এটিতে tft.vocabulary কল করে। এর ফলে education জন্য একটি শব্দভাণ্ডার তৈরি হয় যা মডেলটিতে অ্যাক্সেস করা যেতে পারে।

উদাহরণটিও দেখায় কিভাবে একটি লেবেলকে রূপান্তর করতে হয় এবং তারপরে রূপান্তরিত লেবেলের জন্য একটি শব্দভাণ্ডার তৈরি করতে হয়। বিশেষ করে এটি কাঁচা লেবেল education নেয় এবং লেবেলটিকে একটি পূর্ণসংখ্যাতে রূপান্তর না করেই শীর্ষ 5টি লেবেল (ফ্রিকোয়েন্সি অনুসারে) UNKNOWN এ রূপান্তরিত করে।

মডেল কোডে, ক্লাসিফায়ারকে অবশ্যই label_vocabulary আর্গুমেন্ট হিসাবে tft.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,
      ...)

প্রি-ট্রান্সফর্ম এবং পোস্ট-ট্রান্সফর্ম পরিসংখ্যান কনফিগার করা

উপরে উল্লিখিত হিসাবে, ট্রান্সফর্ম কম্পোনেন্ট টিএফডিভিকে প্রি-ট্রান্সফর্ম এবং পোস্ট-ট্রান্সফর্ম পরিসংখ্যান গণনা করতে আহ্বান করে। TFDV ইনপুট হিসাবে একটি ঐচ্ছিক StatsOptions অবজেক্ট নেয়। ব্যবহারকারীরা কিছু অতিরিক্ত পরিসংখ্যান (যেমন এনএলপি পরিসংখ্যান) সক্ষম করতে বা বৈধ হওয়া থ্রেশহোল্ড সেট করতে (যেমন সর্বনিম্ন / সর্বোচ্চ টোকেন ফ্রিকোয়েন্সি) সক্ষম করতে এই বস্তুটিকে কনফিগার করতে চাইতে পারেন। এটি করতে, মডিউল ফাইলে একটি stats_options_updater_fn সংজ্ঞায়িত করুন।

def stats_options_updater_fn(stats_type, stats_options):
  ...
  if stats_type == stats_options_util.StatsType.PRE_TRANSFORM:
    # Update stats_options to modify pre-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  if stats_type == stats_options_util.StatsType.POST_TRANSFORM
    # Update stats_options to modify post-transform statistics computation.
    # Most constraints are specified in the schema which can be accessed
    # via stats_options.schema.
  return stats_options

পোস্ট-ট্রান্সফর্ম পরিসংখ্যান প্রায়শই একটি বৈশিষ্ট্যের প্রিপ্রসেসিংয়ের জন্য ব্যবহৃত শব্দভান্ডারের জ্ঞান থেকে উপকৃত হয়। প্রতিটি TFT-উত্পাদিত শব্দভান্ডারের জন্য পাথ ম্যাপিংয়ের শব্দভান্ডারের নাম স্ট্যাটসঅপশন (এবং তাই TFDV) এ প্রদান করা হয়। অতিরিক্তভাবে, বাহ্যিকভাবে তৈরি শব্দভান্ডারের জন্য ম্যাপিং যোগ করা যেতে পারে (i) সরাসরি StatsOptions-এর মধ্যে vocab_paths অভিধান পরিবর্তন করে অথবা (ii) tft.annotate_asset ব্যবহার করে।