【问题标题】:How to apply custom transform to my custom dataset pytorch如何将自定义转换应用于我的自定义数据集 pytorch
【发布时间】:2021-11-26 09:33:55
【问题描述】:

我在 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.transforms(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]])

我不明白问题出在哪里, 谢谢

【问题讨论】:

    标签: python deep-learning pytorch spacy-transformers custom-dataset


    【解决方案1】:

    您的数据集 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 这是怎么做的
    • 哦!抱歉,@areobe,我忘记修改它,但这给出了相同的结果。你可以试试看。
    【解决方案2】:

    @samiogx,您没有应用转换。 "transformed.samples" 只为您提供输入不提供输出。 所以如果你想得到输出,应用

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

    就是这样。

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 2020-10-06
      • 2018-09-17
      • 1970-01-01
      • 2023-04-02
      • 2019-11-08
      • 2020-09-28
      • 2021-05-14
      • 2019-01-03
      相关资源
      最近更新 更多