修复 torchvision 变换的随机种子

Fix random seed for torchvision transforms

我使用了一些类似于以下的代码 - 用于数据扩充:

    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 随机数生成结果,但我的问题是我可以做到保持上面的代码不变。

在数据集的 __getitem__ 中 class 创建一个 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

只是补充@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)
<<<