修复 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
,将角度 min
和 max
固定为特定值并使用 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)
<<<
我使用了一些类似于以下的代码 - 用于数据扩充:
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
,将角度 min
和 max
固定为特定值并使用 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)
<<<