Interfejs API tfds.features.FeatureConnector
:
- Definiuje strukturę, kształty, typy końcowego zestawu danych
tf.data.Dataset
- Abstrakcyjna serializacja do/z dysku.
- Ujawnij dodatkowe metadane (np. nazwy etykiet, częstotliwość próbkowania audio,...)
Przegląd
tfds.features.FeatureConnector
definiuje strukturę cech zbioru danych (w 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,
},
}),
)
Funkcje można udokumentować, używając samego opisu tekstowego ( doc='description'
) lub bezpośrednio używając tfds.features.Documentation
w celu zapewnienia bardziej szczegółowego opisu funkcji.
Funkcje mogą być:
- Wartości skalarne:
tf.bool
,tf.string
,tf.float32
,... Jeśli chcesz udokumentować cechę, możesz także użyćtfds.features.Scalar(tf.int64, doc='description')
. -
tfds.features.Audio
,tfds.features.Video
,... (zobacz listę dostępnych funkcji) - Zagnieżdżony
dict
funkcji:{'metadata': {'image': Image(), 'description': tf.string} }
,... - Zagnieżdżone
tfds.features.Sequence
:Sequence({'image': ..., 'id': ...})
,Sequence(Sequence(tf.int64))
,...
Podczas generowania przykłady zostaną automatycznie serializowane przez FeatureConnector.encode_example
do formatu odpowiedniego dla dysku (obecnie bufory protokołu 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',
},
}
Podczas odczytu zbioru danych (np. za pomocą tfds.load
) dane są automatycznie dekodowane za pomocą FeatureConnector.decode_example
. Zwrócony tf.data.Dataset
będzie zgodny ze strukturą dict
zdefiniowaną w 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),
},
}
Serializuj/deserializuj do proto
TFDS udostępnia API niskiego poziomu do serializacji/deserializacji przykładów do tf.train.Example
proto.
Aby serializować dict[np.ndarray | Path | str | ...]
na proto bytes
, użyj 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)
Aby deserializować do bytes
do tf.Tensor
, użyj features.deserialize_example
:
ds = tf.data.TFRecordDataset('path/to/file.tfrecord')
ds = ds.map(features.deserialize_example)
Dostęp do metadanych
Zobacz dokument wprowadzający , aby uzyskać dostęp do metadanych funkcji (nazwy etykiet, kształt, typ,...). Przykład:
ds, info = tfds.load(..., with_info=True)
info.features['label'].names # ['cat', 'dog', ...]
info.features['label'].str2int('cat') # 0
Utwórz własny tfds.features.FeatureConnector
Jeśli uważasz, że brakuje jakiejś funkcji w dostępnych funkcjach , otwórz nowe wydanie .
Aby utworzyć własny konektor funkcji, musisz dziedziczyć z tfds.features.FeatureConnector
i zaimplementować metody abstrakcyjne.
- Jeśli funkcja ma pojedynczą wartość tensora, najlepiej dziedziczyć po
tfds.features.Tensor
i w razie potrzeby używaćsuper()
. Przykład można znaleźć w kodzie źródłowymtfds.features.BBoxFeature
. - Jeśli Twoja funkcja jest kontenerem wielu tensorów, najlepiej dziedziczyć z
tfds.features.FeaturesDict
i używaćsuper()
do automatycznego kodowania podzłączy.
Obiekt tfds.features.FeatureConnector
oddziela sposób kodowania funkcji na dysku od sposobu jej prezentacji użytkownikowi. Poniżej znajduje się diagram przedstawiający warstwy abstrakcji zbioru danych oraz transformację surowych plików zbioru danych do obiektu tf.data.Dataset
.
Aby utworzyć własny konektor funkcji, podklasę tfds.features.FeatureConnector
i zaimplementuj metody abstrakcyjne:
-
encode_example(data)
: Określa sposób kodowania danych podanych w generatorze_generate_examples()
do danych zgodnychtf.train.Example
. Może zwrócić pojedynczą wartość lubdict
wartości. -
decode_example(data)
: Określa sposób dekodowania danych z tensora odczytanego ztf.train.Example
do tensora użytkownika zwróconego przeztf.data.Dataset
. -
get_tensor_info()
: Wskazuje kształt/typ tensora(ów) zwracanego przeztf.data.Dataset
. Może być opcjonalny w przypadku dziedziczenia z innegotfds.features
. - (opcjonalnie)
get_serialized_info()
: Jeśli informacja zwrócona przezget_tensor_info()
różni się od tego, w jaki sposób dane są faktycznie zapisane na dysku, musisz nadpisaćget_serialized_info()
w celu dopasowania do specyfikacjitf.train.Example
-
to_json_content
/from_json_content
: Jest to wymagane, aby umożliwić załadowanie zestawu danych bez oryginalnego kodu źródłowego. Zobacz przykład funkcji Audio .
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją tfds.features.FeatureConnector
. Najlepiej też przyjrzeć się prawdziwym przykładom .