【问题标题】:Pytorch: How to get all data and targets for subsetsPytorch:如何获取子集的所有数据和目标
【发布时间】:2021-10-23 23:13:51
【问题描述】:

我使用以下代码从特定文件夹中读取数据集,并将其划分为训练和测试子集。我可以使用列表理解获取每个子集的所有数据和目标,但对于大数据来说非常慢。 有没有其他快速的方法可以做到这一点?

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

谢谢。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    您提供的链接中的answer 基本上违背了拥有数据加载器的目的:数据加载器旨在将您的数据逐块加载到内存中。这样做的明显优势是不必在给定时刻加载整个数据集。

    从您的ImageFolder 数据集中,您可以使用torch.utils.data.random_split 函数拆分数据:

    >>> def train_test_dataset(dataset, test_split=.2):
    ...    test_len = int(len(dataset)*test_split)
    ...    train_len = len(dataset) - test_len 
    ...    return random_split(dataset, [train_len, test_len])
    

    然后您可以将这些数据集插入单独的DataLoaders:

    >>> train_set, test_set = train_test_dataset(dataset)
    
    >>> train_dl = DataLoader(train_set, batch_size=16, shuffle=True)
    >>> test_dl  = DataLoader(train_set, batch_size=32 shuffle=False)
    

    【讨论】:

    • 谢谢。我知道使用 Torch random_split 的这种方法,但我使用了 sklearn 中的 train_test_split 来为每个子集获取平衡标签。我需要将所有数据和标签作为 NumPy 数组来执行一些操作,但是“DataLoader(train_set, batch_size=16, shuffle=True)”会从数据中给出一部分。
    • 您想对整个数组数据集执行什么操作?
    • 我尝试使用这个框架来做联邦学习:github.com/adap/flower/tree/main/examples/simulation_pytorch。在预处理中,对于 CIFAR10 数据集: trainset = torchvision.datasets.CIFAR10( root="./data", train=True, download=True, transform=transform )。可以使用 trainset.data 和 np.array(trainset.targets) 提取数据和目标,使用 np.array_split 将数据划分为多个分区。使用 ImageFolder,没有直接的方法来提取它们,但我可以使用列表理解,但速度很慢,而且内核有时会在大数据时重新启动。
    猜你喜欢
    • 2018-05-06
    • 2021-09-18
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多