Как применить пользовательское преобразование к моему пользовательскому набору данных pytorch

Я создаю свой собственный набор данных в проекте pytorch, и мне нужно добавить гауссовский шум в свой набор данных с помощью преобразований. Мой набор данных представляет собой двумерный массив 1 и -1. Я делаю следующее:

      class AddGaussianNoise(object): 

    def __init__(self, mean, std):
        self.std = std
        self.mean = mean
        
    def __call__(self, tensor):
        return tensor + torch.randn(tensor.size()) * self.std + self.mean
    
    def __repr__(self):
        return self.__class__.__name__ + '(mean={0}, std={1})'.format(self.mean, self.std)   
 

class Normalize(object):
 
    def __init__(self, mean, std):
        self.std = std
        self.mean = mean
        
    def __call__(self, tensor):
        
        return (tensor.sub_(self.mean)).div(self.std)
    
    def __repr__(self):
        return self.__class__.__name__ + '(mean={0}, std={1})'.format(self.mean, self.std)  

class MyDataset(Dataset):

    def __init__(self, data, transforms = None):
        self.samples = data
        self.transforms= transforms
    def __len__(self):
        return len(self.samples)


    def __getitem__(self, idx):
        sample = self.samples[idx]
        sample = self.transformation(sample)
        return sample

Чтобы проверить результаты:

      data =np.array([[-1,-1,1,-1],[-1,1,-1,-1],[1,-1,-1,-1],[-1,-1,-1,1]])
transformed = NumbersDataset(data,transforms.Compose([AddGaussianNoise(0.5, 0.5),
                                Normalize(0.5,0.5),
                               ]))
print(transformed.samples)

transformes  [[-1 -1  1 -1]
 [-1  1 -1 -1]
 [ 1 -1 -1 -1]
 [-1 -1 -1  1]]

Ничего не произошло. Но настраиваемые преобразования хорошо работают вне класса MyDataset:

      def add_noise(inputs, mean, std):
    transform = transforms.Compose([AddGaussianNoise(0.5, 0.5),
                                    Normalize(0.5,0.5),
                                   ])
    return transform(inputs)

tensor([[-2.0190, -2.7867,  1.8440, -1.1421],
    [-2.3795,  2.2529,  0.0627, -3.0331],
    [ 2.4760, -1.5299, -2.2118, -0.9087],
    [-1.7003,  0.1757, -1.9060,  2.0312]])

Я не понимаю, в чем проблема, спасибо

2 ответа

Ваш метод getitem набора данных использует преобразование вместо собственного объекта преобразования.

      class MyDataset(Dataset):

    def __init__(self, data, transforms = None):
        self.samples = data
        self.transforms= transforms

    def __len__(self):
        return len(self.samples)

    def __getitem__(self, idx):
        sample = self.samples[idx]
        if self.transforms:
            sample = self.transforms(sample)
        return sample

@samiogx, вы не применяете преобразование. «transformed.samples» дает вам только входные данные , а не выходные данные . Итак, если вы хотите получить результат, примените

      transform(np.array([[-1,-1,1,-1],[-1,1,-1,-1],[1,-1,-1,-1],[-1,-1,-1,1]]))

Вот и все.

Другие вопросы по тегам