训练神经网络时的随机数生成seed的用法

1.在什么情况下我们需要生成随机数

        生活中时常遇到这些情况,需要生成验证码;或玩数字炸弹游戏需要生成随机数字;亦或用random来生成随机数比例,分配训练集、验证集、测试集;或者训练神经网络时某些参数需要随机初始化时都需要用到随机数。

        在训练神经网络时,很多时候我们会选择某一种分布来随机初始化我们的参数,而不是全部初始化为0,因为初始参数为0的神经元很难被激活,而且用不同的分布(甚至是同一种分布)来初始化参数时,模型的训练结果可能会存在一定的差异,因此为了保证模型结果的可复现,就需要保证每一次初始化的参数都不变,这就引入了随机种子。

2.随机种子不同的值代表什么

        我们会发现,可能不同的代码中,有时候seed=1,有时候seed=100,这不同的seed又代表什么东西呀!其实不同的值,你可以粗暴的认为随机种子背后就是一个巨大的字典,而这里的seed值就是这个字典的key,生成的随机数就是字典的value值,只要你key不变,value就不变。而既然是初始化,那其实选择哪个value都可以,只要每一次选择的value都一样就行,所以seed等于啥不重要,相同就行。

 3.使用随机种子生成随机数时需要注意的问题

        我们调什么包(random还是numpy.random)什么框架(tensorflow还是pytorch)来生成随机数,甚至是用CPU还是GPU来生成随机数,都要先用对应的方式生成生成器,如果用到其中的多种,则需要先定义好多种生成器,然后用同种生成器生成的随机数就是相同的(注意不同生成器生成的随机数不一定是相同的)。具体如下:

import random
import numpy as np
import tensorflow as tf
import torch

seed = 100
random.seed(seed)  # random
np.random.seed(seed)  # numpy
tf.random.set_seed(seed)  # tensorflow
torch.manual_seed(seed)  # torch+CPU
torch.cuda.manual_seed(seed)  # torch+GPU

        另外,注意对于for循环中生成随机数,如果在循环的外面定义生成器,循环内部生成随机数,则每次循环生成的随机数不一样,但是重跑这个循环则会生成一样的随机数序列;而如果两者都在循环内部,则每次循环都生成一样的随机数。如下所示:

for i in range(1, 4):
    random.seed(1)
    print(random.randrange(10))
执行一次输出结果:
2
2
2
执行第二次输出结果(多少次结果都一样):
2
2
2

random.seed(1)
for i in range(1, 4):
    print(random.randrange(10))
执行一次输出结果:
2
9
1
执行第二次输出结果(多少次结果都一样):
2
9
1

你可能感兴趣的:(pytorch,深度学习,tensorflow)