转换未应用于 CustomDataset Pytorch

Transform not getting applied on CustomDataset Pytorch

我的图片文件夹结构如下:

root_dir
│
└───folder1
│   │   file011.png
│   │   file012.png
│   
└───folder2
|   │   file021.png
|   │   file022.png
|
└───folder2
    │   file031.png
    │   file032.png
...

现在我想在 PyTorch 中创建一个没有标签的 CustomeDataset(因为我将它用于 GAN) 所以我做了以下事情:

class CurrencyDataset(Dataset):
    '''
    Currency Dataset with no labels
    '''
    def __init__(self, type, transform):
        '''
        Parameters
            type : "Train" or "Test"
            transform : Transformations to be applied 
        '''
        root_dir = "indian-currency-notes-classifier/" 
        # Storing images in a list
        self.data = []
        self.transform = transform
        dir = os.path.join(root_dir, type)
        for note in os.listdir(dir) :
            note_dir = os.path.join(dir, note)
            for img_name in os.listdir(note_dir):
                img = io.imread(os.path.join(note_dir, img_name))
                self.data.append(img)

    def __len__(self):
        return len(self.data)
        
    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()
        x = self.data[idx]
        if self.transform :
            x = self.transform(x)
        return x

并使用了以下转换:

transform = transforms.Compose([
    transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
    transforms.RandomRotation(15),
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
])

train_ds = CurrencyDataset("Train", transform)

但是在检查张量的形状和值时,我发现没有应用转换

train_ds.data[0].shape
>> (1072, 1154, 3)

我对 PyTorch 有点陌生所以请让我知道如果我在这里做错了什么或者需要做些什么才能使其正确?

您忘记将 transform 对象指定为实例的属性。这反过来意味着 self.transform__getitem__ 函数中的计算结果为 None。只需在 __init__ 中添加以下内容:

self.transform = transform

此外,您没有使用 train_ds.data[0].shape 调用正确的函数 (__getitem__),而应该是 train_ds[0](换句话说:train_ds.__getitem__(0))。


最后,您的管道没有正确的转换顺序,因为 T.Resize 期望 torch.Tensor,而不是 PIL 图像:

transform = T.Compose([
    T.RandomRotation(15),
    T.Resize((224, 224)),
    T.ToTensor(),
    T.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])

我相信这应该是你转换的顺序。你能试试这个吗?

transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomRotation(15),
    transforms.ToTensor(),
    transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
])