Conector de recursos

A API tfds.features.FeatureConnector :

  • Define a estrutura, formas, dtypes do tf.data.Dataset final
  • Serialização ausente abstrata para/do disco.
  • Exponha metadados adicionais (por exemplo, nomes de rótulos, taxa de amostragem de áudio,...)

Visão geral

tfds.features.FeatureConnector define a estrutura de recursos do conjunto de dados (em tfds.core.DatasetInfo ):

tfds.core.DatasetInfo(
    features
=tfds.features.FeaturesDict({
       
'image': tfds.features.Image(shape=(28, 28, 1), doc='Grayscale image'),
       
'label': tfds.features.ClassLabel(
            names
=['no', 'yes'],
            doc
=tfds.features.Documentation(
                desc
='Whether this is a picture of a cat',
                value_range
='yes or no'
           
),
       
),
       
'metadata': {
           
'id': tf.int64,
           
'timestamp': tfds.features.Scalar(
                tf
.int64,
                doc
='Timestamp when this picture was taken as seconds since epoch'),
           
'language': tf.string,
       
},
   
}),
)

Os recursos podem ser documentados usando apenas uma descrição textual ( doc='description' ) ou usando tfds.features.Documentation diretamente para fornecer uma descrição mais detalhada do recurso.

As características podem ser:

Durante a geração, os exemplos serão serializados automaticamente pelo FeatureConnector.encode_example em um formato adequado ao disco (atualmente buffers de protocolo tf.train.Example ):

yield {
   
'image': '/path/to/img0.png',  # `np.array`, file bytes,... also accepted
   
'label': 'yes',  # int (0-num_classes) also accepted
   
'metadata': {
       
'id': 43,
       
'language': 'en',
   
},
}

Ao ler o conjunto de dados (por exemplo, com tfds.load ), os dados são decodificados automaticamente com FeatureConnector.decode_example . O tf.data.Dataset retornado corresponderá à estrutura dict definida em tfds.core.DatasetInfo :

ds = tfds.load(...)
ds
.element_spec == {
   
'image': tf.TensorSpec(shape=(28, 28, 1), tf.uint8),
   
'label': tf.TensorSpec(shape=(), tf.int64),
   
'metadata': {
       
'id': tf.TensorSpec(shape=(), tf.int64),
       
'language': tf.TensorSpec(shape=(), tf.string),
   
},
}

Serializar/desserializar para proto

O TFDS expõe uma API de baixo nível para serializar/desserializar exemplos para o proto tf.train.Example .

Para serializar dict[np.ndarray | Path | str | ...] para proto bytes , use features.serialize_example :

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

Para desserializar para proto bytes para tf.Tensor , use features.deserialize_example :

ds = tf.data.TFRecordDataset('path/to/file.tfrecord')
ds
= ds.map(features.deserialize_example)

Metadados de acesso

Consulte o documento de introdução para acessar metadados de recursos (nomes de rótulos, forma, dtype,...). Exemplo:

ds, info = tfds.load(..., with_info=True)

info
.features['label'].names  # ['cat', 'dog', ...]
info
.features['label'].str2int('cat')  # 0

Crie seu próprio tfds.features.FeatureConnector

Se você acredita que um recurso está faltando entre os recursos disponíveis , abra um novo problema .

Para criar seu próprio conector de recurso, você precisa herdar de tfds.features.FeatureConnector e implementar os métodos abstratos.

  • Se seu recurso for um valor de tensor único, é melhor herdar de tfds.features.Tensor e usar super() quando necessário. Consulte o código-fonte tfds.features.BBoxFeature para obter um exemplo.
  • Se seu recurso é um contêiner de vários tensores, é melhor herdar de tfds.features.FeaturesDict e usar o super() para codificar automaticamente os subconectores.

O objeto tfds.features.FeatureConnector abstrai como o recurso é codificado no disco de como ele é apresentado ao usuário. Abaixo está um diagrama mostrando as camadas de abstração do conjunto de dados e a transformação dos arquivos brutos do conjunto de dados para o objeto tf.data.Dataset .

Camadas de abstração do DatasetBuilder

Para criar seu próprio conector de recursos, subclasse tfds.features.FeatureConnector e implemente os métodos abstratos:

  • encode_example(data) : Define como codificar os dados fornecidos no gerador _generate_examples() em um dado compatível com tf.train.Example . Pode retornar um único valor ou um dict de valores.
  • decode_example(data) : Define como decodificar os dados do tensor lido de tf.train.Example no tensor de usuário retornado por tf.data.Dataset .
  • get_tensor_info() : Indica a forma/dtype do(s) tensor(es) retornado(s) por tf.data.Dataset . Pode ser opcional se herdar de outro tfds.features .
  • (opcionalmente) get_serialized_info() : Se as informações retornadas por get_tensor_info() forem diferentes de como os dados são realmente gravados no disco, você precisará sobrescrever get_serialized_info() para corresponder às especificações do tf.train.Example
  • to_json_content / from_json_content : Isso é necessário para permitir que seu conjunto de dados seja carregado sem o código-fonte original. Consulte Recurso de áudio para obter um exemplo.

Para obter mais informações, consulte a documentação do tfds.features.FeatureConnector . Também é melhor olhar para exemplos reais .