设定了所有种子后每次结果还是不一样 pytorch可重复 可复现问题

查了能查的地方 看了很多解决方案 确实没有解决我遇到的这种情况的。

废了很长时间才发现问题,所以记录一下,可能和我一样不小心遇到了这样的问题导致的无法重现结果。

先说场景和问题:

首先我的代码里对所有的种子都是有设定的,但是还是无法复现之前的结果

def setup_seed(seed):
   torch.manual_seed(seed)
   os.environ['PYTHONHASHSEED'] = str(seed)
   torch.cuda.manual_seed(seed)
   torch.cuda.manual_seed_all(seed)
   np.random.seed(seed)
   random.seed(seed)
   torch.backends.cudnn.benchmark = False
   torch.backends.cudnn.deterministic = True
   torch.backends.cudnn.enabled = True
setup_seed(20)

我去查资料,发现可能是调用setup_seed函数的地方放在了调用自己其他文件的import指令之后,导致其他的py文件中可能有随机数而没有用种子限制。

但是我将setup_seed指令放在import input_data等我的其他文件之前,而是无法重现之前的结果。

后来不断定位,发现每次执行py文件,打印出来的相同batch(比如第一次执行的第一个batch和其对应的第二次执行的第一个batch)选取的数据是不一样的。

我使用的是这个函数来选择每一个batch的数据:

import random
random.seed(2019)
a=random.Random()
def generate_batch(n, batch_size):
    batch_index = a.sample(range(n), batch_size)
    return batch_index

发现问题了:我对random设定seed,但是对random.Random().sample()是不管用的,也就是说中间多了一层Random()后这个种子就传不到sample()中去了。于是我将代码改成了:

import random
random.seed(2019)

#a=random.Random()

def generate_batch(n, batch_size):
    batch_index = random.sample(range(n), batch_size)
    return batch_index

不必担心设定种子后,起不到每一个batch打乱一下顺序的作用,在每一次执行中,不同batch产生的随机数是不一样的。

而第二次第三次执行这个文件,产生的每一个batch都是和第一次对应batch相同的。

done

你可能感兴趣的:(python,NLP,pytorch)