[英]Can I pre-transform images when training a deep learning model?
如果您曾經訓練過 model,您有時會看到 DataLoader(例如,我使用的是 pytorch Dataloader)可能是瓶頸,因為每次從數據集中獲取訓練樣本時,數據轉換都會即時執行。 這里我以torchvision.datasets中torchvision.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.