神经网络学习小记录75——Keras设置随机种子Seed来保证训练结果唯一
- 学习前言
- 为什么每次训练结果不同
- 什么是随机种子
- 训练中设置随机种子
学习前言
好多同学每次训练结果不同,最大的指标可能会差到3-4%这样,这是因为随机种子没有设定导致的,我们一起看看怎么设定吧。
为什么每次训练结果不同
模型训练中存在很多随机值,最常见的有:
1、随机权重,网络有些部分的权重没有预训练,它的值则是随机初始化的,每次随机初始化不同会导致结果不同。
2、随机数据增强,一般来讲网络训练会进行数据增强,特别是少量数据的情况下,数据增强一般会随机变化光照、对比度、扭曲等,也会导致结果不同。
3、随机数据读取,喂入训练数据的顺序也会影响结果。
……
应该还有别的随机值,这里不一一列出,这些随机都很容易影响网络的训练结果。
如果能够固定权重、固定数据增强情况、固定数据读取顺序,网络理论上每一次独立训练的结果都是一样的。
什么是随机种子
随机种子(Random Seed)是计算机专业术语。一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
按照这个理解,我们如果可以设置最初的 真随机数(种子),那么后面出现的随机数将会是固定序列。
以random库为例,我们使用如下的代码,前两次为随机生成,后两次为设置随机数生成器种子后生成。
import random
# 生成随机整数
print("第一次随机生成")
print(random.randint(1,100))
print(random.randint(1,100))
# 生成随机整数
print("第二次随机生成")
print(random.randint(1,100))
print(random.randint(1,100))
# 设置随机数生成器种子
random.seed(11)
# 生成随机整数
print("第一次设定种子后随机生成")
print(random.randint(1,100))
print(random.randint(1,100))
# 重置随机数生成器种子
random.seed(11)
# 生成随机整数
print("第二次设定种子后随机生成")
print(random.randint(1,100))
print(random.randint(1,100))
结果如下,前两次随机生成的序列不同,后两次设定种子后随机生成的序列相同:
第一次随机生成
66
37
第二次随机生成
93
56
第一次设定种子后随机生成
58
72
第二次设定种子后随机生成
58
72
训练中设置随机种子
一般训练会用到多个库包含有关random的内容。
在keras构建的网络中,一般都是使用下面三个库来获得随机数,我们需要对三个库都设置随机种子:
1、tensorflow库;
2、numpy库;
3、random库。
这是因为keras一般基于tensorflow1,我们对tensorflow进行random随机数设置就相当于对keras进行随机数设置。
在这里写了一个函数,:
#---------------------------------------------------#
# 设置种子
#---------------------------------------------------#
def seed_everything(seed=11):
random.seed(seed)
np.random.seed(seed)
tf.set_random_seed(seed)
只需要在所有初始化前,调用该seed初始化函数即可。