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