簡體   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