ชุดข้อมูล 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
)