সাইন টিএফএক্স-অ্যাডনস সম্প্রদায়টিতে যোগদান করুন এবং টিএফএক্স আরও উন্নত করতে সহায়তা করুন!

টেনসরফ্লো ট্রান্সফর্ম দিয়ে শুরু করুন

এই গাইডে tf.Transform . tf.Transform প্রাথমিক ধারণাগুলি এবং tf.Transform কীভাবে ব্যবহার করতে হয় তা উপস্থাপন করে। এটি হবে:

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

একটি প্রাকপ্রসেসিং ফাংশন সংজ্ঞায়িত করুন

Preprocessing ফাংশনের সবচেয়ে গুরুত্বপূর্ণ ধারণা tf.Transform । প্রিপ্রসেসিং ফাংশন হ'ল ডেটাসেটের রূপান্তরের যৌক্তিক বিবরণ। Preprocessing ফাংশন গ্রহণ করে এবং tensors একটি অভিধান, যেখানে একটি টেন্সর মানে ফেরৎ Tensor বা SparseTensor । প্রাকপ্রসেসিং ফাংশন সংজ্ঞায়িত করতে দুটি ধরণের ফাংশন ব্যবহৃত হয়:

  1. যে কোনও ফাংশন যা টেনারগুলি গ্রহণ করে এবং প্রদান করে। এগুলি গ্রাফটিতে টেনসরফ্লো অপারেশনগুলি যুক্ত করে যা কাঁচা তথ্যকে রূপান্তরিত ডেটাতে রূপান্তর করে।
  2. tf.Transform দ্বারা প্রদত্ত বিশ্লেষকদের মধ্যে tf.Transform । বিশ্লেষকরাও টেনারগুলি গ্রহণ করে এবং ফেরত দেন, তবে টেনসরফ্লো কার্যক্রমে ভিন্ন, তারা গ্রাফটিতে ক্রিয়াকলাপ যোগ করে না । পরিবর্তে, বিশ্লেষকরা tf.Transform বাইরে একটি পূর্ণ-পাস অপারেশন গণনা করার জন্য tf.Transform কারণ করে। আউটপুট হিসাবে ফেরত আসা একটি ধ্রুবক টেনसर তৈরি করতে তারা পুরো ডেটাसेटের উপর ইনপুট টেনসর মান ব্যবহার করে। উদাহরণস্বরূপ, tft.min ডেটাसेटের উপর সর্বনিম্ন একটি tft.min গণনা করে। tf.Transform বিশ্লেষকদের একটি নির্দিষ্ট সেট সরবরাহ করে, তবে এটি ভবিষ্যতের সংস্করণগুলিতে প্রসারিত হবে।

প্রাক ক্রিয়াকলাপ উদাহরণ

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

import tensorflow as tf
import tensorflow_transform as tft
import tensorflow_transform.beam as tft_beam

def preprocessing_fn(inputs):
  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,
      'x_centered_times_y_normalized': x_centered_times_y_normalized,
      's_integerized': s_integerized
  }

এখানে x , y এবং s হ'ল Tensor এস যা ইনপুট বৈশিষ্ট্যগুলি উপস্থাপন করে। প্রথম নতুন টেন্সর যে তৈরি করা হয় x_centered , প্রয়োগের দ্বারা নির্মিত tft.mean করার x এবং থেকে এই বিয়োগ xtft.mean(x) টেনসর x এর গড় উপস্থাপন করে একটি টেনসর দেয়। x_centered হ'ল গড় বিয়োগফল সহ টেনসর x

দ্বিতীয় নতুন টেনসর, y_normalized , একই পদ্ধতিতে তৈরি করা হয়েছে তবে সুবিধা পদ্ধতি tft.scale_to_0_1 ব্যবহার করে। এই পদ্ধতিটি x_centered গণনা করার মতো কিছু করে, যথা একটি সর্বাধিক এবং সর্বনিম্ন গণনা করা এবং x_centered y জন্য ব্যবহার করে।

টেন্সর s_integerized স্ট্রিং ম্যানিপুলেশন একটি উদাহরণ দেখায়। এই ক্ষেত্রে, আমরা একটি স্ট্রিং নিয়ে এটি পূর্ণসংখ্যার সাথে মানচিত্র করি। এটি সুবিধামত ফাংশনtft.compute_and_apply_vocabulary ব্যবহার করে। এই ফাংশনটি ইনপুট স্ট্রিংয়ের দ্বারা গৃহীত অনন্য মানগুলি গণনা করতে একটি বিশ্লেষক ব্যবহার করে এবং তারপরে অনন্য মানগুলির সারণীতে ইনপুট স্ট্রিংগুলিকে সূচকগুলিতে রূপান্তর করতে টেনসরফ্লো অপারেশনগুলি ব্যবহার করে।

চূড়ান্ত কলামটি দেখায় যে টেনসর সমন্বয় করে নতুন বৈশিষ্ট্য তৈরি করতে টেনসরফ্লো অপারেশন ব্যবহার করা সম্ভব।

প্রিপ্রসেসিং ফাংশন একটি ডেটাসেটে অপারেশনগুলির একটি পাইপলাইন সংজ্ঞা দেয়। পাইপলাইন প্রয়োগ করতে, আমরা tf.Transform API এর একটি কংক্রিট বাস্তবায়নের উপর নির্ভর করি। অ্যাপাচি বিম প্রয়োগ PTransform যা ব্যবহারকারীর PTransform ফাংশন প্রয়োগ করে। tf.Transform ব্যবহারকারীর সাধারণ কর্মপ্রবাহ একটি tf.Transform ফাংশন তৈরি করবে, তারপরে এটিকে একটি বৃহত বিম পাইপলাইনে সংযুক্ত করে প্রশিক্ষণের জন্য ডেটা তৈরি করবে।

ব্যাচিং

ব্যাচিং টেনসরফ্লো এর একটি গুরুত্বপূর্ণ অঙ্গ। যেহেতু tf.Transform . tf.Transform লক্ষ্যগুলির মধ্যে একটি tf.Transform জন্য একটি টেনসরফ্লো গ্রাফ সরবরাহ করা যা সার্ভিং গ্রাফের সাথে সংযুক্ত করা যায় (এবং, বিকল্পভাবে প্রশিক্ষণ গ্রাফ), তাই tf.Transform একটি গুরুত্বপূর্ণ ধারণা।

উপরের উদাহরণে স্পষ্ট না হলেও, ব্যবহারকারী সংজ্ঞায়িত প্রিপ্রোসেসিং ফাংশনটি টেনারফ্লোতে প্রশিক্ষণ দেওয়ার সময় এবং পরিবেশনার সময় যেমন পৃথক দৃষ্টান্ত নয়, ব্যাচের প্রতিনিধিত্ব করে তা উত্তীর্ণ হয়। অন্যদিকে, বিশ্লেষকরা পুরো ডেটাসেটের উপরে এমন একটি গণনা সম্পাদন করেন যা মানগুলির একটি ব্যাচ নয়, একক মান প্রদান করে। x একটি হল Tensor একটি আকৃতি দিয়ে (batch_size,) যখন tft.mean(x) একটি হল Tensor একটি আকৃতি সঙ্গে () । বিয়োগ x - tft.mean(x) সম্প্রচার যেখানে মান tft.mean(x) ব্যাচ দ্বারা প্রতিনিধিত্ব প্রতিটি উপাদান থেকে বিয়োগ করা হয় x

অ্যাপাচি বিমের বাস্তবায়ন

Preprocessing ফাংশন একাধিক ডেটা প্রক্রিয়াকরণের অবকাঠামো উপর প্রয়োগ একটি প্রাক-প্রক্রিয়াকরণ পাইপলাইন একটি লজিক্যাল বিবরণ হিসাবে দেয়ার উদ্দেশ্যে করা হচ্ছে, তখন tf.Transform একটি ক্যানোনিকাল এ্যাপাচি রশ্মি ব্যবহৃত বাস্তবায়ন প্রদান করে। এই বাস্তবায়ন একটি বাস্তবায়ন থেকে প্রয়োজনীয় কার্যকারিতা প্রদর্শন করে। এই কার্যকারিতাটির জন্য কোনও আনুষ্ঠানিক এপিআই নেই, সুতরাং প্রতিটি বাস্তবায়ন এমন একটি API ব্যবহার করতে পারে যা তার নির্দিষ্ট ডেটা প্রসেসিং ফ্রেমওয়ার্কের জন্য মূর্তিমান matic

অ্যাপাচি বিম বাস্তবায়ন প্রিপ্রসেসিং ফাংশনটির জন্য ডেটা প্রক্রিয়াকরণের জন্য ব্যবহৃত দুটি PTransform সরবরাহ করে। নিম্নলিখিতটি সম্মিলিত PTransform AnalyzeAndTransformDataset এবং PTransform AnalyzeAndTransformDataset ব্যবহার দেখায়:

raw_data = [
    {'x': 1, 'y': 1, 's': 'hello'},
    {'x': 2, 'y': 2, 's': 'world'},
    {'x': 3, 'y': 3, 's': 'hello'}
]

raw_data_metadata = ...
transformed_dataset, transform_fn = (
    (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
        preprocessing_fn))
transformed_data, transformed_metadata = transformed_dataset

transformed_data সামগ্রীটি নীচে দেখানো হয়েছে এবং কাঁচা ডেটার মতো একই ফর্ম্যাটে রূপান্তরিত কলামগুলি রয়েছে। বিশেষত, s_integerized এর মানগুলি [0, 1, 0] এই মানগুলি hello এবং world শব্দগুলি কীভাবে পূর্ণসংখ্যায় ম্যাপ করা হয়েছিল তার উপর নির্ভর করে, যা s_integerized । জন্য কলাম x_centered , আমরা মানে বিয়োগ তাই কলাম মান x , যা ছিল [1.0, 2.0, 3.0] , হয়ে ওঠে [-1.0, 0.0, 1.0] । একইভাবে, অন্যান্য কলামগুলি তাদের প্রত্যাশিত মানগুলির সাথে মেলে।

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

raw_data এবং transformed_data উভয়ই ডেটাসেট। পরবর্তী দুটি বিভাগ দেখায় যে কীভাবে বিমের প্রয়োগটি ডেটাসেটগুলি উপস্থাপন করে এবং কীভাবে ডিস্কে ডেটা পড়তে এবং লিখতে হয়। অন্যান্য রিটার্ন মান, transform_fn , নীচে বিস্তারিতভাবে আবৃত, ডেটা প্রয়োগ করা রূপান্তর উপস্থাপন করে।

AnalyzeAndTransformDataset TransformDataset AnalyzeDataset দুটি AnalyzeDataset এবং TransformDataset বাস্তবায়ন দ্বারা সরবরাহিত মৌলিক রূপান্তরগুলির AnalyzeDataset । সুতরাং নিম্নলিখিত দুটি কোড স্নিপেট সমান:

transformed_data, transform_fn = (
    my_data | tft_beam.AnalyzeAndTransformDataset(preprocessing_fn))
transform_fn = my_data | tft_beam.AnalyzeDataset(preprocessing_fn)
transformed_data = (my_data, transform_fn) | tft_beam.TransformDataset()

transform_fn একটি খাঁটি ফাংশন যা একটি অপারেশনকে উপস্থাপন করে যা ডেটাসেটের প্রতিটি সারিতে প্রয়োগ করা হয়। বিশেষত বিশ্লেষক মানগুলি ইতিমধ্যে গণনা করা হয় এবং ধ্রুবক হিসাবে বিবেচিত হয়। উদাহরণস্বরূপ, transform_fn -এ কলাম x এর গড়, সর্বনিম্ন কলাম y এর সর্বনিম্ন এবং সর্বোচ্চ এবং শব্দভাণ্ডারটি পূর্ণসংখ্যার সাথে স্ট্রিংগুলি মানচিত্র করতে ব্যবহৃত হয়।

tf.Transform একটি গুরুত্বপূর্ণ বৈশিষ্ট্য tf.Transform transform_fn সারিগুলির উপরে একটি মানচিত্র উপস্থাপন করে - এটি প্রতিটি সারিতে পৃথকভাবে প্রয়োগ করা একটি খাঁটি ফাংশন। একত্রিত সারিগুলির সমস্ত গণনা AnalyzeDataset সম্পন্ন হয়। তদ্ব্যতীত, transform_fn টেনসরফ্লো Graph হিসাবে উপস্থাপিত হয় যা পরিবেশন গ্রাফটিতে এম্বেড করা যেতে পারে।

AnalyzeAndTransformDataset এই বিশেষ ক্ষেত্রে AnalyzeAndTransformDataset জন্য সরবরাহ করা হয়। এটি সাইকিট-লার্নে ব্যবহৃত একই প্যাটার্ন, fit , transform এবং fit_transform পদ্ধতি সরবরাহ করে।

ডেটা ফর্ম্যাট এবং স্কিমা

টিএফটি বিমের প্রয়োগ দুটি পৃথক ইনপুট ডেটা ফর্ম্যাট গ্রহণ করে। "উদাহরণস্বরূপ ডিক" ফর্ম্যাট (যেমন উপরের উদাহরণে এবং simple_example.py দেখা যায়) একটি স্বজ্ঞাত বিন্যাস এবং এটি টিএফএক্সআইও ( অ্যাপাচি তীর ) ফর্ম্যাটটি উন্নত কর্মক্ষমতা সরবরাহ করে এবং বড় ডেটাসেটের জন্য উপযুক্ত small

বিম প্রয়োগটি পিসোল্লেশনের সাথে "মেটাডেটা" দ্বারা ইনপুট পিসিলেকশন কোন বিন্যাসে আসবে তা জানায়:

(raw_data, raw_data_metadata) | tft.AnalyzeDataset(...)
  • raw_data_metadata যদি raw_data_metadata হয় dataset_metadata.DatasetMetadata (নীচে দেখুন "দৃষ্টান্তের raw_data 'ফর্ম্যাট" বিভাগ), তবে raw_data " raw_data " ফর্ম্যাটে raw_data বলে আশা করা হচ্ছে।
  • যদি raw_data_metadata যদি একটি tfxio.TensorAdapterConfig (নীচে দেখুন, "টিএফএক্সআইও ফর্ম্যাট" বিভাগ) থাকে তবে raw_data টিএফএক্সআইও ফর্ম্যাটে থাকবে বলে আশা করা হচ্ছে।

"দৃষ্টান্ত ডিক" ফর্ম্যাট

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

উদাহরণস্বরূপ ডেটাটির জন্য স্কিমার সংজ্ঞা এখানে দেওয়া হয়েছে:

from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils

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

Schema প্রোটোতে তার অন ডিস্ক বা ইন-মেমরি ফর্ম্যাট থেকে ডেটাগুলি ট্যানসারে পার্স করার জন্য প্রয়োজনীয় তথ্য রয়েছে। এটি প্রথাগতভাবে কলিং দ্বারা সংস্থাপিত হয় schema_utils.schema_from_feature_spec করার জন্য একটি অভি ম্যাপিং বৈশিষ্ট্য কী এর মাধ্যমে tf.io.FixedLenFeature , tf.io.VarLenFeature এবং tf.io.SparseFeature মান। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন tf.parse_example

উপরে আমরা tf.io.FixedLenFeature ব্যবহার tf.io.FixedLenFeature তা নির্দেশ করতে প্রতিটি বৈশিষ্ট্যে একটি নির্দিষ্ট সংখ্যক মান রয়েছে, tf.io.FixedLenFeature একটি একক স্কেলারের মান। যেহেতু tf.Transform ব্যাচ উদাহরণস্বরূপ, বৈশিষ্ট্যটি উপস্থাপন করে প্রকৃত Tensor আকৃতির (None,) যেখানে অজানা মাত্রাটি ব্যাচের মাত্রা।

TFXIO ফর্ম্যাট

এই ফর্ম্যাটটি সহ, ডেটাটি একটি pyarrow.RecordBatch থাকবে বলে আশা করা হচ্ছে। ট্যাবুলার ডেটার জন্য, আমাদের অ্যাপাচি বিম প্রয়োগটি অ্যারো RecordBatch গ্রহণ করে যা নিম্নলিখিত ধরণের কলামগুলিতে থাকে:

  • pa.list_(<primitive>) , যেখানে <primitive> হয় pa.int64() , pa.float32() pa.binary() বা pa.large_binary()

  • pa.large_list(<primitive>)

RecordBatch হিসাবে উপস্থাপন করার সময় আমরা উপরে ব্যবহৃত খেলনা ইনপুট ডেটাসেটটি নীচের মত দেখায়:

raw_data = [
    pa.record_batch([
        pa.array([[1], [2], [3]], pa.list_(pa.float32())),
        pa.array([[1], [2], [3]], pa.list_(pa.float32())),
        pa.array([['hello'], ['world'], ['hello']], pa.list_(pa.binary())),
    ], ['x', 'y', 's'])
]

"উদাহরণস্বরূপ" বিন্যাসের সাথে চলার জন্য ডেটাসেটমেটাডাটার অনুরূপ, একটি tfxio.TensorAdapterConfig RecordBatch এস সহ প্রয়োজন। এটা তীর স্কিমা নিয়ে গঠিত RecordBatch স্প্যানিশ ভাষায় এবং TensorRepresentations স্বতন্ত্র নির্ধারণ কিভাবে কলাম RecordBatch স্প্যানিশ ভাষায় TensorFlow Tensors হিসেবে ব্যাখ্যা করা যেতে পারে (তত্সহ তবে tf.Tensor, tf.SparseTensor সীমাবদ্ধ নয়)।

TensorRepresentations হ'ল একটি Dict[Text, TensorRepresentation] যা একটি Dict[Text, TensorRepresentation] মধ্যে সম্পর্ক স্থাপন করে যা preprocessing_fn RecordBatch এস-এ কলামগুলি গ্রহণ করে এবং কলামগুলি দেয়। উদাহরণ স্বরূপ:

tensor_representation = {
    'x': text_format.Parse(
        """dense_tensor { column_name: "col1" shape { dim { size: 2 } } }"""
        schema_pb2.TensorRepresentation())
}

এর মানে হল যে inputs['x'] মধ্যে preprocessing_fn একটি ঘন হওয়া উচিত tf.Tensor, যার মান নামের একটি কলাম থেকে আসা 'col1' ইনপুটে RecordBatch স্প্যানিশ ভাষায়, এবং তার (শ্রেণীবদ্ধ) আকৃতি হওয়া উচিত [batch_size, 2]

TensorRepresentation মেটাডেটাতে সংজ্ঞায়িত একটি TensorRepresentation

টেনসরফ্লো এর সাথে সামঞ্জস্যতা

tf.Transform উপরে TF 1.x বা একটি TF 2.x স্যাভডমোডেল হিসাবে transform_fn রফতানির জন্য সমর্থন সরবরাহ করে। 0.30 রিলিজের পূর্বে ডিফল্ট আচরণটি একটি টিএফ 1.x সেভডমডেল রফতানি করেছিল। 0.30 প্রকাশের সাথে শুরু করে ডিফল্ট আচরণটি টিএফ 2.x স্যাভডমোডেল রফতানি করা উচিত যদি না টিএফ 2.x আচরণগুলি স্পষ্টভাবে অক্ষম না করা হয় (উদাহরণস্বরূপ tf.compat.v1.disable_v2_behavior() কল করে)।

যেমন মেমরি 1.x ধারণা ব্যবহার যদি Estimators এবং Sessions , আপনি পাশ দিয়ে পূর্ববর্তী আচরণ বজায় রাখতে পারে force_tf_compat_v1=True করতে tft_beam.Context যদি ব্যবহার tf.Transform একটি স্বতন্ত্র লাইব্রেরি রূপে বা ট্রান্সফর্ম TFX মধ্যে অংশ।

TF 2.x সেভডমোডেল হিসাবে transform_fn রফতানি করার সময়, preprocessing_fn tf.function ব্যবহার করে সন্ধানযোগ্য হবে বলে আশা করা হচ্ছে। অতিরিক্তভাবে, যদি আপনার পাইপলাইনটি দূরবর্তীভাবে চালিত হয় (উদাহরণস্বরূপ DataflowRunner ), নিশ্চিত করুন যে preprocessing_fn - preprocessing_fn এবং যে কোনও নির্ভরতা এখানে বর্ণিত হিসাবে সঠিকভাবে প্যাকেজ হয়েছে

টিএফ 2.x সেভডমোডেল রফতানি করতে tf.Transform ব্যবহার করে জ্ঞাত সমস্যাগুলি এখানে নথিভুক্ত করা হয়েছে

আপাচে বিমের সাথে ইনপুট এবং আউটপুট

এখনও অবধি, আমরা পাইথন তালিকায় ইনপুট এবং আউটপুট ডেটা দেখেছি ( RecordBatch এস বা উদাহরণের অভিধানের)। এটি সরলীকরণ যা তালিকায় কাজ করার পাশাপাশি অ্যাপ্লিকেশনগুলির মূল উপস্থাপনা, PCollection উপর আপাচি বিমের ক্ষমতা নির্ভর করে।

একটি PCollection এমন একটি ডেটা উপস্থাপনা যা মরীচি পাইপলাইনের একটি অংশ গঠন করে। PTransform AnalyzeDataset এবং TransformDataset সহ বিভিন্ন PTransform TransformDataset গুলি প্রয়োগ করে এবং পাইপলাইনটি চালিয়ে একটি বিম পাইপলাইন তৈরি করা হয়। প্রধান PCollection একটি PCollection হয় না, তবে তার পরিবর্তে কর্মীদের মধ্যে বিতরণ করা হয় (যদিও এই বিভাগটি মেমোরি এক্সিকিউশন মোড ব্যবহার করে)।

প্রাক-ক্যানড PCollection উত্স ( TFXIO )

আমাদের বাস্তবায়ন গ্রহণ করে RecordBatch ফর্ম্যাটটি একটি সাধারণ ফর্ম্যাট যা অন্যান্য টিএফএক্স লাইব্রেরি গ্রহণ করে। অতএব টিএফএক্স সুবিধাজনক "উত্স" (ওরফে TFXIO ) প্রস্তাব করে যা ডিস্কে বিভিন্ন ফর্ম্যাটের ফাইল পড়ে এবং RecordBatch এস উত্পাদন করে এবং RecordBatch TensorAdapterConfig সহ TensorAdapterConfig দিতে TensorRepresentations

এই TFXIO প্যাকেজ tfx_bsl ( tfx_bsl.public.tfxio ) পাওয়া যাবে।

উদাহরণ: "আদমশুমারি আয়" ডেটাসেট

নিম্নলিখিত উদাহরণটির জন্য ডিস্কে ডেটা পড়া এবং লেখার জন্য এবং PCollection হিসাবে (ডেটা নয়) উপাত্ত উপস্থাপন করা উভয়ই প্রয়োজন, দেখুন: census_example.py । নীচে আমরা কীভাবে ডেটা ডাউনলোড করব এবং এই উদাহরণটি চালাব তা দেখিয়েছি। "সেন্সাস ইনকাম" ডেটাসেটটি ইউসিআই মেশিন লার্নিং রিপোজিটরি সরবরাহ করেছে । এই ডেটাসেটে উভয় শ্রেণিবদ্ধ এবং সংখ্যাসূচক তথ্য রয়েছে।

ডেটা সিএসভি ফর্ম্যাটে রয়েছে, এখানে প্রথম দুটি লাইন রয়েছে:

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K

ডেটাসেটের কলামগুলি শ্রেণিবদ্ধ বা সংখ্যাসূচক। এই ডেটাসেটটি একটি শ্রেণিবদ্ধকরণের সমস্যা বর্ণনা করে: সর্বশেষ কলামটির পূর্বাভাস যেখানে ব্যক্তি প্রতি বছর কমপক্ষে 50K এর চেয়ে বেশি আয় করে। যাইহোক, tf.Transform দৃষ্টিকোণ থেকে, এই লেবেলটি অন্য একটি শ্রেণীবদ্ধ কলাম।

আমরা TFXIO সিএসভি লাইনগুলিকে অনুবাদ করতে একটি প্রি-ক্যানড TFXIO , BeamRecordCsvTFXIO ব্যবহার RecordBatchesTFXIO জন্য দুটি গুরুত্বপূর্ণ টুকরো তথ্য দরকার:

  • একটি টেনসরফ্লো মেটাডেটা স্কিমাতে প্রতিটি সিএসভি কলাম সম্পর্কে টাইপ এবং আকারের তথ্য রয়েছে। TensorRepresentation একটি TensorRepresentation অংশ; যদি সরবরাহ না করা হয় (যা এই উদাহরণের ক্ষেত্রে হয়), তবে তাদের ধরণ এবং আকারের তথ্য থেকে অনুমান করা হবে। আমরা টিএফ পার্সিং স্পেকস (এই উদাহরণে দেখানো হয়েছে) থেকে অনুবাদ করার জন্য সরবরাহকারী কোনও সহায়তামূলক ফাংশন ব্যবহার করে বা টেনসরফ্লো ডেটা বৈধকরণ চালিয়ে স্কিমা পেতে পারি।

  • কলামের নামের একটি তালিকা, যাতে তারা সিএসভি ফাইলে প্রদর্শিত হয়। নোট করুন যে সেই নামগুলি অবশ্যই স্কিমাতে থাকা বৈশিষ্ট্যের সাথে মেলে।

এই উদাহরণে আমরা education-num বৈশিষ্ট্যটি অনুপস্থিত রাখার অনুমতি দিই। এর অর্থ এটি tf.io.VarLenFeature মধ্যে tf.io.VarLenFeature হিসাবে এবং preprocessing_fn একটি tf.SparseTensor হিসাবে tf.SparseTensor হয়। অন্যান্য বৈশিষ্ট্যগুলি preprocessing_fn একই নামের tf.Tensor গুলি হয়ে tf.Tensor

csv_tfxio = tfxio.BeamRecordCsvTFXIO(
    physical_format='text', column_names=ordered_columns, schema=SCHEMA)

record_batches = (
    p
    | 'ReadTrainData' >> textio.ReadFromText(train_data_file)
    | ...  # fix up csv lines
    | 'ToRecordBatches' >> csv_tfxio.BeamSource())

tensor_adapter_config = csv_tfxio.TensorAdapterConfig()

নোট করুন যে সিএসভি লাইনগুলি পড়ার পরে আমাদের কিছু অতিরিক্ত ফিক্স-আপ করতে হয়েছিল CsvTFXIO নইলে আমরা ফাইলগুলি পড়া এবং RecordBatch এস অনুবাদ করতে উভয়ই পরিচালনা করতে CsvTFXIO উপর নির্ভর করতে RecordBatch :

csv_tfxio = tfxio.CsvTFXIO(train_data_file, column_name=ordered_columns,
                           schema=SCHEMA)
record_batches = p | 'TFXIORead' >> csv_tfxio.BeamSource()
tensor_adapter_config = csv_tfxio.TensorAdapterConfig()

প্রিপ্রোসেসিং পূর্ববর্তী উদাহরণের সাথে সমান, প্রিপ্রসেসিং ফাংশনটি ব্যতীত প্রতিটি কলামকে ম্যানুয়ালি উল্লেখ করার পরিবর্তে প্রোগ্রামগতভাবে উত্পন্ন হয়। নীচের প্রাক-প্রসেসিং ফাংশনে, NUMERICAL_COLUMNS এবং CATEGORICAL_COLUMNS হল এমন তালিকা যা NUMERICAL_COLUMNS এবং CATEGORICAL_COLUMNS কলামগুলির নাম ধারণ করে:

def preprocessing_fn(inputs):
  """Preprocess input columns into transformed columns."""
  # Since we are modifying some features and leaving others unchanged, we
  # start by setting `outputs` to a copy of `inputs.
  outputs = inputs.copy()

  # Scale numeric columns to have range [0, 1].
  for key in NUMERIC_FEATURE_KEYS:
    outputs[key] = tft.scale_to_0_1(outputs[key])

  for key in OPTIONAL_NUMERIC_FEATURE_KEYS:
    # This is a SparseTensor because it is optional. Here we fill in a default
    # value when it is missing.
      sparse = tf.sparse.SparseTensor(outputs[key].indices, outputs[key].values,
                                      [outputs[key].dense_shape[0], 1])
      dense = tf.sparse.to_dense(sp_input=sparse, default_value=0.)
    # Reshaping from a batch of vectors of size 1 to a batch to scalars.
    dense = tf.squeeze(dense, axis=1)
    outputs[key] = tft.scale_to_0_1(dense)

  # For all categorical columns except the label column, we generate a
  # vocabulary but do not modify the feature.  This vocabulary is instead
  # used in the trainer, by means of a feature column, to convert the feature
  # from a string to an integer id.
  for key in CATEGORICAL_FEATURE_KEYS:
    tft.vocabulary(inputs[key], vocab_filename=key)

  # For the label column we provide the mapping from string to index.
  initializer = tf.lookup.KeyValueTensorInitializer(
      keys=['>50K', '<=50K'],
      values=tf.cast(tf.range(2), tf.int64),
      key_dtype=tf.string,
      value_dtype=tf.int64)
  table = tf.lookup.StaticHashTable(initializer, default_value=-1)

  outputs[LABEL_KEY] = table.lookup(outputs[LABEL_KEY])

  return outputs

পূর্ববর্তী উদাহরণের মধ্যে একটি পার্থক্য হ'ল লেবেল কলাম ম্যানুয়ালি স্ট্রিং থেকে সূচীতে ম্যাপিং নির্দিষ্ট করে। সুতরাং '>50' কে 0 ম্যাপ করা হয়েছে এবং '<=50K' কে 1 ম্যাপ করা হয়েছে কারণ প্রশিক্ষণ প্রাপ্ত মডেলের কোন সূচকটি কোন লেবেলের সাথে সামঞ্জস্য করে তা জানা দরকারী।

record_batches পরিবর্তনশীল একটি প্রতিনিধিত্ব করে PCollection এর pyarrow.RecordBatch স্প্যানিশ ভাষায়। tensor_adapter_config দেওয়া হয় csv_tfxio , যা থেকে অনুমিত হয় SCHEMA (এবং শেষ পর্যন্ত, এই উদাহরণে, মেমরি পার্সিং চশমা থেকে)।

চূড়ান্ত পর্যায়ে হ'ল রূপান্তরিত ডেটাটি ডিস্কে লিখতে হয় এবং কাঁচা ডেটা পড়ার অনুরূপ রূপ থাকে। এটি করার জন্য ব্যবহৃত স্কিমাটি AnalyzeAndTransformDataset এবং AnalyzeAndTransformDataset আউটপুট অংশ যা আউটপুট ডেটার জন্য একটি স্কিমা অনুভব করে। ডিস্কে লেখার কোডটি নীচে দেখানো হয়েছে। স্কিমাটি মেটাডেটার একটি অংশ তবে tf.Transform API এ (অর্থাত্ ExampleProtoCoder মেটাডেটাটি প্রেরণ করুন) দুটি বিনিময়যোগ্যভাবে ব্যবহার করে। সচেতন থাকুন যে এটি অন্য কোনও ফর্ম্যাটে লিখেছে। textio.WriteToText পরিবর্তে, textio.WriteToText বিন্যাসের জন্য TFRecord অন্তর্নির্মিত TFRecord ব্যবহার করুন এবং ডেটা Example প্রোটোস হিসাবে এনকোড করতে একটি কোডার ব্যবহার করুন। প্রশিক্ষণের জন্য এটি ব্যবহার করার জন্য এটি আরও ভাল ফর্ম্যাট, যেমন পরের অংশে দেখানো হয়েছে। transformed_eval_data_base পৃথক shards যে লেখা হয় জন্য বেস ফাইলের নাম প্রদান করে।

transformed_data | "WriteTrainData" >> tfrecordio.WriteToTFRecord(
    transformed_eval_data_base,
    coder=tft.coders.ExampleProtoCoder(transformed_metadata))

প্রশিক্ষণের ডেটা ছাড়াও, transform_fn মেটাডেটা দিয়েও লেখা হয়:

_ = (
    transform_fn
    | 'WriteTransformFn' >> tft_beam.WriteTransformFn(working_dir))
transformed_metadata | 'WriteMetadata' >> tft_beam.WriteMetadata(
    transformed_metadata_file, pipeline=p)

p.run().wait_until_finish() দিয়ে পুরো বিম পাইপলাইন চালান। এই বিন্দু অবধি, মরীচি পাইপলাইন একটি স্থগিত, বিতরণ গণনার প্রতিনিধিত্ব করে। এটি কী করা হবে তার নির্দেশাবলী সরবরাহ করে তবে নির্দেশাবলী কার্যকর করা হয়নি। এই চূড়ান্ত কলটি নির্দিষ্ট পাইপলাইন কার্যকর করে।

শুমারির ডেটাसेट ডাউনলোড করুন

নিম্নলিখিত শেল কমান্ড ব্যবহার করে আদমসুমার ডাটাসেটটি ডাউনলোড করুন:

  wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
  wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test

census_example.py স্ক্রিপ্টটি চালানোর সময়, প্রথম যুক্তি হিসাবে এই census_example.py ডিরেক্টরিটি পাস করুন। স্ক্রিপ্ট প্রাক-প্রসেসড ডেটা যুক্ত করতে একটি অস্থায়ী উপ-ডিরেক্টরি তৈরি করে।

টেনসরফ্লো প্রশিক্ষণের সাথে সংহত করুন

census_example.py চূড়ান্ত বিভাগটি দেখায় যে কোনও মডেলকে প্রশিক্ষণের জন্য কীভাবে প্রাক census_example.py ডেটা ব্যবহার করা হয়। বিশদ জন্য Estimators ডকুমেন্টেশন দেখুন। প্রথম পদক্ষেপটি একটি Estimator যার প্রিপ্রোসেসড কলামগুলির বিবরণ প্রয়োজন। প্রতিটি সংখ্যাসূচক কলামটি একটি real_valued_column হিসাবে বর্ণনা করা হয় যা একটি স্থির আকারের ঘন ভেক্টরের চারপাশে একটি মোড়ক (এই উদাহরণের মধ্যে 1 )। প্রতিটি শ্রেণিবদ্ধ কলাম স্ট্রিং থেকে পূর্ণসংখ্যায় ম্যাপ করা হয় এবং তারপরে indicator_column কলামে পাস হয়। tft.TFTransformOutput প্রতিটি শ্রেণিবদ্ধ বৈশিষ্ট্যের জন্য tft.TFTransformOutput ফাইল পাথ সন্ধান করতে ব্যবহৃত হয়।

real_valued_columns = [feature_column.real_valued_column(key)
                       for key in NUMERIC_FEATURE_KEYS]

one_hot_columns = [
    tf.feature_column.indicator_column(
        tf.feature_column.categorical_column_with_vocabulary_file(
            key=key,
            vocabulary_file=tf_transform_output.vocabulary_file_by_name(
                vocab_filename=key)))
    for key in CATEGORICAL_FEATURE_KEYS]

estimator = tf.estimator.LinearClassifier(real_valued_columns + one_hot_columns)

পরবর্তী পদক্ষেপটি প্রশিক্ষণ এবং মূল্যায়নের জন্য ইনপুট ফাংশন উত্পন্ন করতে একটি বিল্ডার তৈরি করা। tf.Learn দ্বারা ব্যবহৃত প্রশিক্ষণ থেকে পৃথক হয় যেহেতু রূপান্তরিত ডেটা পার্স করার জন্য কোনও বৈশিষ্ট্য বৈশিষ্টের প্রয়োজন হয় না tf.Learn পরিবর্তে, কোনও বৈশিষ্ট্য বৈশিষ্ট তৈরি করতে রূপান্তরিত ডেটার জন্য মেটাডেটা ব্যবহার করুন।

def _make_training_input_fn(tf_transform_output, transformed_examples,
                            batch_size):
  ...
  def input_fn():
    """Input function for training and eval."""
    dataset = tf.data.experimental.make_batched_features_dataset(
        ..., tf_transform_output.transformed_feature_spec(), ...)

    transformed_features = tf.compat.v1.data.make_one_shot_iterator(
        dataset).get_next()
    ...

  return input_fn

অবশিষ্ট কোডটি Estimator শ্রেণীর ব্যবহারের মতো। উদাহরণটিতে SavedModel ফর্ম্যাটে মডেলটি রফতানি করার SavedModel । রফতানি হওয়া মডেলটি টেনসরফ্লো সার্ভিং বা ক্লাউড এমএল ইঞ্জিন ব্যবহার করতে পারে।