partition_dataset with ratios leaves some items out of every partition
Maintainers usually reply within 3 days
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Domain
- data, machine-learning
Research direction
Start in monai/data/utils.py at partition_dataset and its ratio-based size calculation around the linked lines; check the related partition_dataset_classes path as well. Reproduce the reported missing-item case, then run or add focused tests for ratio splits and class-based splits. Done means every input item appears in exactly one partition, including when rounded sizes would otherwise leave items out.
Written by the indexing model from the issue text.
Description
Describe the bug
The text below was written with AI assistance (Claude and GPT-6 Astra).
partition_dataset(data, ratios=...) rounds each partition size on its own (https://github.com/Project-MONAI/MONAI/blob/6920610c310200d683a3b00987a05893ccf1ca5f/monai/data/utils.py#L1217-L1224). When the rounded sizes add up to less than len(data), the remaining items are not in any partition, and nothing reports it. With three ratios this happens for about one length in five (0.8/0.1/0.1: 200 of the lengths 1 to 1000; 1/1/1: 334), and with five equal ratios up to two items are lost. partition_dataset_classes splits each class with the same function, so it can lose one item per class. Two-way splits are not affected.
I found this by reading and testing the code.
To Reproduce
from monai.data import partition_dataset
print(partition_dataset(list(range(10)), ratios=[1, 1, 1]))
data = list(range(63)) # e.g. the 63 training cases of MSD Task06_Lung
train, val, test = partition_dataset(data, ratios=[0.8, 0.1, 0.1], shuffle=True, seed=0)
print(len(train), len(val), len(test), "in no split:", sorted(set(data) - set(train + val + test)))
Output on dev (6920610):
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
50 6 6 in no split: [44]
The same happens for other Decathlon training-set sizes, e.g. 303 (Task08_HepaticVessel) and 484 (Task01_BrainTumour) with 0.8/0.1/0.1, 63 and 303 with 0.7/0.15/0.15, and 32 (Task05_Prostate) with five equal ratios, which loses two cases. In a Decathlon-style pipeline (load_decathlon_datalist -> partition_dataset -> CacheDataset -> DataLoader) with 63 cases, one case is never loaded by the train, validation or test split.
Expected behavior
Every item should be in exactly one partition, as in the docstring example ([0.6, 0.2, 0.2] on 5 items gives [[1, 2, 3], [4], [5]]). drop_last is documented as not applying to the ratio path.
Environment
MONAI 1.6.1rc0+50.g6920610c (dev), PyTorch 2.14.1+cpu, NumPy 2.5.4, Python 3.12.13, Linux.
Additional context
I have a small fix that gives the leftover items to the partitions whose sizes were rounded down the most and leaves every split that already covers all items unchanged, plus tests, and can open a PR.
I made this report and directed the investigation, with AI assistance from Claude and GPT-6 Astra.
- Dominant language
- Python
- Stars
- 8.8k
- Forks
- 1.7k
- Avg merge
- 6d 12h
- Merged PRs (30d)
- 14
Getting set up
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Project-MONAI/MONAI
-
partition_datasetPossibly taken @rtmalikian claimed this 1 day ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Project-MONAI/MONAI#9220 ·
Maintainers usually reply within 3 days
-
FocalLoss mean reduction is multiplied by the number of channels when ignore_index is setPossibly taken @mottopanikeiku claimed this 6 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Project-MONAI/MONAI#9214 ·
Maintainers usually reply within 3 days
-
DiNTS: missing graph-break regression test (follow-up to #9145)Possibly taken @nilapate claimed this 20 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
Project-MONAI/MONAI#9159 ·
Maintainers usually reply within 3 days
-
ProbMapProducer raises IndexError on numpy 2.x: SlidingPatchWSIDataset emits float locationsPossibly taken @nilapate claimed this 31 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Project-MONAI/MONAI#9135 · 1 comment ·
Maintainers usually reply within 3 days
-
RandGridPatch crashes for documented 0 or None patch_size entriesPossibly taken @Rajioba1 claimed this 87 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Project-MONAI/MONAI#9046 ·
Maintainers usually reply within 3 days
All issues in Project-MONAI/MONAI
Similar issues
-
app: scripts status: backlog type: documentation
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
netbox-community/netbox-scripts#68 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 91/100
marin-community/marin#10765 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 70/100
flathub/com.unity.UnityHub#230 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
namespace operations
Difficulty 1/5 Under an hour Newbie friendliness 63/100
EclipseFdn/open-vsx.org#14910 ·
Maintainers usually reply within 1 day