我使用以下代码从特定文件夹中读取数据集,并将其划分为训练和测试子集。我可以使用列表解析获得每个子集的所有数据和目标,但对于大数据来说非常慢。是否有其他快速方法可以做到这一点?
def train_test_dataset(dataset, test_split=0.20):
train_idx, test_idx = train_test_split(list(range(len(dataset))), test_size=test_split, stratify=dataset.targets)
datasets = {}
train_dataset = Subset(dataset, train_idx)
test_dataset = Subset(dataset, test_idx)
return train_dataset, test_dataset
dataset = dset.ImageFolder("/path_to_folder", transform = transform)
train_set, test_set = train_test_dataset(dataset)
train_data = [data for data, _ in train_set]
train_labels = [label for _, label in train_set]
我尝试过使用DataLoader这种方法,它更好,但也需要一些时间:PyTorch Datasets: Converting entire Dataset to NumPy
谢谢大家。
3条答案
按热度按时间relj7zay1#
您提供的链接中的answer基本上违背了拥有数据加载器的目的:数据加载器是用来将你的数据一个块一个块地加载到内存中的。2这有一个明显的优点,那就是不必在给定的时刻加载整个数据集。
从
ImageFolder
数据集中,您可以使用torch.utils.data.random_split
函数拆分数据:然后,您可以将这些数据集插入到单独的
DataLoader
s中:lmvvr0a82#
一种不需要为每个子集重新创建数据加载器的更简单的方法是使用Subset的getitem和len方法。类似于:
8fsztsew3#
对于标准图像数据集,您可以利用1.整个数据集的
Subset.dataset
访问器,2.子集的Subset.indices
索引存储,以及3.整个数据集的__getitem__
逻辑,您可以通过from inspect import getsource; getsource(Subset.dataset.__getitem__)
访问(其中Subset
应该是您实际的数据集对象)。