ชุดข้อมูล 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เพื่อดูจำนวนเศษของการแยก)
- Absolute (
- การรวมกันของการแยก (
'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 )