Net.cuda()
не влияет на генератор случайных чисел. Под капотом он просто вызывает cuda()
для всех параметров модели. Так что в основном это несколько вызовов на Tensor.cuda()
.
https://github.com/pytorch/pytorch/blob/ecd3c252b4da3056797f8a505c9ebe8d68db55c4/torch/nn/modules/module.py#L293
Мы можем проверить это, выполнив следующее:
torch.random.manual_seed(42)
x = torch.rand(1)
x.cuda()
y = torch.rand(1)
y.cuda()
print(x, y)
# the above prints the same as below
torch.random.manual_seed(42)
print(torch.rand(1), torch.rand(1))
Итак это означает, что Net()
использует генератор чисел для инициализации случайных весов в слоях.
torch.manual_seed(args.seed)
model = Net()
print(torch.rand(1))
# the below will print a different result
torch.manual_seed(args.seed)
model = Net()
torch.manual_seed(args.seed)
print(torch.rand(1))
Я бы рекомендовал сузить область управления случайными числами в исходном коде Python. Так что глобальный блок кода вне Модели не отвечает за то, как генерируются внутренние значения.
Проще говоря, передайте seed в качестве параметра __init__
модели.
model = Net(args.seed)
print(torch.rand(1))
Это заставит разработчиков всегда предоставлять начальное число для согласованности при использовании модели, и вы можете сделать параметр необязательным, если заполнение не выполняется ' т всегда необходимо.
Я бы избегал использования одного и того же семени все время, потому что вы научитесь использовать параметры, которые лучше всего работают с этим семенем.