Merci de vous être connecté à Google I/O. Voir toutes les sessions à la demande Regarder à la demande

Gestion des versions des jeux de données

Définition

La gestion des versions peut faire référence à différentes significations :

  • La version de l' API TFDS (version pip): tfds. version
  • La version du jeu de données publique, indépendante de TFDS (par exemple Voc2007 , Voc2012). Dans TFDS, chaque version d'ensemble de données public doit être implémentée en tant qu'ensemble de données indépendant :
    • Que ce soit par constructeur configs : Par exemple voc/2007 , voc/2012
    • Soit en tant que 2 jeux de données indépendants: Par exemple wmt13_translate , wmt14_translate
  • La version de code de génération de jeu de données dans TFDS ( my_dataset:1.0.0 ): Par exemple, si un bogue se trouve dans la mise en œuvre de TFDS voc/2007 , le voc.py code de génération sera mis à jour ( voc/2007:1.0.0 - > voc/2007:2.0.0 ).

Le reste de ce guide se concentre uniquement sur la dernière définition (version du code du jeu de données dans le référentiel TFDS).

Versions prises en charge

En règle générale:

  • Seule la dernière version actuelle peut être générée.
  • Tous les ensembles de données générés précédemment peuvent être lus (remarque : cela nécessite des ensembles de données générés avec TFDS 4+).
builder = tfds.builder('my_dataset')
builder.info.version  # Current version is: '2.0.0'

# download and load the last available version (2.0.0)
ds = tfds.load('my_dataset')

# Explicitly load a previous version (only works if
# `~/tensorflow_datasets/my_dataset/1.0.0/` already exists)
ds = tfds.load('my_dataset:1.0.0')

Sémantique

Chaque DatasetBuilder défini dans TFDS est livré avec une version, par exemple:

class MNIST(tfds.core.GeneratorBasedBuilder):
  VERSION = tfds.core.Version('2.0.0')
  RELEASE_NOTES = {
      '1.0.0': 'Initial release',
      '2.0.0': 'Update dead download url',
  }

La version suivante sémantique Versioning 2.0.0 : MAJOR.MINOR.PATCH . Le but de la version est de pouvoir garantir la reproductibilité : le chargement d'un jeu de données donné à une version fixe donne les mêmes données. Plus précisement:

  • Si PATCH version est incrémenté, des données comme lu par le client est le même, bien que les données peuvent être sérialisés différemment sur le disque, ou les métadonnées peuvent avoir changé. Pour une tranche donnée, l'API de découpage renvoie le même ensemble d'enregistrements.
  • Si MINOR version est incrémenté, les données existantes comme lu par le client est le même, mais il existe des données supplémentaires (caractéristiques de chaque enregistrement). Pour une tranche donnée, l'API de découpage renvoie le même ensemble d'enregistrements.
  • Si MAJOR version est incrémenté, les données existantes ont été modifiées et / ou de l'API de coupe ne retourne pas nécessairement le même ensemble d'enregistrements pour une tranche donnée.

Lorsqu'un changement de code est apporté à la bibliothèque TFDS et que ce changement de code a un impact sur la façon dont un ensemble de données est sérialisé et/ou lu par le client, la version de générateur correspondante est incrémentée conformément aux directives ci-dessus.

Notez que la sémantique ci-dessus est le meilleur effort, et il peut y avoir des bogues inaperçus affectant un ensemble de données alors que la version n'a pas été incrémentée. Ces insectes sont finalement fixés, mais si vous comptez beaucoup sur le versioning, nous vous conseillons d'utiliser TFDS à partir d' une version publiée (par opposition à HEAD ).

Notez également que certains ensembles de données ont un autre schéma de version indépendant de la version TFDS. Par exemple, les images ouvertes ensemble de données a plusieurs versions, et en TFDS, les constructeurs correspondants sont open_images_v4 , open_images_v5 , ...

Chargement d'une version spécifique

Lors du chargement d' un jeu de données ou un DatasetBuilder , vous pouvez spécifier la version à utiliser. Par example:

tfds.load('imagenet2012:2.0.1')
tfds.builder('imagenet2012:2.0.1')

tfds.load('imagenet2012:2.0.0')  # Error: unsupported version.

# Resolves to 3.0.0 for now, but would resolve to 3.1.1 if when added.
tfds.load('imagenet2012:3.*.*')

Si vous utilisez TFDS pour une publication, nous vous conseillons de :

  • fixer le MAJOR composant de la version uniquement;
  • annoncez quelle version de l'ensemble de données a été utilisée dans vos résultats.

Cela devrait permettre à votre futur moi, à vos lecteurs et à vos examinateurs de reproduire plus facilement vos résultats.

BUILDER_CONFIGS et versions

Certains ensembles de données définissent plusieurs BUILDER_CONFIGS . Lorsque tel est le cas, la version et supported_versions sont définis sur la configuration des objets eux - mêmes. En dehors de cela, la sémantique et l'utilisation sont identiques. Par example:

class OpenImagesV4(tfds.core.GeneratorBasedBuilder):

  BUILDER_CONFIGS = [
      OpenImagesV4Config(
          name='original',
          version=tfds.core.Version('0.2.0'),
          supported_versions=[
            tfds.core.Version('1.0.0', "Major change in data"),
          ],
          description='Images at their original resolution and quality.'),
      ...
  ]

tfds.load('open_images_v4/original:1.*.*')

Version expérimentale

Il est possible de permettre la génération de 2 versions en même temps. Une version par défaut et une version expérimentale. Par example:

class MNIST(tfds.core.GeneratorBasedBuilder):
  VERSION = tfds.core.Version("1.0.0")  # Default version
  SUPPORTED_VERSIONS = [
      tfds.core.Version("2.0.0"),  # Experimental version
  ]


# Download and load default version 1.0.0
builder = tfds.builder('mnist')

#  Download and load experimental version 2.0.0
builder = tfds.builder('mnist', version='experimental_latest')

Dans le code, vous devez vous assurer de prendre en charge les 2 versions :

class MNIST(tfds.core.GeneratorBasedBuilder):

  ...

  def _generate_examples(self, path):
    if self.info.version >= '2.0.0':
      ...
    else:
      ...