查了能查的地方 看了很多解决方案 确实没有解决我遇到的这种情况的。
废了很长时间才发现问题,所以记录一下,可能和我一样不小心遇到了这样的问题导致的无法重现结果。
先说场景和问题:
首先我的代码里对所有的种子都是有设定的,但是还是无法复现之前的结果
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