Wszystkie zestawy danych TFDS udostępniają różne podziały danych (np 'train'
, 'test'
), które można przeglądać w katalogu .
Oprócz „oficjalnych” podziałów zbioru danych, TFDS umożliwia wybór wycinka(ów) podziału(ów) i różnych kombinacji.
API do krojenia
Instrukcje dotyczące krojenia są określone w tfds.load
lub tfds.DatasetBuilder.as_dataset
za pośrednictwem split=
kwarg.
ds = tfds.load('my_dataset', split='train[:75%]')
builder = tfds.builder('my_dataset')
ds = builder.as_dataset(split='test+train[:75%]')
Podział może być:
- Zwykły podział (
'train'
,'test'
): Wszystkie przykłady w wybranym podziale. - Plasterki : Plasterki mają taką samą semantykę jak notacja wycinków Pythona . Plastry mogą być:
- Absolute (
'train[123:450]'
,train[:4000]
): (patrz uwaga poniżej, aby uzyskać zastrzeżenie dotyczące kolejności odczytu) - Procent (
'train[:75%]'
,'train[25%:75%]'
): Podziel pełne dane na 100 równych wycinków. Jeśli dane nie są podzielne przez 100, pewien procent może zawierać dodatkowe przykłady. - Shard (
train[:4shard]
,train[4shard]
): Wybierz wszystkie przykłady w żądanym fragmencie. (zobaczinfo.splits['train'].num_shards
, aby uzyskać liczbę fragmentów podziału)
- Absolute (
- Unia podziałów (
'train+test'
,'train[:25%]+test'
): Podziały będą przeplatane razem. - Pełny zestaw danych (
'all'
):'all'
to specjalna nazwa podziału odpowiadająca połączeniu wszystkich podziałów (odpowiednik'train+test+...'
). - Lista podziałów (
['train', 'test']
): Wieletf.data.Dataset
jest zwracanych osobno:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])
tfds.even_splits
i szkolenie na wielu hostach
tfds.even_splits
generuje listę nienakładających się podpodziałów o tym samym rozmiarze.
# Divide the dataset into 3 even parts, each containing 1/3 of the data
split0, split1, split2 = tfds.even_splits('train', n=3)
ds = tfds.load('my_dataset', split=split2)
Może to być szczególnie przydatne podczas uczenia w środowisku rozproszonym, w którym każdy host powinien otrzymać wycinek oryginalnych danych.
Dzięki Jax
można to jeszcze bardziej uprościć, używając tfds.split_for_jax_process
:
split = tfds.split_for_jax_process('train', drop_remainder=True)
ds = tfds.load('my_dataset', split=split)
tfds.split_for_jax_process
to prosty alias dla:
# The current `process_index` loads only `1 / process_count` of the data.
splits = tfds.even_splits('train', n=jax.process_count(), drop_remainder=True)
split = splits[jax.process_index()]
tfds.even_splits
, tfds.split_for_jax_process
przyjmuje jako dane wejściowe dowolną wartość podziału (np 'train[75%:]+test'
)
Krojenie i metadane
Możliwe jest uzyskanie dodatkowych informacji o podziałach/subsplitach ( num_examples
, file_instructions
,...) za pomocą informacji o zbiorze danych :
builder = tfds.builder('my_dataset')
builder.info.splits['train'].num_examples # 10_000
builder.info.splits['train[:75%]'].num_examples # 7_500 (also works with slices)
builder.info.splits.keys() # ['train', 'test']
Walidacja krzyżowa
Przykłady 10-krotnego sprawdzania poprawności krzyżowej przy użyciu interfejsu API ciągów:
vals_ds = tfds.load('mnist', split=[
f'train[{k}%:{k+10}%]' for k in range(0, 100, 10)
])
trains_ds = tfds.load('mnist', split=[
f'train[:{k}%]+train[{k+10}%:]' for k in range(0, 100, 10)
])
Zestawy danych walidacyjnych będą miały wartość 10%: [0%:10%]
, [10%:20%]
, ..., [90%:100%]
. Uczące zbiory danych będą stanowić 90% komplementarne: [10%:100%]
(dla odpowiedniego zbioru walidacyjnego [0%:10%]
), `[0%:10%]
- [20%:100%]
(for a validation set of
[10%:20%]`),...
tfds.core.ReadInstruction
i zaokrąglanie
Zamiast str
, możliwe jest przekazywanie podziałów jako tfds.core.ReadInstruction
:
Na przykład split = 'train[50%:75%] + test'
jest równoważne z:
split = (
tfds.core.ReadInstruction(
'train',
from_=50,
to=75,
unit='%',
)
+ tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)
unit
może być:
-
abs
: bezwzględne krojenie -
%
: procent krojenia -
shard
: krojenie odłamków
tfds.ReadInstruction
ma również argument zaokrąglania. Jeśli liczba przykładów w zbiorze danych nie jest podzielona równo przez 100
:
-
rounding='closest'
(domyślnie): Pozostałe przykłady są dzielone na procent, więc niektóre procenty mogą zawierać dodatkowe przykłady. -
rounding='pct1_dropremainder'
: Pozostałe przykłady są usuwane, ale gwarantuje to, że wszystkie procenty zawierają dokładnie taką samą liczbę przykładów (np.:len(5%) == 5 * len(1%)
).
Odtwarzalność i determinizm
Podczas generowania, dla danej wersji zestawu danych, TFDS gwarantuje, że przykłady są deterministycznie tasowane na dysku. Zatem dwukrotne wygenerowanie zestawu danych (na 2 różnych komputerach) nie zmieni przykładowej kolejności.
Podobnie, subsplit API zawsze wybierze ten sam set
przykładów, niezależnie od platformy, architektury itp. Oznacza to set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]')
.
Jednak kolejność odczytywania przykładów może nie być deterministyczna. Zależy to od innych parametrów (np. czy shuffle_files=True
).