1、torch.manual_seed(seed) 功能描述
设置 CPU 生成随机数的种子 ,方便下次复现实验结果。
为 CPU 设置种子用于生成随机数,以使得结果是确定的。
当你设置一个随机种子时,接下来的随机算法生成数根据当前的随机种子按照一定规律生成。
随机种子作用域是在设置时到下一次设置时。要想重复实验结果,设置同样随机种子即可。
2、语法
torch.manual_seed(seed) → torch._C.Generator
3、参数
seed,int类型,是种子 – CPU生成随机数的种子。取值范围为 [-0x8000000000000000, 0xffffffffffffffff] ,十进制是 [-9223372036854775808, 18446744073709551615] ,超出该范围将触发 RuntimeError 报错。
4、返回
返回一个torch.Generator对象。
1、为CPU中设置种子,生成随机数:
torch.manual_seed(number)
2、为特定GPU设置种子,生成随机数:
torch.cuda.manual_seed(number)
3、为所有GPU设置种子,生成随机数:
# 如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。
torch.cuda.manual_seed_all(number)
使用原因 :
在需要生成随机数据的实验中,每次实验都需要生成数据。设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致了,有利于实验的比较和改进。使得每次运行该 .py 文件时生成的随机数相同。
# test.py
import torch
print(torch.rand(1)) # 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
每次运行test.py的输出结果都不相同:
tensor([0.4351])
tensor([0.3651])
tensor([0.7465])
# test.py
import torch
# 设置随机种子
torch.manual_seed(0)
# 生成随机数
print(torch.rand(1)) # 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
每次运行 test.py 的输出结果都是一样:
tensor([0.4963])
改变随机种子的值,设为 1 :
# test.py
import torch
torch.manual_seed(1)
print(torch.rand(1)) # 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
每次运行 test.py,输出结果都是:
tensor([0.7576])
改变随机种子的值,设为 5 :
# test.py
import torch
torch.manual_seed(5)
print(torch.rand(1)) # 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
每次运行 test.py,输出结果都是:
tensor([0.8303])
可见不同的随机种子能够生成不同的随机数。
但只要随机种子一样,每次运行代码都会生成该种子下的随机数。
# test.py
import torch
torch.manual_seed(0)
print(torch.rand(1))
print(torch.rand(1))
输出结果:
tensor([0.4963])
tensor([0.7682])
可以看到两次打印 torch.rand(1) 函数生成的结果是不一样的,但如果你再运行test.py,还是会打印:
tensor([0.4963])
tensor([0.7682])
# test.py
import torch
torch.manual_seed(0)
print(torch.rand(1))
torch.manual_seed(0)
print(torch.rand(1))
输出结果:
tensor([0.4963])
tensor([0.4963]
作用
torch.manual_seed() 为CPU设置种子,保证每次的随机初始化都是相同的,从而保证结果可以复现。
torch.cuda.manual_seed()为GPU设置种子,作用同上
torch.cuda.manual_seed_all()为所有GPU设置种子(适用于多GPU时),作用同上
参考:【PyTorch】torch.manual_seed() 详解_想变厉害的大白菜的博客-CSDN博客_torch.manual_seed