【问题标题】:How to reproduce RNN results on several runs?如何在多次运行中重现 RNN 结果?
【发布时间】:2019-05-17 16:26:48
【问题描述】:

我连续两次在相同的输入上调用相同的模型,但我没有得到相同的结果,这个模型有nn.GRU 层,所以我怀疑它有一些内部状态应该在第二次运行之前释放?

如何重置 RNN 隐藏状态以使其与最初加载模型时相同?

更新:

一些上下文:

我正在尝试从这里运行模型:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L93

我正在打电话给generate

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L148

这里实际上有一些在 pytorch 中使用随机生成器的代码:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L200

https://github.com/erogol/WaveRNN/blob/master/utils/distribution.py#L110

https://github.com/erogol/WaveRNN/blob/master/utils/distribution.py#L129

我已放置(我正在 CPU 上运行代码):

torch.manual_seed(0)
torch.cuda.manual_seed_all(0)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(0)

https://github.com/erogol/WaveRNN/blob/master/utils/distribution.py

在所有导入之后。

我检查了运行之间的 GRU 权重,它们是相同的:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L153

我还检查了运行之间的logitssamplelogits 相同但sample 不同,所以@Andrew Naguib 似乎对随机播种是正确的,但我不确定代码在哪里应该放置修复随机种子吗?

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L200

更新 2:

我已将种子 init 放入 generate,现在结果一致:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L148

【问题讨论】:

标签: pytorch recurrent-neural-network


【解决方案1】:

我相信这可能与Random Seeding 高度相关。为确保结果可重现 (as stated by them),您必须像这样播种 torch

import torch
torch.manual_seed(0)

还有CuDNN 模块。

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

如果你使用numpy,你也可以这样做:

import numpy as np
np.random.seed(0)

但是,他们警告您:

确定性模式可能会对性能产生影响,具体取决于您的模型。


我经常使用的一个建议的脚本在重现结果方面效果很好:

# imports
import numpy as np
import random
import torch
# ...
""" Set Random Seed """
if args.random_seed is not None:
    """Following seeding lines of code are to ensure reproducible results 
       Seeding the two pseudorandom number generators involved in PyTorch"""
    random.seed(args.random_seed)
    np.random.seed(args.random_seed)
    torch.manual_seed(args.random_seed)
    # https://pytorch.org/docs/master/notes/randomness.html#cudnn
    if not args.cpu_only:
        torch.cuda.manual_seed(args.random_seed)
        cudnn.deterministic = True
        cudnn.benchmark = False

【讨论】:

  • 我的问题是对相同数据连续调用模型 2 次会产生不同的结果,如果我分别运行两次,我会得到相同的结果。
  • 更新了初始帖子。
【解决方案2】:

您可以使用model.init_hidden() 重置RNN隐藏状态。

def init_hidden(self):
     # Initialize hidden and cell states
     return Variable(torch.zeros(num_layers, batch_size, hidden_size))

因此,在下次对相同数据调用相同模型之前,您可以调用 model.init_hidden() 将隐藏状态和单元状态重置为初始值。

这将清除历史,换句话说,就是模型第一次在数据上运行后学习到的权重。

【讨论】:

  • 模型的类型应该是什么?派生自nn.Module的类?
猜你喜欢
  • 1970-01-01
  • 2019-06-15
  • 2021-08-26
  • 1970-01-01
  • 2020-05-19
  • 2017-05-15
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
相关资源
最近更新 更多