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

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

ট্রান্সফর্ম টিএফএক্স পাইপলাইন কম্পোনেন্ট টিএফ-এ ফিচার ইঞ্জিনিয়ারিং করে কার্যকর করা হলে, 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 চালানোর আগে আপনি আপনার ডেটা পরিবর্তন করতে পারেন। কিন্তু আপনি যদি TensorFlow Transform এর মধ্যে এটি করেন, তাহলে রূপান্তরগুলি TensorFlow গ্রাফের অংশ হয়ে যায়। এই পদ্ধতিটি প্রশিক্ষণ/পরিষেবা তির্যক এড়াতে সাহায্য করে।

আপনার মডেলিং কোডের মধ্যে রূপান্তরগুলি ফিচারকলাম ব্যবহার করে। 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 s বা SparseTensor ) এবং তাই preprocessing_fn সঠিকভাবে লিখতে আপনার ডেটা টেনসর হিসাবে কীভাবে উপস্থাপন করা হয় তা বোঝা প্রয়োজন। preprocessing_fn -এর ইনপুট স্কিমা দ্বারা নির্ধারিত হয়। একটি Schema প্রোটোতে Feature একটি তালিকা থাকে এবং ট্রান্সফর্ম এগুলিকে একটি "ফিচার স্পেক" (কখনও কখনও "পার্সিং স্পেক" বলা হয়) এ রূপান্তরিত করে যা একটি ডিক্ট যার কীগুলি বৈশিষ্ট্যের নাম এবং যার মানগুলি FixedLenFeature বা VarLenFeature (বা অন্য) এর একটি। বিকল্পগুলি টেনসরফ্লো ট্রান্সফর্ম দ্বারা ব্যবহৃত হয় না)।

Schema থেকে একটি বৈশিষ্ট্য অনুমান করার নিয়ম হল

  • shape সেট সহ প্রতিটি feature ফলে আকৃতি এবং default_value=None সহ একটি tf.FixedLenFeature হবে। presence.min_fraction অবশ্যই 1 হতে হবে অন্যথায় এবং ত্রুটি দেখা দেবে, যেহেতু কোনো ডিফল্ট মান না থাকলে, একটি tf.FixedLenFeature এর বৈশিষ্ট্যটি সর্বদা উপস্থিত থাকা প্রয়োজন।
  • সেট না করা shape সহ প্রতিটি feature ফলে একটি VarLenFeature হবে।
  • প্রতিটি sparse_feature এর ফলে একটি tf.SparseFeature হবে যার size এবং is_sorted SparseFeature বার্তার fixed_shape এবং is_sorted ক্ষেত্র দ্বারা নির্ধারিত হয়।
  • একটি sparse_feature এর index_feature বা value_feature হিসাবে ব্যবহৃত বৈশিষ্ট্যগুলির বৈশিষ্ট্য বৈশিষ্ট্যে তাদের নিজস্ব এন্ট্রি থাকবে না।
  • feature type ফিল্ড (অথবা একটি sparse_feature মান বৈশিষ্ট্য) এবং ফিচার স্পেকের dtype এর মধ্যে চিঠিপত্র নিম্নলিখিত সারণী দ্বারা দেওয়া হয়েছে:
type dtype
schema_pb2.INT tf.int64
schema_pb2.FLOAT tf.float32
schema_pb2.BYTES tf.string

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

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

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

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 ব্যবহার করে।