【问题标题】:Best practices for generating a random seeds to seed Pytorch?生成随机种子以播种 Pytorch 的最佳实践?
【发布时间】:2019-08-12 02:08:07
【问题描述】:

我真正想要的是播种数据集和数据加载器。我正在改编代码:

https://gist.github.com/kevinzakka/d33bf8d6c7f06a9d8c76d97a7879f5cb

有人知道如何正确播种吗?在 Pytorch 中播种的最佳实践是什么。

老实说,我不知道是否有针对 GPU 与 CPU 的算法特定方式。我主要关心一般的 pytorch,并确保我的代码是“真正随机的”。特别是当它使用 GPU 时,我猜...


相关:


我的回答被删除了,下面是它的内容:

我不知道这是否最适合 pytorch,但这似乎是任何编程语言的最佳选择:


通常,您可以在任何编程语言中获得的最佳随机样本是通过操作系统生成的。在 Python 中,您可以使用 os 模块:

random_data = os.urandom(4)

通过这种方式,您可以获得加密安全的随机字节序列,您可以将其转换为数字数据类型以用作种子。

seed = int.from_bytes(random_data, byteorder="big")

编辑:sn-ps 代码仅适用于 Python 3


''' 大于 4 我得到这个错误:

ValueError: Seed 必须介于 0 和 2**32 - 1 之间 '''

RAND_SIZE = 4

【问题讨论】:

  • 您能否告诉我们official doc(他们有专门的页面)对此不清楚?我可以建议一个 PR 让它更清楚,但我现在没有看到任何问题。
  • @Berriel 似乎从我发布的答案中得到了一个“真实的”随机数。不是关于可重复性,但我发现我想要别的东西,我会更新/让你知道。

标签: pytorch


【解决方案1】:

看看https://pytorch.org/docs/stable/notes/randomness.html

这是我用的

def seed_everything(seed=42):
  random.seed(seed)
  os.environ['PYTHONHASHSEED'] = str(seed)
  np.random.seed(seed)
  torch.manual_seed(seed)
  torch.backends.cudnn.deterministic = True
  torch.backends.cudnn.benchmark = False

最后两个参数 (cudnn) 用于 GPU

【讨论】:

  • 你的seed=42 是做什么的?那是我们希望它具有确定性的行为吗?
  • 注意,我真正想要的是提供种子作为可选输入,然后当它具有确定性但它没有给出时,随机运行并让操作系统选择它......或者至少就是这样我现在拥有的。
  • 是的,种子用作种子,您的结果可通过不同的运行重现。您可以将其更改为生成不同的半随机数。
  • 您可以将seed=None 作为默认参数,并且如果seed 不是None,则只有if 才执行代码块
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多