La journée communautaire ML est le 9 novembre ! Rejoignez - nous pour les mises à jour de tensorflow, JAX et plus En savoir plus

Charger un tfrecord externe avec TFDS

Si vous avez un tf.train.Example proto (intérieur .tfrecord , .riegeli , ...), qui a été généré par des outils tiers, que vous voulez charger directement avec l' API TFDS, cette page est pour vous.

Pour charger vos .tfrecord fichiers, il vous suffit de:

  • Suivez la convention de nommage TFDS.
  • Ajouter fichiers de métadonnées ( dataset_info.json , features.json ) le long de vos fichiers tfrecord.

Limites:

Convention de nommage des fichiers

Pour que vos .tfrecord fichiers à détecter par TFDS, ils doivent suivre la convention de dénomination suivante: <dataset_name>-<split_name>.<file-extension>-xxxxx-of-yyyyy de <dataset_name>-<split_name>.<file-extension>-xxxxx-of-yyyyy

Par exemple, MNIST a les fichiers suivants :

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

Ajouter des métadonnées

Fournir la structure des fonctionnalités

Pour TFDS pour pouvoir décoder le tf.train.Example proto, vous devez fournir les tfds.features Sturcture correspondant à vos spécifications. Par example:

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

Correspond aux personnes suivantes tf.train.Example spécifications:

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

Définition des caractéristiques permettent TFDS aux fonctions des images décode automatiquement, vidéo, ... Comme tous les autres jeux de données TFD, les métadonnées (par exemple les noms de marque, ...) seront exposés à l'utilisateur (par exemple info.features['label'].names Les info.features['label'].names ).

Si vous n'êtes pas sûr de votre tfds.features se traduit tf.train.Example , vous pouvez expérimenter dans colab:

  • Pour traduire tfds.features dans la structure lisible par l' homme de l' tf.train.Example , vous pouvez appeler features.get_serialized_info() .
  • Pour obtenir exactement FixedLenFeature , ... spec est passé à tf.io.parse_single_example , vous pouvez utiliser le code suivant:

    example_specs = features.get_serialized_info()
    parser = tfds.core.example_parser.ExampleParser(example_specs)
    nested_feature_specs = parser._build_feature_specs()
    feature_specs = tfds.core.utils.flatten_nest_dict(nested_feature_specs)
    

Obtenez des statistiques sur les fractionnements

TFDS nécessite de connaître le nombre exact d'exemples dans chaque partition. Cela est nécessaire pour des fonctionnalités telles que len(ds) , ou l' API subplit : split='train[75%:]' .

  • Si vous avez ces informations, vous pouvez créer explicitement une liste de tfds.core.SplitInfo et passez à la section suivante:

    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', ...),
    ]
    
  • Si vous ne connaissez pas ces informations, vous pouvez calculer à l'aide du compute_split_info.py de script (ou dans votre propre script avec tfds.folder_dataset.compute_split_info ). Il lancera un pipeline de faisceau qui lira toutes les partitions du répertoire donné et calculera les informations.

Ajouter des fichiers de métadonnées

Pour ajouter automatiquement les fichiers de métadonnées appropriés le long de votre ensemble de données, l' utilisation tfds.core.write_metadata :

tfds.folder_dataset.write_metadata(
    builder_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/',

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

Une fois que la fonction a été appelé une fois sur le répertoire de votre jeu de données, fichiers de métadonnées ( dataset_info.json , ...) ont été ajoutées et vos jeux de données sont prêtes à être chargées avec TFDS (voir la section suivante).

Charger l'ensemble de données avec TFDS

Directement depuis le dossier

Une fois que les métadonnées ont été générés, des ensembles de données peuvent être chargées à l' aide tfds.core.builder_from_directory qui renvoie un tfds.core.DatasetBuilder avec l'API standard TFDS (comme tfds.builder ):

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

# Metadata are avalailable 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:
  ...

Structure des dossiers (facultatif)

Pour une meilleure compatibilité avec TFDS, vous pouvez organiser vos données <data_dir>/<dataset_name>[/<dataset_config>]/<dataset_version> . Par example:

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

Cela rendra vos jeux de données compatibles avec le tfds.load / tfds.builder API, en fournissant simplement data_dir/ :

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