【问题标题】:How to split and load huge dataset that doesn't fit into memory into pytorch Dataloader?如何将不适合内存的巨大数据集拆分并加载到pytorch Dataloader中?
【发布时间】:2019-09-09 23:24:53
【问题描述】:

我正在训练一个深度学习模型,以便使用 Google 的 Colab 在 NIH 的 Chest Xray-14 数据集中对疾病进行多标签分类。考虑到大约 112k 的训练示例和有限的 RAM,我无法一次将所有图像加载到 Dataloader 中。

有没有办法将图像的路径存储在 pytorch 的 DataLoader 中,只读取训练期间当前迭代所需的图像,一旦迭代完成,图像就会从内存中卸载,依此类推,直到一个时期完成.

【问题讨论】:

    标签: machine-learning deep-learning computer-vision pytorch


    【解决方案1】:

    是的,ImageFolder 的默认行为是创建图像路径列表并仅在需要时加载实际图像。它不支持多类标签。但是,您可以编写自己的Dataset 来支持多标签,详情请参考ImageFolder 类。

    __init__ 期间,您构建了一个图像路径列表和一个相应的标签列表。只有在调用 __getitem__ 时才应加载图像。以下是此类数据集类的存根,详细信息将取决于文件的组织、图像类型和标签格式。

    class CustomDataset(torch.utils.data.Dataset):
        def __init__(self, args):
            """ Construct an indexed list of image paths and labels """
    
        def __getitem__(self, n):
            """ Load image n in the list of image paths and return it along with its label.
                In the case of multiclass the label will probably be a list of values"""
    
        def __len__(self):
            """ return the total number of images in this dataset """
    

    创建有效的数据集实例后,应创建DataLoader 的实例,并提供您的数据集作为参数。 DataLoader 负责对其数据集进行采样,即调用您编写的__getitem__ 方法,并将单个样本放入小批量中。它还处理并行加载并定义如何对索引进行采样。 DataLoader 本身不会存储超出其需要的内容。任何时候它应该在内存中保存的最大样本数是batch_size * num_workers(或者batch_size,如果num_workers == 0)。

    【讨论】:

    • 谢谢!它对我有用。我对pytorch的自定义数据集不熟悉。
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2012-02-05
    • 2018-09-07
    相关资源
    最近更新 更多