Pytorch 如何在Pytork中执行RNN的推出

Pytorch 如何在Pytork中执行RNN的推出,pytorch,rnn,Pytorch,Rnn,我将RNN(具体来说是GRU)训练为语言模型,大致如下: 输入=[,tok1,tok2,tok3,…] 输出=[tok1,tok2,tok3,…] h0=所有零的初始状态 gru_输出,hn=gru(输入,h0) 成本=损失(gru_输出,输出) 基本上,在培训期间,有一个“指南”输入,在这里我输入从最后一步到当前步骤的目标标记(教师强制?) 现在这个RNN训练得很好,并且收敛了。但我不知道如何真正使用从头开始生成序列。由于gru需要一个显式的输入参数,我如何告诉它使用上一步自己的输出而不给它

我将RNN(具体来说是GRU)训练为语言模型,大致如下:

输入=[,tok1,tok2,tok3,…]
输出=[tok1,tok2,tok3,…]
h0=所有零的初始状态
gru_输出,hn=gru(输入,h0)
成本=损失(gru_输出,输出)
基本上,在培训期间,有一个“指南”输入,在这里我输入从最后一步到当前步骤的目标标记(教师强制?)

现在这个RNN训练得很好,并且收敛了。但我不知道如何真正使用从头开始生成序列。由于gru需要一个显式的输入参数,我如何告诉它使用上一步自己的输出而不给它输入

基本上我想要

roll\u out=gru(h0,步骤编号=10)
我不太明白怎么做。我是否需要在培训和使用过程中使用不同的API和手动推出

本要点中的完整代码(如果有任何用途):

谢谢


--evan

因此,如果您想通过生成随机文本来测试您的语言模型,只需选择一个随机标记作为第一个单词。在输入这个随机词之后,模型将生成一个输出,然后您刚刚生成的这个词将成为您的下一个输入,您将其输入到模型中,依此类推

下面是一些示例代码,它看起来是什么样子:

#测试模型
使用手电筒。无梯度()
以open('sample.txt','w')作为f:
#设置初始隐藏单元状态
状态=(火炬.0(层数,1,隐藏大小)。到(设备),
火炬。零(层数,1,隐藏大小)。到(设备))
#随机选择一个单词id
prob=火炬(声音大小)
输入=火炬。多项式(prob,num_samples=1)。取消查询(1)。到(设备)
对于范围内的i(num_样本):
#前向传播RNN
输出,状态=模型(输入,状态)
#示例一个单词id
prob=output.exp()
word_id=torch.多项式(prob,num_samples=1).item()
#用下一时间步的采样字id填充输入
输入。填充(单词\u id)
#文件写入
word=corpus.dictionary.idx2word[word\u id]
word='\n'如果word==''否则word+''
f、 写(字)
如果(i+1)%100==0:
打印('Sampled[{}/{}]个单词并保存为{}'。格式(i+1,num_samples,'sample.txt'))
也可以找到该模型的完整代码


您可能需要稍微修改代码,使其适用于您的模型。

因此您正在培训语言模型,但您不知道如何使用经过培训的模型创建文本序列?是的。有什么帮助吗?1您使用的这个函数是“模型”,它需要什么?它只需要一个输入和一个隐藏状态,对吗?这正是我的问题。我正在训练的代码“gru”接受一系列输入,而不是一个令牌。我不知道如何让经过训练的模型执行单步计算。我的工作只是不断地追加到输入(注意,输入,使用s)数组,每次都重新计算输出,这是非常低效的。我在问如何处理这个问题。你可以输入你想要的任何序列长度,模型对此没有限制。创建模型后固定的只是输入dim。