Harici tfrecord'u TFDS ile yükleyin

Üçüncü taraf araçlar tarafından oluşturulmuş ve doğrudan tfds API ile yüklemek istediğiniz bir tf.train.Example protokolünüz varsa ( .tfrecord , .riegeli ,... içinde) bu sayfa tam size göre.

.tfrecord dosyalarınızı yüklemek için yalnızca şunları yapmanız gerekir:

  • TFDS adlandırma kurallarına uyun.
  • Tfrecord dosyalarınızın yanına meta veri dosyaları ( dataset_info.json , features.json ) ekleyin.

Sınırlamalar:

Dosya adlandırma kuralı

TFDS, farklı dosya adlandırma şemalarının kullanılmasında esneklik sağlayan dosya adları için bir şablon tanımlamayı destekler. Şablon bir tfds.core.ShardedFileTemplate ile temsil edilir ve şu değişkenleri destekler: {DATASET} , {SPLIT} , {FILEFORMAT} , {SHARD_INDEX} , {NUM_SHARDS} ve {SHARD_X_OF_Y} . Örneğin, TFDS'nin varsayılan dosya adlandırma şeması şöyledir: {DATASET}-{SPLIT}.{FILEFORMAT}-{SHARD_X_OF_Y} . MNIST için bu, dosya adlarının aşağıdaki gibi göründüğü anlamına gelir:

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

Meta veri ekle

Özellik yapısını sağlayın

TFDS'nin tf.train.Example protokolünün kodunu çözebilmesi için spesifikasyonlarınıza uygun tfds.features yapısını sağlamanız gerekir. Örneğin:

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),
        }),
})

Aşağıdaki tf.train.Example özelliklerine karşılık gelir:

{
    '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),
}

Özelliklerin belirtilmesi, TFDS'nin görüntüleri, videoları vb. otomatik olarak kodunu çözmesine olanak tanır... Diğer tüm TFDS veri kümeleri gibi, özellik meta verileri (örneğin etiket adları,...) kullanıcıya gösterilecektir (örneğin info.features['label'].names ).

Üretim boru hattını kontrol ediyorsanız

TFDS dışında veri kümeleri oluşturuyorsanız ancak yine de oluşturma hattını kontrol ediyorsanız, verilerinizi dict[np.ndarray] den tf.train.Example proto bytes kodlamak için tfds.features.FeatureConnector.serialize_example kullanabilirsiniz:

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)

Bu, TFDS ile özellik uyumluluğunu sağlayacaktır.

Benzer şekilde, protokolün kodunu çözmek için bir feature.deserialize_example mevcuttur ( example )

Üretim hattını kontrol etmiyorsanız

tfds.features tf.train.Example nasıl temsil edildiğini görmek istiyorsanız bunu colab'de inceleyebilirsiniz:

  • tfds.features tf.train.Example insan tarafından okunabilir yapısına dönüştürmek için, features.get_serialized_info() çağırabilirsiniz.
  • tf.io.parse_single_example dosyasına iletilen FixedLenFeature ,... spesifikasyonunun tam olarak elde edilmesi için spec = features.tf_example_spec kullanabilirsiniz.

Bölünmelerle ilgili istatistikler alın

TFDS, her bir parçadaki örneklerin tam sayısını bilmeyi gerektirir. Bu, len(ds) veya subplit API : split='train[75%:]' gibi özellikler için gereklidir.

  • Bu bilgiye sahipseniz açıkça bir tfds.core.SplitInfo listesi oluşturabilir ve bir sonraki bölüme geçebilirsiniz:

    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', ...),
    ]
    
  • Bu bilgiyi bilmiyorsanız, bunu compute_split_info.py betiğini kullanarak (veya tfds.folder_dataset.compute_split_info ile kendi betiğinizde) hesaplayabilirsiniz. Verilen dizindeki tüm parçaları okuyacak ve bilgiyi hesaplayacak bir ışın boru hattı başlatacak.

Meta veri dosyaları ekleyin

Veri kümenize uygun meta veri dosyalarını otomatik olarak eklemek için tfds.folder_dataset.write_metadata komutunu kullanın:

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.""",
)

İşlev, veri kümesi dizininizde bir kez çağrıldıktan sonra meta veri dosyaları ( dataset_info.json ,...) eklenmiştir ve veri kümeleriniz TFDS ile yüklenmeye hazırdır (sonraki bölüme bakın).

Veri kümesini TFDS ile yükleyin

Doğrudan klasörden

Meta veriler oluşturulduktan sonra veri kümeleri, standart TFDS API'sine ( tfds.builder gibi) sahip bir tfds.core.DatasetBuilder döndüren tfds.builder_from_directory kullanılarak yüklenebilir:

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:
  ...

Doğrudan birden fazla klasörden

Birden fazla klasörden veri yüklemek de mümkündür. Bu, örneğin takviyeli öğrenmede, birden fazla aracının her biri ayrı bir veri kümesi oluşturduğunda ve siz bunların hepsini birlikte yüklemek istediğinizde gerçekleşebilir. Diğer kullanım durumları, düzenli olarak yeni bir veri kümesinin (örneğin, her gün yeni bir veri kümesi) üretildiği ve bir tarih aralığından veri yüklemek istediğiniz durumlardır.

Birden çok klasörden veri yüklemek için, standart TFDS API'sine ( tfds.builder gibi) sahip bir tfds.core.DatasetBuilder döndüren tfds.builder_from_directories kullanın:

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:
  ...

Klasör yapısı (isteğe bağlı)

TFDS ile daha iyi uyumluluk için verilerinizi <data_dir>/<dataset_name>[/<dataset_config>]/<dataset_version> olarak düzenleyebilirsiniz. Örneğin:

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

Bu, yalnızca data_dir/ değerini sağlayarak veri kümelerinizi tfds.load / tfds.builder API'si ile uyumlu hale getirecektir:

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