কাস্টম ডেটাসেট লেখা

একটি নতুন ডেটাসেট তৈরি করতে (TFDS-এ অথবা আপনার নিজস্ব রিপোজিটরিতে) এই নির্দেশিকাটি অনুসরণ করুন।

আপনার কাঙ্ক্ষিত ডেটাসেটটি আমাদের ডেটাসেটের তালিকায় আগে থেকেই আছে কিনা তা দেখে নিন।

সংক্ষেপে

নতুন ডেটাসেট লেখার সবচেয়ে সহজ উপায় হলো TFDS CLI ব্যবহার করা:

cd path/to/my/project/datasets/
tfds new my_dataset  # Create `my_dataset/my_dataset.py` template files
# [...] Manually modify `my_dataset/my_dataset_dataset_builder.py` to implement your dataset.
cd my_dataset/
tfds build  # Download and prepare the dataset to `~/tensorflow_datasets/`

tfds.load('my_dataset') এর সাথে নতুন ডেটাসেটটি ব্যবহার করতে:

  • tfds.load স্বয়ংক্রিয়ভাবে ~/tensorflow_datasets/my_dataset/ ফোল্ডারে তৈরি ডেটাসেটটি (যেমন tfds build দ্বারা) সনাক্ত করে লোড করবে।
  • বিকল্পভাবে, আপনার ডেটাসেট নিবন্ধন করতে আপনি import my.project.datasets.my_dataset করতে পারেন:
import my.project.datasets.my_dataset  # Register `my_dataset`

ds = tfds.load('my_dataset')  # `my_dataset` registered

সংক্ষিপ্ত বিবরণ

ডেটা সেটগুলো নানা ধরনের ফরম্যাটে এবং নানা জায়গায় ছড়িয়ে ছিটিয়ে থাকে, এবং সেগুলো সবসময় এমন ফরম্যাটে সংরক্ষিত থাকে না যা সরাসরি মেশিন লার্নিং পাইপলাইনে ব্যবহারের জন্য প্রস্তুত থাকে। আর এখানেই আসে TFDS-এর ভূমিকা।

TFDS সেই ডেটাসেটগুলোকে একটি স্ট্যান্ডার্ড ফরম্যাটে (এক্সটার্নাল ডেটা -> সিরিয়ালাইজড ফাইল) প্রসেস করে, যা পরবর্তীতে মেশিন লার্নিং পাইপলাইন হিসেবে লোড করা যায় (সিরিয়ালাইজড ফাইল -> tf.data.Dataset )। এই সিরিয়ালাইজেশন শুধুমাত্র একবারই করা হয়। পরবর্তী অ্যাক্সেসের ক্ষেত্রে ডেটা সরাসরি সেই প্রি-প্রসেসড ফাইলগুলো থেকেই পড়া হবে।

বেশিরভাগ প্রাক-প্রক্রিয়াকরণ স্বয়ংক্রিয়ভাবে সম্পন্ন হয়। প্রতিটি ডেটাসেট tfds.core.DatasetBuilder এর একটি সাবক্লাস প্রয়োগ করে, যা নির্দিষ্ট করে:

  • ডেটা কোথা থেকে আসছে (অর্থাৎ এর ইউআরএলগুলো);
  • ডেটাসেটটি দেখতে কেমন (অর্থাৎ এর বৈশিষ্ট্যগুলো);
  • ডেটা কীভাবে ভাগ করা উচিত (যেমন TRAIN এবং TEST );
  • এবং ডেটাসেটের স্বতন্ত্র উদাহরণগুলো।

আপনার ডেটাসেট লিখুন

ডিফল্ট টেমপ্লেট: tfds new

প্রয়োজনীয় টেমপ্লেট পাইথন ফাইলগুলো তৈরি করতে TFDS CLI ব্যবহার করুন।

cd path/to/project/datasets/  # Or use `--dir=path/to/project/datasets/` below
tfds new my_dataset

এই কমান্ডটি নিম্নলিখিত কাঠামো সহ একটি নতুন my_dataset/ ফোল্ডার তৈরি করবে:

my_dataset/
    __init__.py
    README.md # Markdown description of the dataset.
    CITATIONS.bib # Bibtex citation for the dataset.
    TAGS.txt # List of tags describing the dataset.
    my_dataset_dataset_builder.py # Dataset definition
    my_dataset_dataset_builder_test.py # Test
    dummy_data/ # (optional) Fake data (used for testing)
    checksum.tsv # (optional) URL checksums (see `checksums` section).

এখানে TODO(my_dataset) খুঁজুন এবং সেই অনুযায়ী পরিবর্তন করুন।

ডেটাসেট উদাহরণ

সমস্ত ডেটাসেট tfds.core.DatasetBuilder এর বাস্তবায়িত সাবক্লাস, যা বেশিরভাগ বয়লারপ্লেট কোডের দায়িত্ব নেয়। এটি সমর্থন করে:

  • ছোট/মাঝারি ডেটাসেট যা একটিমাত্র মেশিনে তৈরি করা যায় (এই টিউটোরিয়াল)।
  • অত্যন্ত বৃহৎ ডেটাসেট, যেগুলোর জন্য ডিস্ট্রিবিউটেড জেনারেশন প্রয়োজন ( অ্যাপাচি বিম ব্যবহার করে, আমাদের বিশাল ডেটাসেট গাইড দেখুন)।

এখানে tfds.core.GeneratorBasedBuilder এর উপর ভিত্তি করে তৈরি একটি ডেটাসেট বিল্ডারের সংক্ষিপ্ত উদাহরণ দেওয়া হলো:

class Builder(tfds.core.GeneratorBasedBuilder):
  """DatasetBuilder for my_dataset dataset."""

  VERSION = tfds.core.Version('1.0.0')
  RELEASE_NOTES = {
      '1.0.0': 'Initial release.',
  }

  def _info(self) -> tfds.core.DatasetInfo:
    """Dataset metadata (homepage, citation,...)."""
    return self.dataset_info_from_configs(
        features=tfds.features.FeaturesDict({
            'image': tfds.features.Image(shape=(256, 256, 3)),
            'label': tfds.features.ClassLabel(
                names=['no', 'yes'],
                doc='Whether this is a picture of a cat'),
        }),
    )

  def _split_generators(self, dl_manager: tfds.download.DownloadManager):
    """Download the data and define splits."""
    extracted_path = dl_manager.download_and_extract('http://data.org/data.zip')
    # dl_manager returns pathlib-like objects with `path.read_text()`,
    # `path.iterdir()`,...
    return {
        'train': self._generate_examples(path=extracted_path / 'train_images'),
        'test': self._generate_examples(path=extracted_path / 'test_images'),
    }

  def _generate_examples(self, path) -> Iterator[Tuple[Key, Example]]:
    """Generator of examples for each split."""
    for img_path in path.glob('*.jpeg'):
      # Yields (key, example)
      yield img_path.name, {
          'image': img_path,
          'label': 'yes' if img_path.name.startswith('yes_') else 'no',
      }

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

চলুন ওভাররাইট করার জন্য ৩টি অ্যাবস্ট্রাক্ট মেথড বিস্তারিতভাবে দেখে নেওয়া যাক।

_info : ডেটাসেট মেটাডেটা

_info ফাংশনটি tfds.core.DatasetInfo রিটার্ন করে, যাতে ডেটাসেটের মেটাডেটা থাকে।

def _info(self):
  # The `dataset_info_from_configs` base method will construct the
  # `tfds.core.DatasetInfo` object using the passed-in parameters and
  # adding: builder (self), description/citations/tags from the config
  # files located in the same package.
  return self.dataset_info_from_configs(
      homepage='https://dataset-homepage.org',
      features=tfds.features.FeaturesDict({
          'image_description': tfds.features.Text(),
          'image': tfds.features.Image(),
          # Here, 'label' can be 0-4.
          'label': tfds.features.ClassLabel(num_classes=5),
      }),
      # If there's a common `(input, target)` tuple from the features,
      # specify them here. They'll be used if as_supervised=True in
      # builder.as_dataset.
      supervised_keys=('image', 'label'),
      # Specify whether to disable shuffling on the examples. Set to False by default.
      disable_shuffling=False,
  )

বেশিরভাগ ক্ষেত্রই স্ব-ব্যাখ্যামূলক হওয়া উচিত। কিছু সূক্ষ্ম বিষয়:

BibText CITATIONS.bib ফাইলটি লেখা:

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

TAGS.txt ফাইলটি আপডেট করা হচ্ছে:

  • তৈরি হওয়া ফাইলটিতে সমস্ত অনুমোদিত ট্যাগ আগে থেকেই পূরণ করা থাকে।
  • ডেটা সেটের জন্য অপ্রযোজ্য সমস্ত ট্যাগ মুছে ফেলুন।
  • বৈধ ট্যাগগুলো tensorflow_datasets/core/valid_tags.txt ফাইলে তালিকাভুক্ত করা আছে।
  • ওই তালিকায় একটি ট্যাগ যোগ করতে, অনুগ্রহ করে একটি PR পাঠান।

ডেটাসেটের ক্রম বজায় রাখুন

ডিফল্টরূপে, ডেটাসেট সংরক্ষণের সময় রেকর্ডগুলো এলোমেলোভাবে সাজানো হয়, যাতে ডেটাসেট জুড়ে ক্লাসগুলোর বন্টন আরও সুষম হয়, কারণ প্রায়শই একই ক্লাসের রেকর্ডগুলো সংলগ্ন থাকে। _generate_examples দ্বারা তৈরি করা কী (key) অনুসারে ডেটাসেটটি সাজানো হবে তা নির্দিষ্ট করার জন্য, disable_shuffling ফিল্ডটি True তে সেট করতে হবে। ডিফল্টরূপে এটি False এ সেট করা থাকে।

def _info(self):
  return self.dataset_info_from_configs(
    # [...]
    disable_shuffling=True,
    # [...]
  )

মনে রাখবেন যে শাফলিং নিষ্ক্রিয় করলে পারফরম্যান্সে প্রভাব পড়ে, কারণ তখন শার্ডগুলো আর সমান্তরালভাবে পড়া যায় না।

_split_generators : ডেটা ডাউনলোড করে এবং বিভক্ত করে

উৎস ডেটা ডাউনলোড এবং নিষ্কাশন করা

বেশিরভাগ ডেটাসেটের জন্য ওয়েব থেকে ডেটা ডাউনলোড করার প্রয়োজন হয়। এটি _split_generators এর tfds.download.DownloadManager ইনপুট আর্গুমেন্ট ব্যবহার করে করা হয়। dl_manager নিম্নলিখিত মেথডগুলো রয়েছে:

  • download : http(s):// , ftp(s):// সমর্থন করে
  • extract : বর্তমানে .zip , .gz , এবং .tar ফাইল সমর্থন করে।
  • download_and_extract : dl_manager.extract(dl_manager.download(urls)) এর সমান

এই সমস্ত মেথড tfds.core.Path ( epath.Path এর বিকল্প নাম) রিটার্ন করে, যা pathlib.Path-এর মতো অবজেক্ট।

এই পদ্ধতিগুলো যেকোনো ধরনের নেস্টেড স্ট্রাকচার (যেমন list , dict ) সমর্থন করে, যেমন:

extracted_paths = dl_manager.download_and_extract({
    'foo': 'https://example.com/foo.zip',
    'bar': 'https://example.com/bar.zip',
})
# This returns:
assert extracted_paths == {
    'foo': Path('/path/to/extracted_foo/'),
    'bar': Path('/path/extracted_bar/'),
}

ম্যানুয়াল ডাউনলোড এবং নিষ্কাশন

কিছু ডেটা স্বয়ংক্রিয়ভাবে ডাউনলোড করা যায় না (যেমন লগইন প্রয়োজন), এই ক্ষেত্রে, ব্যবহারকারীকে ম্যানুয়ালি সোর্স ডেটা ডাউনলোড করে manual_dir/ এ রাখতে হবে (ডিফল্ট হলো ~/tensorflow_datasets/downloads/manual/ )।

এরপর dl_manager.manual_dir এর মাধ্যমে ফাইলগুলো অ্যাক্সেস করা যাবে।

class MyDataset(tfds.core.GeneratorBasedBuilder):

  MANUAL_DOWNLOAD_INSTRUCTIONS = """
  Register into https://example.org/login to get the data. Place the `data.zip`
  file in the `manual_dir/`.
  """

  def _split_generators(self, dl_manager):
    # data_path is a pathlib-like `Path('<manual_dir>/data.zip')`
    archive_path = dl_manager.manual_dir / 'data.zip'
    # Extract the manually downloaded `data.zip`
    extracted_path = dl_manager.extract(archive_path)
    ...

tfds build --manual_dir= অথবা tfds.download.DownloadConfig ব্যবহার করে manual_dir অবস্থান কাস্টমাইজ করা যায়।

সরাসরি আর্কাইভ পড়ুন

dl_manager.iter_archive আর্কাইভগুলোকে এক্সট্র্যাক্ট না করে ক্রমানুসারে পড়ে। এর ফলে কিছু ফাইল সিস্টেমে স্টোরেজ স্পেস সাশ্রয় হয় এবং পারফরম্যান্স উন্নত হয়।

for filename, fobj in dl_manager.iter_archive('path/to/archive.zip'):
  ...

fobj with open('rb') as fobj: (যেমন fobj.read() )

ডেটাসেট বিভাজন নির্দিষ্ট করা

যদি ডেটাসেটে আগে থেকে নির্ধারিত স্প্লিট থাকে (যেমন MNIST train এবং test স্প্লিট আছে), তবে সেগুলিই রাখুন। অন্যথায়, শুধুমাত্র একটি all স্প্লিট নির্দিষ্ট করুন। ব্যবহারকারীরা সাবস্প্লিট এপিআই (subsplit API) ব্যবহার করে ডায়নামিকভাবে তাদের নিজস্ব সাবস্প্লিট তৈরি করতে পারেন (যেমন split='train[80%:]' )। মনে রাখবেন যে, উপরে উল্লিখিত all ছাড়া যেকোনো বর্ণানুক্রমিক স্ট্রিং স্প্লিটের নাম হিসেবে ব্যবহার করা যেতে পারে।

def _split_generators(self, dl_manager):
  # Download source data
  extracted_path = dl_manager.download_and_extract(...)

  # Specify the splits
  return {
      'train': self._generate_examples(
          images_path=extracted_path / 'train_imgs',
          label_path=extracted_path / 'train_labels.csv',
      ),
      'test': self._generate_examples(
          images_path=extracted_path / 'test_imgs',
          label_path=extracted_path / 'test_labels.csv',
      ),
  }

_generate_examples : উদাহরণ জেনারেটর

_generate_examples উৎস ডেটা থেকে প্রতিটি স্প্লিটের জন্য উদাহরণ তৈরি করে।

এই পদ্ধতিটি সাধারণত উৎস ডেটাসেটের উপাদানসমূহ (যেমন একটি CSV ফাইল) পড়ে এবং (key, feature_dict) টাপল প্রদান করে:

  • key : উদাহরণ শনাক্তকারী। hash(key) ব্যবহার করে উদাহরণগুলিকে সুনির্দিষ্টভাবে এলোমেলো করতে অথবা যখন এলোমেলো করা নিষ্ক্রিয় থাকে তখন key অনুসারে সাজাতে এটি ব্যবহৃত হয় (দেখুন Maintain dataset order বিভাগটি)। হওয়া উচিত:
    • অনন্য : যদি দুটি উদাহরণ একই কী ব্যবহার করে, তাহলে একটি ব্যতিক্রম উত্থাপিত হবে।
    • সুনির্দিষ্ট : download_dir , os.path.listdir ইত্যাদির ক্রমের উপর নির্ভর করা উচিত নয়। দুইবার ডেটা তৈরি করলে একই কী পাওয়া উচিত।
    • তুলনীয় : যদি শাফলিং নিষ্ক্রিয় করা থাকে, তাহলে ডেটাসেটটি সাজানোর জন্য কী (key) ব্যবহার করা হবে।
  • feature_dict : একটি dict যাতে উদাহরণ মানগুলো রয়েছে।
    • কাঠামোটি tfds.core.DatasetInfo তে সংজ্ঞায়িত features= কাঠামোর সাথে মিলতে হবে।
    • জটিল ডেটা টাইপগুলো (ছবি, ভিডিও, অডিও,...) স্বয়ংক্রিয়ভাবে এনকোড করা হবে।
    • প্রতিটি ফিচার প্রায়শই একাধিক ইনপুট টাইপ গ্রহণ করে (যেমন ভিডিওর জন্য /path/to/vid.mp4 , np.array(shape=(l, h, w, c)) , List[paths] , List[np.array(shape=(h, w, c)] , List[img_bytes] ,...)
    • আরও তথ্যের জন্য ফিচার কানেক্টর গাইডটি দেখুন।
def _generate_examples(self, images_path, label_path):
  # Read the input data out of the source files
  with label_path.open() as f:
    for row in csv.DictReader(f):
      image_id = row['image_id']
      # And yield (key, feature_dict)
      yield image_id, {
          'image_description': row['description'],
          'image': images_path / f'{image_id}.jpeg',
          'label': row['label'],
      }

ফাইল অ্যাক্সেস এবং tf.io.gfile

ক্লাউড স্টোরেজ সিস্টেম সমর্থন করার জন্য, পাইথনের বিল্ট-ইন I/O অপস ব্যবহার করা পরিহার করুন।

এর পরিবর্তে, dl_manager সরাসরি গুগল ক্লাউড স্টোরেজের সাথে সামঞ্জস্যপূর্ণ pathlib-সদৃশ অবজেক্ট রিটার্ন করে:

path = dl_manager.download_and_extract('http://some-website/my_data.zip')

json_path = path / 'data/file.json'

json.loads(json_path.read_text())

বিকল্পভাবে, ফাইল অপারেশনের জন্য বিল্ট-ইন এপিআই-এর পরিবর্তে tf.io.gfile এপিআই ব্যবহার করুন:

tf.io.gfile এর পরিবর্তে Pathlib ব্যবহার করা উচিত ( যুক্তি দেখুন)।

অতিরিক্ত নির্ভরতা

কিছু ডেটাসেট তৈরির সময় শুধু অতিরিক্ত পাইথন নির্ভরতার প্রয়োজন হয়। উদাহরণস্বরূপ, SVHN ডেটাসেট কিছু ডেটা লোড করার জন্য scipy ব্যবহার করে।

আপনি যদি TFDS রিপোজিটরিতে ডেটাসেট যোগ করেন, তাহলে tensorflow-datasets প্যাকেজটির আকার ছোট রাখতে অনুগ্রহ করে tfds.core.lazy_imports ব্যবহার করুন। ব্যবহারকারীরা শুধুমাত্র প্রয়োজন অনুযায়ী অতিরিক্ত ডিপেন্ডেন্সি ইনস্টল করবেন।

lazy_imports ব্যবহার করতে:

  • setup.py DATASET_EXTRAS অংশে আপনার ডেটাসেটের জন্য একটি এন্ট্রি যোগ করুন। এর ফলে ব্যবহারকারীরা, উদাহরণস্বরূপ, pip install 'tensorflow-datasets[svhn]' করে অতিরিক্ত ডিপেন্ডেন্সিগুলো ইনস্টল করতে পারবেন।
  • আপনার ইম্পোর্টের জন্য LazyImporter এবং LazyImportsTest এ একটি এন্ট্রি যোগ করুন।
  • আপনার DatasetBuilder এ ডিপেন্ডেন্সি (উদাহরণস্বরূপ, tfds.core.lazy_imports.scipy ) অ্যাক্সেস করতে tfds.core.lazy_imports ব্যবহার করুন।

দূষিত ডেটা

কিছু ডেটাসেট পুরোপুরি ত্রুটিমুক্ত নয় এবং এতে কিছু ত্রুটিপূর্ণ ডেটা থাকে (উদাহরণস্বরূপ, ছবিগুলো JPEG ফাইলে থাকলেও সেগুলোর মধ্যে কয়েকটি অবৈধ JPEG ফাইল)। এই উদাহরণগুলো বাদ দেওয়া উচিত, তবে ডেটাসেটের বিবরণে উল্লেখ করে দিন যে কতগুলো উদাহরণ বাদ দেওয়া হয়েছে এবং কেন।

ডেটা সেট কনফিগারেশন/ভেরিয়েন্ট (tfds.core.BuilderConfig)

কিছু ডেটাসেটের একাধিক ভ্যারিয়েন্ট থাকতে পারে, অথবা ডেটা কীভাবে প্রিপ্রসেস করা হবে এবং ডিস্কে লেখা হবে তার জন্য বিভিন্ন অপশন থাকতে পারে। উদাহরণস্বরূপ, cycle_gan-এর প্রতিটি অবজেক্ট পেয়ারের ( cycle_gan/horse2zebra , cycle_gan/monet2photo ,...) জন্য একটি করে কনফিগারেশন রয়েছে।

এটি tfds.core.BuilderConfig এর মাধ্যমে করা হয়:

  1. আপনার কনফিগারেশন অবজেক্টটিকে tfds.core.BuilderConfig এর একটি সাবক্লাস হিসেবে সংজ্ঞায়িত করুন। উদাহরণস্বরূপ, MyDatasetConfig

    @dataclasses.dataclass
    class MyDatasetConfig(tfds.core.BuilderConfig):
      img_size: Tuple[int, int] = (0, 0)
    
  2. MyDatasetBUILDER_CONFIGS = [] ক্লাস মেম্বারটি সংজ্ঞায়িত করুন যা ডেটাসেট দ্বারা প্রকাশিত MyDatasetConfig গুলির তালিকা করে।

    class MyDataset(tfds.core.GeneratorBasedBuilder):
      VERSION = tfds.core.Version('1.0.0')
      # pytype: disable=wrong-keyword-args
      BUILDER_CONFIGS = [
          # `name` (and optionally `description`) are required for each config
          MyDatasetConfig(name='small', description='Small ...', img_size=(8, 8)),
          MyDatasetConfig(name='big', description='Big ...', img_size=(32, 32)),
      ]
      # pytype: enable=wrong-keyword-args
    
  3. ডেটা জেনারেশন কনফিগার করতে MyDatasetself.builder_config ব্যবহার করুন (যেমন shape=self.builder_config.img_size )। এর মধ্যে _info() তে বিভিন্ন মান সেট করা বা ডেটা ডাউনলোডের অ্যাক্সেস পরিবর্তন করা অন্তর্ভুক্ত থাকতে পারে।

নোট:

  • প্রতিটি কনফিগের একটি অনন্য নাম থাকে। একটি কনফিগের সম্পূর্ণ নাম হলো dataset_name/config_name (যেমন coco/2017 )।
  • নির্দিষ্ট করে না দেওয়া হলে, BUILDER_CONFIGS এর প্রথম কনফিগারেশনটি ব্যবহৃত হবে (যেমন tfds.load('c4') এর ক্ষেত্রে ডিফল্ট হিসেবে c4/en ব্যবহৃত হয়)।

BuilderConfig ব্যবহার করে এমন একটি ডেটাসেটের উদাহরণের জন্য anli দেখুন।

সংস্করণ

ভার্সন দুটি ভিন্ন অর্থ নির্দেশ করতে পারে:

  • "বাহ্যিক" মূল ডেটা সংস্করণ: যেমন COCO v2019, v2017,...
  • TFDS কোডের "অভ্যন্তরীণ" সংস্করণ: যেমন, tfds.features.FeaturesDict এ কোনো ফিচারের নাম পরিবর্তন করা, _generate_examples এর একটি বাগ সংশোধন করা।

একটি ডেটাসেট আপডেট করতে:

  • "বাহ্যিক" ডেটা আপডেটের জন্য: একাধিক ব্যবহারকারী একই সাথে একটি নির্দিষ্ট বছর/সংস্করণ অ্যাক্সেস করতে চাইতে পারেন। এটি করার জন্য প্রতিটি সংস্করণের জন্য একটি করে tfds.core.BuilderConfig (যেমন coco/2017 , coco/2019 ) অথবা প্রতিটি সংস্করণের জন্য একটি করে ক্লাস (যেমন Voc2007 , Voc2012 ) ব্যবহার করা হয়।
  • "অভ্যন্তরীণ" কোড আপডেটের ক্ষেত্রে: ব্যবহারকারীরা শুধুমাত্র সর্বশেষ সংস্করণটি ডাউনলোড করবেন। যেকোনো কোড আপডেটে সিমান্টিক ভার্সনিং অনুসরণ করে VERSION ক্লাস অ্যাট্রিবিউটের মান বৃদ্ধি করতে হবে (যেমন, 1.0.0 থেকে VERSION = tfds.core.Version('2.0.0') )।

নিবন্ধনের জন্য একটি আমদানি যোগ করুন

আপনার প্রজেক্টের __init__ এ ডেটাসেট মডিউলটি ইম্পোর্ট করতে ভুলবেন না, যাতে এটি tfds.load এবং tfds.builder এ স্বয়ংক্রিয়ভাবে নিবন্ধিত হয়।

import my_project.datasets.my_dataset  # Register MyDataset

ds = tfds.load('my_dataset')  # MyDataset available

উদাহরণস্বরূপ, আপনি যদি tensorflow/datasets এ অবদান রাখেন, তাহলে এর সাবডিরেক্টরি-র __init__.py ফাইলে (যেমন image/__init__.py ) মডিউল ইম্পোর্টটি যোগ করুন।

বাস্তবায়নের সাধারণ ভুলত্রুটিগুলো পরীক্ষা করুন

অনুগ্রহ করে বাস্তবায়ন সংক্রান্ত সাধারণ সমস্যাগুলো যাচাই করে নিন।

আপনার ডেটাসেট পরীক্ষা করুন

ডাউনলোড এবং প্রস্তুত করুন: tfds build

ডেটা সেট তৈরি করতে, my_dataset/ ডিরেক্টরি থেকে tfds build চালান:

cd path/to/datasets/my_dataset/
tfds build --register_checksums

উন্নয়নের জন্য কিছু দরকারি ফ্ল্যাগ:

  • --pdb : কোনো ব্যতিক্রম ঘটলে ডিবাগিং মোডে প্রবেশ করুন।
  • --overwrite : ডেটাসেটটি আগে থেকে তৈরি হয়ে থাকলে বিদ্যমান ফাইলগুলো মুছে ফেলুন।
  • --max_examples_per_split : সম্পূর্ণ ডেটাসেটের পরিবর্তে শুধুমাত্র প্রথম X সংখ্যক উদাহরণ তৈরি করুন (ডিফল্ট মান ১)।
  • --register_checksums : ডাউনলোড করা ইউআরএলগুলোর চেকসাম রেকর্ড করে। এটি শুধুমাত্র ডেভেলপমেন্ট পর্যায়ে ব্যবহার করা উচিত।

ফ্ল্যাগগুলোর সম্পূর্ণ তালিকার জন্য CLI ডকুমেন্টেশন দেখুন।

চেকসাম

আপনার ডেটাসেটগুলোর ডিটারমিনিজম নিশ্চিত করতে, ডকুমেন্টেশনে সাহায্য করতে, ইত্যাদি কারণে ডেটাসেটগুলোর চেকসাম রেকর্ড করার পরামর্শ দেওয়া হয়। এটি করার জন্য --register_checksums অপশনটি ব্যবহার করে ডেটাসেটটি জেনারেট করতে হয় (পূর্ববর্তী অংশ দেখুন)।

আপনি যদি PyPI-এর মাধ্যমে আপনার ডেটাসেটগুলো প্রকাশ করেন, তাহলে checksums.tsv ফাইলগুলো এক্সপোর্ট করতে ভুলবেন না (যেমন আপনার setup.py এর package_data তে)।

আপনার ডেটাসেট ইউনিট-টেস্ট করুন

tfds.testing.DatasetBuilderTestCase হলো একটি ডেটাসেটকে সম্পূর্ণরূপে পরীক্ষা করার জন্য ব্যবহৃত একটি বেস TestCase । এটি টেস্ট ডেটা হিসেবে "ডামি ডেটা" ব্যবহার করে, যা সোর্স ডেটাসেটের গঠনকে অনুকরণ করে।

  • টেস্ট ডেটা my_dataset/dummy_data/ ডিরেক্টরিতে রাখতে হবে এবং এটি ডাউনলোড ও এক্সট্র্যাক্ট করা সোর্স ডেটাসেটের আর্টিফ্যাক্টগুলোর অনুরূপ হতে হবে। এটি ম্যানুয়ালি অথবা একটি স্ক্রিপ্টের মাধ্যমে স্বয়ংক্রিয়ভাবে তৈরি করা যেতে পারে ( উদাহরণ স্ক্রিপ্ট )।
  • আপনার টেস্ট ডেটা স্প্লিটগুলিতে ভিন্ন ভিন্ন ডেটা ব্যবহার করা নিশ্চিত করুন, কারণ আপনার ডেটাসেট স্প্লিটগুলি ওভারল্যাপ করলে টেস্টটি ব্যর্থ হবে।
  • পরীক্ষার ডেটাতে কোনো কপিরাইটযুক্ত উপাদান থাকা উচিত নয় । সন্দেহ থাকলে, মূল ডেটাসেটের উপাদান ব্যবহার করে ডেটা তৈরি করবেন না।
import tensorflow_datasets as tfds
from . import my_dataset_dataset_builder


class MyDatasetTest(tfds.testing.DatasetBuilderTestCase):
  """Tests for my_dataset dataset."""
  DATASET_CLASS = my_dataset_dataset_builder.Builder
  SPLITS = {
      'train': 3,  # Number of fake train example
      'test': 1,  # Number of fake test example
  }

  # If you are calling `download/download_and_extract` with a dict, like:
  #   dl_manager.download({'some_key': 'http://a.org/out.txt', ...})
  # then the tests needs to provide the fake output paths relative to the
  # fake data directory
  DL_EXTRACT_RESULT = {
      'name1': 'path/to/file1',  # Relative to my_dataset/dummy_data dir.
      'name2': 'file2',
  }


if __name__ == '__main__':
  tfds.testing.test_main()

ডেটা সেটটি পরীক্ষা করার জন্য নিম্নলিখিত কমান্ডটি চালান।

python my_dataset_test.py

আমাদের মতামত পাঠান

আমরা ডেটাসেট তৈরির কার্যপ্রবাহ উন্নত করার জন্য ক্রমাগত চেষ্টা করছি, কিন্তু সমস্যাগুলো সম্পর্কে অবগত না হলে তা করা সম্ভব নয়। ডেটাসেট তৈরি করার সময় আপনি কোন সমস্যা বা ত্রুটির সম্মুখীন হয়েছিলেন? এমন কোনো অংশ কি ছিল যা বিভ্রান্তিকর ছিল, বা প্রথমবারে কাজ করছিল না?

অনুগ্রহ করে গিটহাবে আপনার মতামত জানান।