Üçü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:
-
tf.train.SequenceExample
desteklenmez, yalnızcatf.train.Example
desteklenir. -
tf.train.Example
tfds.features
cinsinden ifade edebilmeniz gerekir (aşağıdaki bölüme bakın).
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 iletilenFixedLenFeature
,... spesifikasyonunun tam olarak elde edilmesi içinspec = 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 (veyatfds.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/')