我是 pythorch 的新手,我想做的事情可能很容易,但我沒有在網上找到任何關于實際增加觀察次數而不將它們添加到影像(在我的情況下)檔案夾中的內容。我不想將影像添加到檔案夾中,因為我想嘗試不同的轉換,看看什么是最好的,而不是一直洗掉影像。所以我要做的是:
trf = transforms.Compose([
transforms.ToTensor(),
transforms.RandomRotation(degrees=45),
transforms.Grayscale(num_output_channels=1),
transforms.Normalize(0, 1),
transforms.functional.invert
])
train_data = torchvision.datasets.ImageFolder(root='./splitted_data/train', transform= trf)
print(len(train_data))
train = DataLoader(train_data, batch_size= batch_size, shuffle= True, num_workers= os.cpu_count())
這里的輸出將與所有檔案夾中的影像數量相同,這意味著對現有觀察應用了轉換,但這不是我想要實作的。我希望每個轉換都是一個單獨的副本。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
您可以實作一個轉換包裝器,它將按順序應用轉換并輸出每個單獨的轉換組合。Torchvision 的隨機變換的問題是在呼叫變換時對引數進行采樣。這使得很難重現相同的轉換。一種替代方法是堆疊或連接所有影像并在該堆疊上應用一次變換。
我將轉換管道分為三個部分:預處理和后處理轉換(后者不應該是隨機的,因為它是單獨應用的)。至于主要轉換,它們是您要從此處RandomRotation和 中創建組合的轉換串列Grayscale。
請注意,此解決方案在處理影響通道數(例如灰度)的變換時存在局限性。通常,您希望保持相同的張量維度,否則您的串聯和/或堆疊將失敗。
這是一個可能的解決方案:
class Combination(nn.Module):
def __init__(self, transforms, pre, post):
super().__init__()
self.transforms = transforms
self.pre = T.Compose(pre)
self.post = T.Compose(post)
def stacked_t(self, t, x):
lengths = [len(o) for o in x]
return t(torch.cat(x)).split(lengths)
def forward(self, x):
out = [self.pre(x)[None]]
for t in transforms:
out = self.stacked_t(t, out) # <- for every transform `t` we double
# the number of instances in` out`
out = [self.post(o)[0] for o in out]
return out
以下是輸入影像的示例用法:
>>> img

初始化變換組合:
>>> t = Combination(pre=[T.ToTensor()],
... post=[T.Normalize(0, 1),
... T.functional.invert],
... transforms=[T.RandomRotation(degrees=45),
... T.Grayscale(num_output_channels=1)])
以下是不同變換組合的預覽:
>>> img_ = t(img)
img_[0] |
img_[1] |
img_[2] |
img_[3] |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334188.html
下一篇:卷積神經網路模型預測沒有貓




