【个⼈思考】深度学习模型稳定可复现,设定随机种⼦⼤全
深度学习模型稳定可复现
深度学习这⼀块奥,稳定性奥,必须拿捏的死死的奥。
深度学习的⼀个项⽬,其中的随机性会⾮常的⼤
1 随机⽣成的模型参数,
2 可能是随机选取的训练样本顺序
3 随机dropout
以上等等,会使得模型具有⼀定的随机性,其实也并⾮完全算作坏事
因为模型性能的抖动能够让模型性能更⾼⼀些,可以报告跑出来的最⾼性能,是吧。
但是在某些阶段时,我们必须使得性能稳定,这样才可以明显的对⽐。
⽐如:
1 调整⼀些超参数
random python2 改进模型结构
3 优化算法
等等上述情况时候,会需要稳定模型。因为改进模型结构,可能就提升了0.5%-1%的性能,但是模型本⾝会有2%的性能抖动(更有甚者会有5%-10% FaceNet这种训练embedding的⽅式抖动会更⼤,triplet semihard loss详解,懂得都懂)。
本⾝具有抖动,在实验的时候,就不⼀定能验证出改进的有效性了。
⼤家不必笑,模型的改进往往就是这0.5%, 0.5%的累积
举个例⼦现在做⽬标检测任务的,每次在sota上提升个2%,就已经⾮常了不得了。
所以建议⼤家每次将模型固定好,进⾏优化的调整,确定最终模型之后,再进⾏随机化或者设定新的随机种⼦,这样可以再把模型性能抖动的更⾼。
当然其实现在的这么⼤的深度模型,很少存在性能抖动这么厉害的情况,但是相对⼩的模型上,情况还是很普遍的
下⾯关于tensorflow, pytorch, keras, random, numpy等库,给⼤家⼀些代码,⽅便确定随机数,以固定模型结果。
Tensorflow
import tensorflow as tf
seed = 42 # 可以⾃⼰设置
tf.set_random_seed(seed)
1
2
3
这⼀块主要是设置了graph级别的随机种⼦,⼤家也可以设置成为单个点确定的随机种⼦(但我觉得对⼀个模型来说,这样完全是没有任何必要的)
(tensorflow⽣成的是静态图,所以为graph级别的)
Keras & numpy
import tensorflow as tf
from tensorflow import keras as K
import numpy as np
seed = 42
np.random.seed(seed)
1
2
3
4
5
⼤家可能会觉得为什么没有keras的?其实本质原因是keras内核的random number generator⽤的就是numpy的。也就是说keras内部调⽤了numpy的随机数⽣成器,只要将numpy确定随机种⼦,那么keras的⽣成数就是确定的。
random
import random
seed = 42
random.seed(seed)
1
2
3
random是python⾃带的⼀个包,存在的操作会有random.choice等等,从⼀个list中随机取⼀个或多个元素。
hashseed
seed = 42
1
2
HASHSEED是 HASH映射函数时,保证每⼀次新的运⾏进程,对于⼀个相同的object⽣成的hash是相同的。
PyTorch
seed = 42
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # multi gpu
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.abled = False
1
2
3
4
5
6
7
额外介绍⼀下:最后三⾏使⽤了cudnn:
cuDNN 是英伟达专门为深度神经⽹络所开发出来的 GPU 加速库,针对卷积、池化等等常见操作做了⾮常多的底层优化,⽐⼀般的 GPU 程序要快很多。⼤多数深度学习框架都⽀持 cuDNN,PyTorch 也不例外。在使⽤ GPU 的时候,PyTorch 会默认使⽤ cuDNN 加速。其中:
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.abled = False 直接不使⽤cudnn底层加速。
这边给⼤家两份代码吧,分别是pytorch和tensorflow的所有相关随机数整理的函数,于主程序运⾏之前⼀次即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。