Как применить пользовательское преобразование к моему пользовательскому набору данных 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]]))
Вот и все.