แยกและหั่น

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

นอกเหนือจากการแยกชุดข้อมูล "อย่างเป็นทางการ" แล้ว 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' , ...): ตัวอย่างทั้งหมดภายในการแยกที่เลือก
  • Slices : Slices มีความหมายเหมือนกับ เครื่องหมาย Slice ของ Python ชิ้นสามารถ:
    • Absolute ( 'train[123:450]' , train[:4000] ): (ดูหมายเหตุด้านล่างสำหรับคำเตือนเกี่ยวกับลำดับการอ่าน)
    • เปอร์เซ็นต์ ( 'train[:75%]' , 'train[25%:75%]' ): แบ่งข้อมูลทั้งหมดออกเป็นชิ้นคู่ หากข้อมูลแบ่งไม่เท่ากัน บางเปอร์เซ็นต์อาจมีตัวอย่างเพิ่มเติม รองรับเปอร์เซ็นต์เศษส่วน
    • Shard ( train[:4shard] , train[4shard] ): เลือกตัวอย่างทั้งหมดในชาร์ดที่ต้องการ (ดู info.splits['train'].num_shards เพื่อดูจำนวนเศษของการแยก)
  • การรวมกันของการแยก ( '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 ,...) โดยใช้ ชุดข้อมูล 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%:20%]`),...

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 ยังมีอาร์กิวเมนต์การปัดเศษ หากจำนวนตัวอย่างในชุดข้อมูลไม่หารเท่ากัน:

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