在神经网络中,参数默认是进行随机初始化的。如果不设置的话每次训练时的初始化都是随机的,导致结果不确定。如果设置初始化,则每次初始化都是固定的。
# 实验初始化
if getattr(params, 'seed', -1) >= 0:
np.random.seed(params.seed)
torch.manual_seed(params.seed) # 为CPU设置种子用于生成随机数,以使得结果是确定的
if params.cuda:
torch.cuda.manual_seed(params.seed) # 为当前GPU设置随机种子
#如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。
或者
def set_seed(args):
random.seed(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)
if args.n_gpu > 0:
# 设置在所有 gpu 上生成随机数的种子。如果 CUDA 不可用,可以安全地调用这个函数; 在这种情况下,它会被默默地忽略
torch.cuda.manual_seed_all(args.seed)
# 一个 bool,如果为真,导致 cunn 只使用确定性卷积算法
torch.backends.cudnn.deterministic = True