Conector de recursos

A API tfds.features.FeatureConnector :

  • Define a estrutura, formas e tipos do tf.data.Dataset final
  • Abstraia a serialização de/para o disco.
  • Expor 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.

Os recursos podem ser:

Durante a geração, os exemplos serão serializados automaticamente por 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)

Acessar metadados

Consulte o documento de introdução para acessar os metadados dos recursos (nomes dos 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 recursos, você precisa herdar de tfds.features.FeatureConnector e implementar os métodos abstratos.

  • Se o 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 o seu recurso for um contêiner de vários tensores, é melhor herdar de tfds.features.FeaturesDict e usar super() para codificar automaticamente os subconectores.

O objeto tfds.features.FeatureConnector abstrai como o recurso é codificado no disco e como ele é apresentado ao usuário. Abaixo está um diagrama que mostra 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 dados compatíveis 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 do usuário retornado por tf.data.Dataset .
  • get_tensor_info() : Indica a forma/tipo 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, então você precisa 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 ver um exemplo.

Para obter mais informações, dê uma olhada na documentação tfds.features.FeatureConnector . Também é melhor observar exemplos reais .