文章目录

  • 为什么不一样
  • 如何使得他们一样



深度学习算法在开始训练的时候,都会对神经网络进行初始化,这个初始化是由随机数来确定的。我们如果使用同一个数据,同一个网络,同样的参数设置,由于随机初始化的不同,有可能会得到不一样的结果。其实深度学习就是这样设计的,其目的之一是为了获得一个泛化能力更强的结果来。如果想要每次的结果都一样,那么就需要设置随机数生成器。

为什么不一样

我们做个实验:

import numpy as np
from numpy.random import seed
print("不设置随机种子数,输出随机数")
for i in range(5):
	print(np.random.rand(1))
	
print("设置随机种子数,输出随机数")
for j in range(5):
	seed(1234) # 这里的seed的值随便设置
	print(np.random.rand(1))

输出结果:

python代码运行结果都一致 python每次运行结果不一样_tensorflow


不设置seed随机数,生成的随机数每次都是随机的。设置了seed随机数后,生成的随机数都是一样的。如果在深度学习中,不设置seed随机数,就意味着深度学习的输入每次的输入是不一样的。那么在深度学习中常见的利用随机数有很多地方,比如权值初始化、Dropout的正则化的随机性、优化器的随机性等等。一般来说,机器学习提倡使用不同的随机数,因为这样能够提高结果的泛化能力,即效果更好。但是有时候我们需要给定随机性。

如何使得他们一样

其实一种比较简单但费时的方法就是进行多次训练,比如对某个数据进行100次学习,然后将结果进行汇总平均,得到的结果正常情况下是相同的。如果依然有较大差别的话,首先考虑模型是否合适,或者更换模型。再就是对产生的随机数进行100%固定,这样就可以得到相同的结果了。

使用不同的库,随机数的设置不同,主要有下面几个设置:

  • python设置随机数
import random
random.seed(1234)
  • numpy设置随机数
from numpy.random import seed
seed(1234)
  • tensorflow1设置随机数
import tensorflow as tf
tf.random.set_random_seed(1234)
  • tensorflow2版本下的tensorflow1设置随机数
import tensorflow as tf
tf.compat.v1.set_random_seed(1234)
  • tensorflow下的keras设置随机数
import tensorflow as tf
tf.keras.utils.set_random_seed(1234)
  • tensorflow2设置随机数
import tensorflow as tf
tf.random.set_seed(1234)
  • pytorch设置随机数
import torch
torch.manual_seed(1234)