Pytorch 如何在多次运行中重现RNN结果?

Pytorch 如何在多次运行中重现RNN结果?,pytorch,recurrent-neural-network,Pytorch,Recurrent Neural Network,我连续两次对同一输入调用同一个模型,但没有得到相同的结果,这个模型有nn.GRU层,所以我怀疑它有一些内部状态,应该在第二次运行之前释放 如何重置RNN隐藏状态,使其与最初加载的模型相同 更新: 一些背景: 我正在尝试从这里运行模型: 我正在呼叫generate: 这里是pytorch中使用随机生成器的一些代码: 我已放置(我正在CPU上运行代码): 在 毕竟是进口 我已经检查了两次跑步之间的GRU重量,它们是相同的: 我还检查了运行之间的logits和sample,并且logit

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

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

更新:

一些背景:

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

我正在呼叫
generate

这里是pytorch中使用随机生成器的一些代码:

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

毕竟是进口

我已经检查了两次跑步之间的GRU重量,它们是相同的:

我还检查了运行之间的
logits
sample
,并且
logits
是相同的,但是
sample
不是,所以@Andrew Naguib关于随机种子的说法似乎是正确的,但我不确定修复随机种子的代码应该放在哪里

更新2:

我已经将seed init放在
generate
中,现在结果是一致的:


我相信这可能与我的工作密切相关。为了确保结果的可再现性(),您必须按如下方式对火炬进行播种:

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

您可以使用
model.init\u 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
?我的问题是,对同一数据连续调用两次模型会产生不同的结果,如果我分别运行两次,则会得到相同的结果。更新了初始帖子。我不明白“我已将种子初始化放在生成中”是什么意思。你能解释一下吗?@mpourreza在
generate
函数中,似乎主代码已更改,链接不再有效。这是否回答了你的问题?
def init_hidden(self):
     # Initialize hidden and cell states
     return Variable(torch.zeros(num_layers, batch_size, hidden_size))