Tách và cắt

Tất cả các bộ dữ liệu TFDS 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 . Bất kỳ chuỗi chữ cái nào cũng có thể được sử dụng làm tên phân tách, ngoại trừ all (là thuật ngữ dành riêng tương ứng với sự kết hợp của tất cả các phần tách, xem bên dưới).

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

API cắt lát

Hướng dẫn cắ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à:

  • Tên phân tách đơn giản (một chuỗi chẳng hạn như 'train' , 'test' , ...): Tất cả các ví dụ trong phần phân tách đã chọn.
  • Các lát cắt : Các lát cắt có cùng ngữ nghĩa như ký hiệu lát cắt của python . Các lát cắt có thể là:
    • Tuyệt đối ( 'train[123:450]' , train[:4000] ): (xem ghi chú bên dưới để biết trước về thứ tự đọc)
    • Percent ( 'train[:75%]' , 'train[25%:75%]' ): Chia toàn bộ dữ liệu thành các lát chẵn. Nếu dữ liệu không chia đều thì một số phần trăm có thể chứa các ví dụ bổ sung. Phần trăm phân số được hỗ trợ.
    • Phân đoạn ( 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 để biết số lượng phân đoạn của phần chia)
  • Liên kết 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 chia đặ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 biệt:
# 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 chia nhỏ 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ôi trường phân tán, trong đó mỗi máy chủ sẽ nhận được một phần dữ liệu gốc.

Với Jax , việc 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à 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 lát và siêu dữ liệu

Có thể nhận thêm thông tin về phần tách/chia nhỏ ( 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 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 bộ dữ liệu xác thực sẽ là 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . Và mỗi tập dữ liệu huấn luyện sẽ là phần bổ sung 90%: [10%:100%] (đối với bộ xác thực tương ứng là [0%:10%] ), `[0%:10%]

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

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

Thay vì str , có thể chuyển 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
  • % : Cắt phần trăm
  • shard : Cắt mảnh vỡ

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

  • rounding='closest' (mặc định): Các ví dụ còn lại được phân bổ 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 tất cả phần trăm đều chứa cùng một số ví dụ (ví dụ: len(5%) == 5 * len(1%) ).

Khả năng tái lập và tính quyết đị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 (ở 2 máy tính khác nhau) sẽ không thay đổi thứ tự mẫu.

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. Điều này có nghĩa là set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

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