หั่นและหั่น

ชุดข้อมูล TFDS ทั้งหมดเปิดเผยการแยกข้อมูลต่างๆ (เช่น 'train' , 'test' ) ซึ่งสามารถสำรวจได้ใน แคตตาล็อก

นอกเหนือจากการแยกชุดข้อมูล "อย่างเป็นทางการ" แล้ว TFDS ยังอนุญาตให้เลือกส่วนของการแยกและชุดค่าผสมต่างๆ

API สไลซ์

คำแนะนำในการแบ่งส่วนถูกระบุไว้ใน tfds.load หรือ tfds.DatasetBuilder.as_dataset ผ่าน split= kwarg

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

แยกสามารถ:

  • การ แบ่งธรรมดา ( 'train' , 'test' ): ตัวอย่างทั้งหมดภายในแยกที่เลือก
  • ไล ซ์ : สไลซ์มีความหมายเหมือนกับ สัญกรณ์สไลซ์ไพ ธอน ชิ้นสามารถ:
    • Absolute ( 'train[123:450]' , train[:4000] ): (ดูหมายเหตุด้านล่างสำหรับคำเตือนเกี่ยวกับลำดับการอ่าน)
    • เปอร์เซ็นต์ ( 'train[:75%]' , 'train[25%:75%]' ): แบ่งข้อมูลทั้งหมดออกเป็น 100 ส่วนเท่าๆ กัน ถ้าข้อมูลหารด้วย 100 ไม่ลงตัว บางส่วนอาจมีตัวอย่างเพิ่มเติม
    • ชาร์ด ( train[:4shard] , train[4shard] ): เลือกตัวอย่างทั้งหมดในชาร์ดที่ร้องขอ (ดู info.splits['train'].num_shards เพื่อดูจำนวนชาร์ดของการแยก)
  • Union of splits ( 'train+test' , 'train[:25%]+test' ): การแยกส่วนจะถูกสอดแทรกเข้าด้วยกัน
  • ชุดข้อมูลแบบเต็ม ( 'all' ): 'all' เป็นชื่อแยกพิเศษที่สอดคล้องกับการรวมตัวของการแยกทั้งหมด (เทียบเท่า 'train+test+...' )
  • รายการแยก ( ['train', 'test'] ): ส่งคืน tf.data.Dataset หลายชุดแยกกัน:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits & การฝึกอบรมหลายโฮสต์

tfds.even_splits สร้างรายการการแบ่งย่อยที่ไม่ทับซ้อนกันซึ่งมีขนาดเท่ากัน

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

สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อฝึกอบรมในสภาพแวดล้อมแบบกระจาย ซึ่งแต่ละโฮสต์ควรได้รับข้อมูลดั้งเดิมบางส่วน

ด้วย Jax สิ่งนี้สามารถทำให้ง่ายขึ้นได้โดยใช้ 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 เป็นนามแฝงอย่างง่ายสำหรับ:

# 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 ยอมรับค่าการแยกเป็นอินพุต (เช่น 'train[75%:]+test' )

การแบ่งส่วนและข้อมูลเมตา

สามารถรับข้อมูลเพิ่มเติมเกี่ยวกับการแยก/การแยกย่อย ( num_examples , file_instructions ,...) โดยใช้ dataset info :

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

การตรวจสอบข้าม

ตัวอย่างของการตรวจสอบความถูกต้องข้าม 10 เท่าโดยใช้สตริง API:

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

ชุดข้อมูลการตรวจสอบความถูกต้องแต่ละชุดจะเป็น 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] และชุดข้อมูลการฝึกอบรมแต่ละชุดจะเป็นส่วนเสริม 90%: [10%:100%] (สำหรับชุดการตรวจสอบความถูกต้องที่สอดคล้องกันของ [0%:10%] ), `[0%:10%]

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

tfds.core.ReadInstruction และปัดเศษ

แทนที่จะเป็น str เป็นไปได้ที่จะส่งการแยกเป็น tfds.core.ReadInstruction :

ตัวอย่างเช่น split = 'train[50%:75%] + test' เทียบเท่ากับ:

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

unit สามารถ:

  • abs : การหั่นแบบสัมบูรณ์
  • % : เปอร์เซ็นต์การหั่น
  • shard : หั่นเศษ

tfds.ReadInstruction มีอาร์กิวเมนต์การปัดเศษด้วย หากจำนวนตัวอย่างในชุดข้อมูลไม่หารด้วย 100 เท่ากัน:

  • rounding='closest' (ค่าเริ่มต้น): ตัวอย่างที่เหลือจะถูกแจกจ่ายเป็นเปอร์เซ็นต์ ดังนั้นบางเปอร์เซ็นต์อาจมีตัวอย่างเพิ่มเติม
  • rounding='pct1_dropremainder' : ตัวอย่างที่เหลือจะถูกทิ้ง แต่การรับประกันนี้รับประกันเปอร์เซ็นต์ทั้งหมดมีจำนวนตัวอย่างที่เหมือนกันทุกประการ (เช่น: len(5%) == 5 * len(1%) )

ความสามารถในการทำซ้ำ & การกำหนด

ระหว่างการสร้าง สำหรับรุ่นชุดข้อมูลที่กำหนด TFDS รับประกันว่าตัวอย่างจะถูกสับเปลี่ยนอย่างกำหนดบนดิสก์ ดังนั้น การสร้างชุดข้อมูลสองครั้ง (ในคอมพิวเตอร์ 2 เครื่องที่ต่างกัน) จะไม่เปลี่ยนลำดับตัวอย่าง

ในทำนองเดียวกัน API แยกย่อยจะเลือก set ตัวอย่างเดียวกันเสมอ โดยไม่คำนึงถึงแพลตฟอร์ม สถาปัตยกรรม ฯลฯ ค่าเฉลี่ย set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]')

อย่างไรก็ตาม ลำดับการอ่านตัวอย่างอาจ ไม่ ถูกกำหนด ขึ้นอยู่กับพารามิเตอร์อื่น ๆ (เช่น shuffle_files=True หรือไม่)