partition_dataset
Les mainteneurs répondent en général sous 3 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 72/100
Piste de recherche
Lisez la logique d'arrondi dans monai/data/utils.py autour des lignes 1217-1224 où partition_dataset calcule la taille de chaque partition, et reproduisez le bogue avec l'extrait de l'issue (p. ex. partition_dataset(list(range(10)), ratios=[1,1,1]) supprime des éléments). La correction devrait distribuer les éléments restants aux partitions les plus arrondies à la baisse, et le rapporteur dit qu'il a une correction et des tests prêts — commentez rapidement pour coordonner avant de commencer, car une PR peut apparaître. Terminé : chaque élément atterrit dans exactement une partition pour les ratios/lengths rapportés, les tests existants dans tests for partition_dataset passent toujours, et de nouveaux tests couvrent les cas d'éléments restants.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
When partition_dataset(data, ratios=...) splits a list, it computes every partition's size by rounding independently (see monai/data/utils.py, lines 1217–1224 at commit 6920610). If those rounded sizes add up to less than len(data), the extra items end up in no partition, and no warning or error is raised.
With three ratios this affects roughly one length in five: for 0.8/0.1/0.1 it happens for 200 of the lengths from 1 to 1000, and for 1/1/1 it happens for 334 of them. With five equal ratios, as many as two items can disappear. Because partition_dataset_classes applies the same function to each class, it can lose up to one item per class. Splits into two parts are not affected.
I found this by reading the code and then testing it.
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 thing occurs for other Decathlon training-set sizes. Examples: 303 cases (Task08_HepaticVessel) and 484 cases (Task01_BrainTumour) with 0.8/0.1/0.1; 63 and 303 cases with 0.7/0.15/0.15; and 32 cases (Task05_Prostate) with five equal ratios, where two cases are lost. 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
Each item should land in exactly one partition, as the docstring example shows ([0.6, 0.2, 0.2] on 5 items gives [[1, 2, 3], [4], [5]]). The documentation says drop_last does not apply when ratios are used.
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 ready. It hands the leftover items to the partitions that were rounded down the most, and splits that already cover every item stay unchanged. It comes with tests, and I can open a PR.
- Langage dominant
- Python
- Étoiles
- 8.8k
- Forks
- 1.7k
- Merge moyen
- 5 j 3 h
- PR mergées (30 j)
- 13
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_dataset with ratios leaves some items out of every partitionPeut-être pris @mottopanikeiku l’a pris il y a 3 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Project-MONAI/MONAI#9216 ·
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 3 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 16 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 27 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 84 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
-
The changelog workflow excludes otelbot but not dependabot, so every Dependabot pull request fails the changelog checkPeut-être pris @ocelotl l’a pris aujourd’hui. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
open-telemetry/opentelemetry-python#5825 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
cuga-project/cuga-agent#1020 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 70/100
microsoft/playwright#43640 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
stac-utils/stac-fastapi-elasticsearch-opensearch#965 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour