随机性:
深度学习的一个项目,其中的随机性会非常的大,比如以下因素:
- 随机生成的模型参数,
- 可能是随机选取的训练样本顺序
- 随机dropout
这些并非坏事,因为随机性会让我们的模型更加的健壮,提高泛化性能,但是在另一些阶段,希望模型性能稳定,然后才能得到明显的对比,比如:
- 调整一些超参数
- 改进模型结构
- 优化算法
在神经网络中,参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,在pytorch中,通过设置随机数种子可以达到这个目的。
def set_seed(args):
random.seed(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)#为CPU设置随机种子
if args.n_gpu > 0:
torch.cuda.manual_seed_all(args.seed)#为GPU设置随机种子
else:
torch.cuda.manual_seed(args.seed)#单GPU设置
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = False
- torch.backends.cudnn.deterministic = True和下述的benchmark搭配使用,确定卷积算法的类型。
- torch.backends.cudnn.benchmark = False是cudnn使用确定性卷积,而不是使用优化提速型的卷积
(这个的意思是cudnn在开始时会对模型的每个卷积层使用合适的卷积算法加速,由于卷积网络的kernel大小,数量,计算方式等等,选用合适的卷积算法会使得后续计算加快) 速度会慢,但是可复现- torch.backends.cudnn.enabled = False 直接不使用cudnn底层加速。
如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。
在需要生成随机数据的实验中,每次实验都需要生成数据。设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致了,有利于实验的比较和改进。
- 并且通过设置随机种子之后,同样可以影响到 网络中 dropout 的随机性,pytorch answer
- 还有就是数据加载的时候 Dataloader 的 shuffle=False 的参数设置,等等。