我用ImageNet训练了一位模特。我得到了一个新的GPU,我也想在不同的GPU上训练相同的型号。
我想比较一下结果是否不同,因此我想使用torch.manual_seed(seed)。
在阅读了docs seed.html之后,还不清楚我应该使用哪个数字作为参数种子。
如何选择种子参数?我可以拿10,100,或1000,甚至更多或更少,为什么?
发布于 2021-08-18 17:40:04
如何选择种子参数?我可以拿10,100,或1000,甚至更多或更少,为什么?
您所指向的PyTorch文档页面除了声明种子是64位整数外,没有提到任何特殊的内容。
所以是的,1000是可以的。正如现代伪随机数生成器所期望的那样,您所依赖的伪随机序列的统计特性取决于种子的选择,而不是,而不是。
对于大多数运行,您可能会重用上一次运行中的种子,实际情况是将随机种子作为命令行参数。在这些情况下,你必须想出一个全新的种子,你可以从你的头顶窥视一个,或者只是玩骰子得到它。
重要的是要有一个用于每次运行的种子的记录。
好吧但是..。
话虽如此,许多人似乎对“猜测”某个任意数字的任务感到不自在。有两个(至少)共同的权宜之计,以一种看似适当的“随机”的方式获得一些种子。
第一种方法是使用操作系统官方源来实现真正(而不是伪随机)的随机比特。在Python中,这通常呈现为os.urandom()。因此,要将Python中的种子作为64位整数,可以使用如下代码:
import functools
import os
# returns a list of 8 random small integers between 0 and 255
def get8RandomBytesFromOS():
r8 = os.urandom(8) # official OS entropy source
byteCodes = list(map(ord, r8.decode('Latin-1'))) # type conversion
return byteCodes
# make a single long integer from a list of 8 integers between 0 and 255
def getIntFromBytes(bs):
# force highest bit to 0 to avoid overflow
bs2 = [bs[0] if (bs[0] < 128) else (bs[0]-128)] + bs[1:8]
num = functools.reduce(lambda acc,n: acc*256+n, bs2)
return num
# Main user entry point:
def getRandomSeedFromOS():
rbs8 = get8RandomBytesFromOS()
return (getIntFromBytes(rbs8))第二个常见的权宜之计是散列包含当前日期和时间的字符串,可能带有前缀。对于Python,时间包括微秒。当人类用户启动脚本时,启动时间的微秒数可以说是随机的。我们可以使用这样的代码,使用SHA (安全哈希算法)的版本:
import hashlib
import datetime
def getRandomSeedFromTime():
prefix = 'dl.cs.univ-stackoverflow.edu'
timeString1 = str(datetime.datetime.now())
timeString2 = prefix + ' ' + timeString1
hash = hashlib.sha256(timeString2.encode('ascii'))
bytes = (hash.digest())[24:32] # 8 rightmost bytes of hash
byteCodes = list(map(ord, bytes.decode('Latin-1'))) # type conversion
return (getIntFromBytes(byteCodes))但是,再一次,1000基本上没问题。哈希时间串的想法,而不是仅仅以自时代以来的微秒数作为种子,很可能是因为一些早期的随机数发生器使用它们的种子作为对一个普通的、而不是那么大的全局序列的偏移。因此,如果您的程序天真地在没有散列的情况下以快速顺序接收两个种子,那么您的两个序列之间就有重叠的风险。幸运的是,伪随机数发生器现在比过去要好得多.
(增编-摘自评论)
请注意,种子是一个外围的东西。重要的是自动机的状态,它可以比种子大得多,因此就有了“种子”这个词。常用的梅森扭子方案有大约20,000位的内部状态,您不能要求用户提供20,000位。有时存在不正常的初始状态,但随机数库总是有责任将用户提供的任意种子扩展到行为良好的初始状态。
https://stackoverflow.com/questions/68828745
复制相似问题