-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
46 lines (35 loc) · 1.3 KB
/
Copy pathutils.py
File metadata and controls
46 lines (35 loc) · 1.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import random
from torch.utils.data import Subset
def split_dataset(dataset, val_split=0.2, seed=42):
"""Split dataset into train and validation sets by class.
Args:
dataset (RareDataset): Dataset instance.
val_split (float): Fraction of data to use for validation.
seed (int): Random seed for reproducibility.
Returns:
train_subset (Subset), val_subset (Subset)
"""
random.seed(seed)
# Separate indices by string label
neoplasia_indices = [
i for i, (_, label) in enumerate(dataset.samples) if label == "neoplasia"
]
ndbe_indices = [
i for i, (_, label) in enumerate(dataset.samples) if label == "nondysplastic"
]
# Shuffle both lists
random.shuffle(neoplasia_indices)
random.shuffle(ndbe_indices)
# Split function
def split(indices):
val_size = int(len(indices) * val_split)
return indices[val_size:], indices[:val_size] # train, val
# Split each class
train_neo, val_neo = split(neoplasia_indices)
train_ndbe, val_ndbe = split(ndbe_indices)
# Combine splits
train_indices = train_neo + train_ndbe
val_indices = val_neo + val_ndbe
random.shuffle(train_indices)
random.shuffle(val_indices)
return Subset(dataset, train_indices), Subset(dataset, val_indices)