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