繁体   English   中英

我可以在训练深度学习 model 时对图像进行预转换吗?

[英]Can I pre-transform images when training a deep learning model?

如果您曾经训练过 model,您有时会看到 DataLoader(例如,我使用的是 pytorch Dataloader)可能是瓶颈,因为每次从数据集中获取训练样本时,数据转换都会即时执行。 这里我以torchvision.datasetstorchvision.datasets的getitem func为例。

    path, target = self.samples[index]
    sample = self.loader(path)
    if self.transform is not None:
        sample = self.transform(sample)
    if self.target_transform is not None:
        target = self.target_transform(target)

    return sample, target

我想知道我们是否可以提前将图像(例如 ImageNet)预处理为张量并保存到磁盘。 然后我们修改__getitem__ function 以直接从磁盘获取这些张量。 这种方法的效率如何? 以前有人试过这个解决方案吗?

我认为也许从磁盘加载会增加负担,并可能成为一个新的瓶颈(而不是我们之前的数据转换)。 另一件事是大小,例如,一个 ImageNet 图像在使用标准转换保存为张量时需要 74 MB:

transforms.Compose([
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
            ])

两种方法:

1)如果您有足够的memory,您可以缓存数据集并稍后使用。 限制是您在第一个时期被限制为0个工人。 像这样的东西。

class ImageNetDataset(Dataset):
    def __init__(self, use_cache=False):
        self.cached_data = []
        self.use_cache = use_cache
        
    def __getitem__(self, index):
        if not self.use_cache:
            x = self.data[index] 
            self.cached_data.append(x)
        else:
            x = self.cached_data[index]
        return x
    
    def set_use_cache(self, use_cache):
        if use_cache:
            self.cached_data = torch.stack(self.cached_data)
        else:
            self.cached_data = []
        self.use_cache = use_cache

2)预先转换数据集并将其保存到磁盘。 您需要为此单独编写一个小代码。 并在训练期间使用此文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM