以下代码于主程序运行之前一次即可,亲测可行。
Tensorflow/Keras
def seed_tensorflow(seed=42):
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
tf.set_random_seed(seed)
Pytorch
def seed_torch(seed=42):
seed = int(seed)
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = False
解释: 1 torch.manual_seed(seed)是cpu情况下的seed 2 torch.cuda.manual_seed(seed)是单GPU情况下的seed 3 torch.cuda.manual_seed_all(seed)是多GPU情况下的seed 4 torch.backends.cudnn.deterministic = True和下述的benchmark搭配使用,确定卷积算法的类型。 5 torch.backends.cudnn.benchmark = False是cudnn使用确定性卷积,而不是使用优化提速型的卷积 (这个的意思是cudnn在开始时会对模型的每个卷积层使用合适的卷积算法加速,由于卷积网络的kernel大小,数量,计算方式等等,选用合适的卷积算法会使得后续计算加快) 速度会慢,但是可复现 6 torch.backends.cudnn.enabled = False 直接不使用cudnn底层加速。
参考:【个人思考】深度学习模型稳定可复现,设定随机种子大全
|