partition_dataset with ratios leaves some items out of every partition
I maintainer di solito rispondono entro 3 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Ambito
- data, machine-learning
Direzione di ricerca
Inizia in monai/data/utils.py, in partition_dataset e nel relativo calcolo delle dimensioni basato sui rapporti intorno alle righe collegate; controlla anche il percorso correlato partition_dataset_classes. Riproduci il caso segnalato di elementi mancanti, quindi esegui o aggiungi test mirati per le suddivisioni basate sui rapporti e quelle basate sulle classi. Il lavoro è completato quando ogni elemento di input appare esattamente in una partizione, anche quando altrimenti le dimensioni arrotondate ne lascerebbero fuori alcuni.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- Python
- Stelle
- 8.8k
- Fork
- 1.7k
- Merge medio
- 5g 3h
- PR unite (30g)
- 13
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di Project-MONAI/MONAI
-
partition_datasetForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
Project-MONAI/MONAI#9220 ·
I maintainer di solito rispondono entro 3 giorni
-
FocalLoss mean reduction is multiplied by the number of channels when ignore_index is setForse già presa @mottopanikeiku l’ha presa 5 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
Project-MONAI/MONAI#9214 ·
I maintainer di solito rispondono entro 3 giorni
-
DiNTS: missing graph-break regression test (follow-up to #9145)Forse già presa @nilapate l’ha presa 18 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
Project-MONAI/MONAI#9159 ·
I maintainer di solito rispondono entro 3 giorni
-
ProbMapProducer raises IndexError on numpy 2.x: SlidingPatchWSIDataset emits float locationsForse già presa @nilapate l’ha presa 29 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
Project-MONAI/MONAI#9135 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
-
RandGridPatch crashes for documented 0 or None patch_size entriesForse già presa @Rajioba1 l’ha presa 86 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
Project-MONAI/MONAI#9046 ·
I maintainer di solito rispondono entro 3 giorni
Tutte le issue di Project-MONAI/MONAI
Issue simili
-
backlog
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 91/100
EchoTools/nevr-runtime#1108 ·
I maintainer di solito rispondono entro 1 giorno
-
parse names a key after a top-level multi() threshold Bitcoin Core v31.1 refuses as not validAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
btclib-org/btclib-wallet#587 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
Judgment-Pack/judgment-pack-spec#275 ·
I maintainer di solito rispondono entro 1 giorno