Tách và cắt

Tất cả các tập dữ liệu TFDS đều hiển thị các phần tách dữ liệu khác nhau (ví dụ: 'train' , 'test' ) có thể được khám phá trong danh mục .

Ngoài các phần tách tập dữ liệu "chính thức", TFDS cho phép chọn (các) phần của (các) phần tách và các kết hợp khác nhau.

API cắt lát

Hướng dẫn cắt lát được chỉ định trong tfds.load hoặc tfds.DatasetBuilder.as_dataset thông qua split= kwarg.

ds = tfds.load('my_dataset', split='train[:75%]')
builder = tfds.builder('my_dataset')
ds = builder.as_dataset(split='test+train[:75%]')

Sự phân chia có thể là:

  • Phân tách thuần túy ( 'train' , 'test' ): Tất cả các ví dụ trong phân tách đã chọn.
  • Slices : Slices có cùng ngữ nghĩa với ký hiệu lát của python . Lát có thể là:
    • Absolute ( 'train[123:450]' , train[:4000] ): (xem lưu ý bên dưới để biết trước về thứ tự đọc)
    • Percent ( 'train[:75%]' , 'train[25%:75%]' ): Chia dữ liệu đầy đủ thành 100 lát chẵn. Nếu dữ liệu không chia hết cho 100, một số phần trăm có thể chứa các ví dụ bổ sung.
    • Shard ( train[:4shard] , train[4shard] ): Chọn tất cả các ví dụ trong phân đoạn được yêu cầu. (xem info.splits['train'].num_shards để lấy số lượng các mảnh của phần tách)
  • Liên hợp các phần tách ( 'train+test' , 'train[:25%]+test' ): Các phần tách sẽ được xen kẽ với nhau.
  • Tập dữ liệu đầy đủ ( 'all' ): 'all' là tên phân tách đặc biệt tương ứng với sự kết hợp của tất cả các phân tách (tương đương với 'train+test+...' ).
  • Danh sách các phần tách ( ['train', 'test'] ): Nhiều tf.data.Dataset được trả về riêng lẻ:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits & đào tạo nhiều máy chủ

tfds.even_splits tạo danh sách các phần tách con không chồng chéo có cùng kích thước.

# 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)

Điều này có thể đặc biệt hữu ích khi đào tạo trong một cài đặt phân tán, nơi mỗi máy chủ lưu trữ sẽ nhận được một phần dữ liệu gốc.

Với Jax , điều này có thể được đơn giản hóa hơn nữa bằng cách sử dụng 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 là một bí danh đơn giản cho:

# 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 chấp nhận bất kỳ giá trị phân tách nào làm đầu vào (ví dụ: 'train[75%:]+test' )

Cắt và siêu dữ liệu

Có thể nhận thêm thông tin về các phần tách / phân tách con ( num_examples , file_instructions , ...) bằng cách sử dụng thông tin tập dữ liệu :

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']

Xác thực chéo

Ví dụ về xác thực chéo 10 lần bằng cách sử dụng API chuỗi:

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)
])

Mỗi tập dữ liệu xác thực sẽ là 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . Và mỗi tập dữ liệu đào tạo sẽ là 90% bổ sung: [10%:100%] (đối với tập hợp xác thực tương ứng là [0%:10%] ), `[0%: 10%]

  • [20%: 100%] (for a validation set of [10%: 20%] `), ...

tfds.core.ReadInstruction và làm tròn

Thay vì str , có thể chuyển các phân tách dưới dạng tfds.core.ReadInstruction .

Ví dụ: split = 'train[50%:75%] + test' tương đương với:

split = (
    tfds.core.ReadInstruction(
        'train',
        from_=50,
        to=75,
        unit='%',
    )
    + tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)

unit có thể là:

  • abs : Cắt tuyệt đối
  • % : Phần trăm cắt lát
  • shard : Cắt mảnh

tfds.ReadInstruction cũng có một đối số làm tròn. Nếu số lượng ví dụ trong tập dữ liệu không chia đều cho 100 :

  • rounding='closest' (mặc định): Các ví dụ còn lại được phân phối theo phần trăm, vì vậy một số phần trăm có thể chứa các ví dụ bổ sung.
  • rounding='pct1_dropremainder' : Các ví dụ còn lại bị loại bỏ, nhưng điều này đảm bảo rằng tất cả các phần trăm đều chứa cùng một số lượng ví dụ chính xác (ví dụ: len(5%) == 5 * len(1%) ).

Tính tái lập & thuyết xác định

Trong quá trình tạo, đối với một phiên bản tập dữ liệu nhất định, TFDS đảm bảo rằng các ví dụ được xáo trộn một cách xác định trên đĩa. Vì vậy, việc tạo tập dữ liệu hai lần (trong 2 máy tính khác nhau) sẽ không thay đổi thứ tự ví dụ.

Tương tự, API subsplit sẽ luôn chọn cùng một set các ví dụ, bất kể nền tảng, kiến ​​trúc, v.v. Tập hợp trung bình này set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

Tuy nhiên, thứ tự mà các ví dụ được đọc có thể không xác định. Điều này phụ thuộc vào các tham số khác (ví dụ: liệu shuffle_files=True ).