partition_dataset with ratios leaves some items out of every partition
Les mainteneurs répondent en général sous 3 jours
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Domaine
- data, machine-learning
Piste de recherche
Commencez dans monai/data/utils.py, au niveau de partition_dataset et de son calcul de taille basé sur les ratios autour des lignes liées ; vérifiez également le chemin associé partition_dataset_classes. Reproduisez le cas signalé d’éléments manquants, puis exécutez ou ajoutez des tests ciblés pour les répartitions par ratio et par classe. Le travail est terminé lorsque chaque élément d’entrée apparaît dans exactement une partition, y compris lorsque les tailles arrondies en laisseraient autrement de côté.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
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.
- Langage dominant
- Python
- Étoiles
- 8.8k
- Forks
- 1.7k
- Merge moyen
- 6 j 12 h
- PR mergées (30 j)
- 14
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de Project-MONAI/MONAI
-
partition_datasetPeut-être pris @rtmalikian l’a pris il y a 2 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Project-MONAI/MONAI#9220 ·
Les mainteneurs répondent en général sous 3 jours
-
FocalLoss mean reduction is multiplied by the number of channels when ignore_index is setPeut-être pris @mottopanikeiku l’a pris il y a 7 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Project-MONAI/MONAI#9214 ·
Les mainteneurs répondent en général sous 3 jours
-
DiNTS: missing graph-break regression test (follow-up to #9145)Peut-être pris @nilapate l’a pris il y a 20 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
Project-MONAI/MONAI#9159 ·
Les mainteneurs répondent en général sous 3 jours
-
ProbMapProducer raises IndexError on numpy 2.x: SlidingPatchWSIDataset emits float locationsPeut-être pris @nilapate l’a pris il y a 31 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Project-MONAI/MONAI#9135 · 1 commentaire ·
Les mainteneurs répondent en général sous 3 jours
-
RandGridPatch crashes for documented 0 or None patch_size entriesPeut-être pris @Rajioba1 l’a pris il y a 88 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Project-MONAI/MONAI#9046 ·
Les mainteneurs répondent en général sous 3 jours
Toutes les issues de Project-MONAI/MONAI
Issues similaires
-
enhancement help wanted
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Git-Hospital/githealthcheck#61 ·
Les mainteneurs répondent en général sous 1 jour
-
changelog investigate
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
ramnes/notion-sdk-py#433 ·
-
Partial method descriptors raise on class accessPeut-être pris @Gambit-Checkmate l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 19 jours
-
docs pkg:core
Difficulté 1/5 Moins d'une heure Accessibilité débutants 84/100
pydantic/pydantic-ai#11929 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
intake/intake-esm#789 ·