TFDS এর সাথে বাহ্যিক tfrecord লোড করুন

আপনার যদি একটি tf.train.Example প্রোটো থাকে ( .tfrecord , .riegeli ,... এর ভিতরে), যা তৃতীয় পক্ষের সরঞ্জাম দ্বারা তৈরি করা হয়েছে, যা আপনি সরাসরি tfds API দিয়ে লোড করতে চান, তাহলে এই পৃষ্ঠাটি আপনার জন্য।

আপনার .tfrecord ফাইলগুলি লোড করার জন্য, আপনাকে শুধুমাত্র এটি করতে হবে:

  • TFDS নামকরণের নিয়ম অনুসরণ করুন।
  • আপনার tfrecord ফাইলগুলির সাথে মেটাডেটা ফাইলগুলি ( dataset_info.json , features.json ) যুক্ত করুন৷

সীমাবদ্ধতা:

ফাইল নামকরণ কনভেনশন

TFDS ফাইলের নামের জন্য একটি টেমপ্লেট সংজ্ঞায়িত করতে সমর্থন করে, যা বিভিন্ন ফাইল নামকরণ স্কিম ব্যবহার করার জন্য নমনীয়তা প্রদান করে। টেমপ্লেটটি একটি tfds.core.ShardedFileTemplate দ্বারা প্রতিনিধিত্ব করে এবং নিম্নলিখিত ভেরিয়েবলগুলিকে সমর্থন করে: {DATASET} , {SPLIT} , {FILEFORMAT} , {SHARD_INDEX} , {NUM_SHARDS} , এবং {SHARD_X_OF_Y} । উদাহরণস্বরূপ, TFDS-এর ডিফল্ট ফাইল নামকরণ স্কিম হল: {DATASET}-{SPLIT}.{FILEFORMAT}-{SHARD_X_OF_Y} । MNIST-এর জন্য, এর মানে হল যে ফাইলের নামগুলি নিম্নরূপ দেখায়:

  • mnist-test.tfrecord-00000-of-00001
  • mnist-train.tfrecord-00000-of-00001

মেটাডেটা যোগ করুন

বৈশিষ্ট্য গঠন প্রদান

TFDS tf.train.Example প্রোটোকে ডিকোড করতে সক্ষম হওয়ার জন্য, আপনাকে tfds.features স্ট্রাকচারটি আপনার চশমার সাথে মেলে। উদাহরণ স্বরূপ:

features = tfds.features.FeaturesDict({
    'image':
        tfds.features.Image(
            shape=(256, 256, 3),
            doc='Picture taken by smartphone, downscaled.'),
    'label':
        tfds.features.ClassLabel(names=['dog', 'cat']),
    'objects':
        tfds.features.Sequence({
            'camera/K': tfds.features.Tensor(shape=(3,), dtype=tf.float32),
        }),
})

নিম্নলিখিত tf.train.Example speces এর সাথে মিলে যায়:

{
    'image': tf.io.FixedLenFeature(shape=(), dtype=tf.string),
    'label': tf.io.FixedLenFeature(shape=(), dtype=tf.int64),
    'objects/camera/K': tf.io.FixedLenSequenceFeature(shape=(3,), dtype=tf.int64),
}

বৈশিষ্ট্যগুলি নির্দিষ্ট করে TFDS স্বয়ংক্রিয়ভাবে ছবি, ভিডিও,... ডিকোড করার অনুমতি দেয় অন্যান্য TFDS ডেটাসেটের মতো, বৈশিষ্ট্য মেটাডেটা (যেমন লেবেলের নাম,...) ব্যবহারকারীর কাছে উন্মুক্ত করা হবে (যেমন info.features['label'].names )

আপনি যদি প্রজন্মের পাইপলাইন নিয়ন্ত্রণ করেন

আপনি যদি TFDS-এর বাইরে ডেটাসেট তৈরি করেন কিন্তু তারপরও জেনারেশন পাইপলাইন নিয়ন্ত্রণ করেন, তাহলে আপনি tfds.features.FeatureConnector.serialize_example ব্যবহার করতে পারেন আপনার ডেটা এনকোড করতে dict[np.ndarray] থেকে tf.train.Example প্রোটো bytes :

with tf.io.TFRecordWriter('path/to/file.tfrecord') as writer:
  for ex in all_exs:
    ex_bytes = features.serialize_example(data)
    writer.write(ex_bytes)

এটি TFDS-এর সাথে বৈশিষ্ট্যের সামঞ্জস্য নিশ্চিত করবে।

একইভাবে, প্রোটো ডিকোড করার জন্য একটি feature.deserialize_example বিদ্যমান রয়েছে ( উদাহরণ )

আপনি যদি প্রজন্মের পাইপলাইন নিয়ন্ত্রণ না করেন

একটি tf.train.Exampletfds.features কিভাবে উপস্থাপন করা হয় তা দেখতে চাইলে, আপনি এটি colab-এ পরীক্ষা করতে পারেন:

  • tfds.features tf.train.Example এর মানব পাঠযোগ্য কাঠামোতে অনুবাদ করতে, আপনি features.get_serialized_info() কল করতে পারেন।
  • সঠিক FixedLenFeature পেতে,... spec পাস করা হয়েছে tf.io.parse_single_example , আপনি spec = features.tf_example_spec ব্যবহার করতে পারেন

বিভাজনের পরিসংখ্যান পান

TFDS-এর জন্য প্রতিটি শার্ডের মধ্যে উদাহরণের সঠিক সংখ্যা জানতে হবে। এটি len(ds) , বা সাবপ্লিট API : split='train[75%:]' এর মতো বৈশিষ্ট্যগুলির জন্য প্রয়োজন।

  • আপনার কাছে এই তথ্য থাকলে, আপনি স্পষ্টভাবে tfds.core.SplitInfo এর একটি তালিকা তৈরি করতে পারেন এবং পরবর্তী বিভাগে যেতে পারেন:

    split_infos = [
        tfds.core.SplitInfo(
            name='train',
            shard_lengths=[1024, ...],  # Num of examples in shard0, shard1,...
            num_bytes=0,  # Total size of your dataset (if unknown, set to 0)
        ),
        tfds.core.SplitInfo(name='test', ...),
    ]
    
  • আপনি যদি এই তথ্য না জানেন, তাহলে আপনি compute_split_info.py স্ক্রিপ্ট (অথবা tfds.folder_dataset.compute_split_info সহ আপনার নিজস্ব স্ক্রিপ্টে) ব্যবহার করে এটি গণনা করতে পারেন। এটি একটি বিম পাইপলাইন চালু করবে যা প্রদত্ত ডিরেক্টরিতে সমস্ত শার্ড পড়বে এবং তথ্য গণনা করবে।

মেটাডেটা ফাইল যোগ করুন

আপনার ডেটাসেটের সাথে সঠিক মেটাডেটা ফাইলগুলি স্বয়ংক্রিয়ভাবে যুক্ত করতে, tfds.folder_dataset.write_metadata ব্যবহার করুন :

tfds.folder_dataset.write_metadata(
    data_dir='/path/to/my/dataset/1.0.0/',
    features=features,
    # Pass the `out_dir` argument of compute_split_info (see section above)
    # You can also explicitly pass a list of `tfds.core.SplitInfo`.
    split_infos='/path/to/my/dataset/1.0.0/',
    # Pass a custom file name template or use None for the default TFDS
    # file name template.
    filename_template='{SPLIT}-{SHARD_X_OF_Y}.{FILEFORMAT}',

    # Optionally, additional DatasetInfo metadata can be provided
    # See:
    # https://www.tensorflow.org/datasets/api_docs/python/tfds/core/DatasetInfo
    description="""Multi-line description."""
    homepage='http://my-project.org',
    supervised_keys=('image', 'label'),
    citation="""BibTex citation.""",
)

আপনার ডেটাসেট ডিরেক্টরিতে একবার ফাংশনটি কল করা হলে, মেটাডেটা ফাইলগুলি ( dataset_info.json ,...) যোগ করা হয়েছে এবং আপনার ডেটাসেটগুলি TFDS এর সাথে লোড করার জন্য প্রস্তুত (পরবর্তী বিভাগটি দেখুন)।

TFDS এর সাথে ডেটাসেট লোড করুন

সরাসরি ফোল্ডার থেকে

একবার মেটাডেটা তৈরি হয়ে গেলে, ডেটাসেটগুলি tfds.builder_from_directory ব্যবহার করে লোড করা যেতে পারে যা একটি tfds.core.DatasetBuilder স্ট্যান্ডার্ড TFDS API (যেমন tfds.builder ):

builder = tfds.builder_from_directory('~/path/to/my_dataset/3.0.0/')

# Metadata are available as usual
builder.info.splits['train'].num_examples

# Construct the tf.data.Dataset pipeline
ds = builder.as_dataset(split='train[75%:]')
for ex in ds:
  ...

সরাসরি একাধিক ফোল্ডার থেকে

একাধিক ফোল্ডার থেকে ডেটা লোড করাও সম্ভব। এটি ঘটতে পারে, উদাহরণস্বরূপ, শক্তিবৃদ্ধি শেখার ক্ষেত্রে যখন একাধিক এজেন্ট প্রত্যেকে একটি পৃথক ডেটাসেট তৈরি করে এবং আপনি সেগুলিকে একসাথে লোড করতে চান। অন্যান্য ব্যবহারের ক্ষেত্রে যখন একটি নতুন ডেটাসেট নিয়মিতভাবে উত্পাদিত হয়, যেমন প্রতিদিন একটি নতুন ডেটাসেট, এবং আপনি একটি তারিখ পরিসর থেকে ডেটা লোড করতে চান৷

একাধিক ফোল্ডার থেকে ডেটা লোড করতে, tfds.builder_from_directories ব্যবহার করুন, যা স্ট্যান্ডার্ড TFDS API (যেমন tfds.builder ) সহ একটি tfds.core.DatasetBuilder প্রদান করে :

builder = tfds.builder_from_directories(builder_dirs=[
    '~/path/my_dataset/agent1/1.0.0/',
    '~/path/my_dataset/agent2/1.0.0/',
    '~/path/my_dataset/agent3/1.0.0/',
])

# Metadata are available as usual
builder.info.splits['train'].num_examples

# Construct the tf.data.Dataset pipeline
ds = builder.as_dataset(split='train[75%:]')
for ex in ds:
  ...

ফোল্ডার গঠন (ঐচ্ছিক)

TFDS-এর সাথে আরও ভাল সামঞ্জস্যের জন্য, আপনি আপনার ডেটা <data_dir>/<dataset_name>[/<dataset_config>]/<dataset_version> হিসাবে সংগঠিত করতে পারেন। উদাহরণ স্বরূপ:

data_dir/
    dataset0/
        1.0.0/
        1.0.1/
    dataset1/
        config0/
            2.0.0/
        config1/
            2.0.0/

এটি আপনার ডেটাসেটগুলিকে tfds.load / tfds.builder API-এর সাথে সামঞ্জস্যপূর্ণ করে তুলবে, শুধুমাত্র data_dir/ প্রদান করে :

ds0 = tfds.load('dataset0', data_dir='data_dir/')
ds1 = tfds.load('dataset1/config0', data_dir='data_dir/')