【问题标题】:Fix random seed for torchvision transforms修复 torchvision 变换的随机种子
【发布时间】:2020-04-18 08:02:11
【问题描述】:

我使用一些类似于以下的代码 - 用于数据增强:

    from torchvision import transforms

    #...

    augmentation = transforms.Compose([
        transforms.RandomApply([
            transforms.RandomRotation([-30, 30])
        ], p=0.5),
        transforms.RandomHorizontalFlip(p=0.5),
    ])

在我的测试期间,我想在每次更改模型训练设置时修复随机值以重现相同的随机参数。我该怎么做?

我想做类似于np.random.seed(0) 的事情,所以每次我第一次用概率调用随机函数时,它都会以相同的旋转角度和概率运行。换句话说,如果我根本不更改代码,当我重新运行它时,它必须重现相同的结果。

或者,我可以分离变换,使用p=1,将角度minmax 固定为特定值并使用numpy 随机数来生成结果,但我的问题是我是否可以保持上面的代码不变.

【问题讨论】:

    标签: python deep-learning neural-network pytorch torchvision


    【解决方案1】:

    在您的数据集类的 __getitem__ 中创建一个 numpy 随机种子。

    def __getitem__(self, index):      
        img = io.imread(self.labels.iloc[index,0])
        target = self.labels.iloc[index,1]
    
        seed = np.random.randint(2147483647) # make a seed with numpy generator 
        random.seed(seed) # apply this seed to img transforms
        if self.transform is not None:
            img = self.transform(img)
    
        random.seed(seed) # apply this seed to target transforms
        if self.target_transform is not None:
            target = self.target_transform(target)
    
        return img, target
    

    【讨论】:

    • 谢谢,random 模块可以正常工作(这并不奇怪,因为我以前没有使用过它)并且图像在视觉上看起来与固定种子相同,因此概率和随机都可以使用固定结果!跨度>
    【解决方案2】:

    只是补充@conv3d 的答案。因为它被放在这个 gh issue 上。将两个种子分配一起使用很重要,因为并非所有转换都是统一的。

    random.seed(seed)
    torch.manual_seed(seed)
    

    所以代码是这样的:

    >>>
    seed = np.random.randint(2147483647) 
    random.seed(seed) 
    torch.manual_seed(seed)
    if self.transform is not None:
        img = self.transform(img)
    <<<
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2018-05-30
      • 2021-07-28
      • 2016-08-12
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多