首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用`pytorch.manual_seed( seed )`时哪个种子?

使用`pytorch.manual_seed( seed )`时哪个种子?
EN

Stack Overflow用户
提问于 2021-08-18 08:11:59
回答 1查看 1.4K关注 0票数 0

我用ImageNet训练了一位模特。我得到了一个新的GPU,我也想在不同的GPU上训练相同的型号。

我想比较一下结果是否不同,因此我想使用torch.manual_seed(seed)

在阅读了docs seed.html之后,还不清楚我应该使用哪个数字作为参数种子。

如何选择种子参数?我可以拿10,100,或1000,甚至更多或更少,为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-18 17:40:04

如何选择种子参数?我可以拿10,100,或1000,甚至更多或更少,为什么?

您所指向的PyTorch文档页面除了声明种子是64位整数外,没有提到任何特殊的内容。

所以是的,1000是可以的。正如现代伪随机数生成器所期望的那样,您所依赖的伪随机序列的统计特性取决于种子的选择,而不是,而不是

对于大多数运行,您可能会重用上一次运行中的种子,实际情况是将随机种子作为命令行参数。在这些情况下,你必须想出一个全新的种子,你可以从你的头顶窥视一个,或者只是玩骰子得到它。

重要的是要有一个用于每次运行的种子的记录

好吧但是..。

话虽如此,许多人似乎对“猜测”某个任意数字的任务感到不自在。有两个(至少)共同的权宜之计,以一种看似适当的“随机”的方式获得一些种子。

第一种方法是使用操作系统官方源来实现真正(而不是伪随机)的随机比特。在Python中,这通常呈现为os.urandom()。因此,要将Python中的种子作为64位整数,可以使用如下代码:

代码语言:javascript
复制
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 (安全哈希算法)的版本:

代码语言:javascript
复制
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位。有时存在不正常的初始状态,但随机数库总是有责任将用户提供的任意种子扩展到行为良好的初始状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68828745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档