从RNN向中间连接提供中间隐藏状态

时间:2020-08-05 19:22:09

标签: python pytorch recurrent-neural-network

我正在尝试创建一个可以基于一组功能预测概率分布的模型。功能集可能有多个更新,这些更新可能会纠正分布。我能够用一个简单的功能输入和一个分配输出创建一个基本的神经网络,而没有太多问题,但是添加了更新系统后,我选择了将RNN附加到工作模型上。

在没有太多细节的情况下,我想使RNN在每个更新步骤(每组功能)输出一个隐藏状态。换句话说,一组特征可以是N个长度。 RNN取(L,N)和输出(L,M),其中L是序列长度,M是隐藏层大小。然后,以下神经网络取(L,M)并创建L个分布。我需要中间结果,因为我想计算每个分布与实际分布之间的损失。这样,当我将L从1增加到15时,模型将变得越来越准确。

以下是我在模型课程中所拥有的。如您所见,当我分解rnn输出然后将其反馈回神经网络时,它的效率极低。这两个问题是列表操作效率低下,后者是损失函数计算更加复杂的问题。我将不得不复制L个目标分布,最后计算反向传播。有没有更好的方法来完成所有这些操作?

def __init__(self):
    super(NN, self).__init__()
    self.out_length = int(max_num/step+2)
    
    self.rnn = nn.RNN(13, 64)
    
    self.network = nn.Sequential(nn.Linear(64, 64),
                                 nn.ELU(),
                                 nn.Linear(64, 64),
                                 nn.ELU(),
                                 nn.Linear(64, 64),
                                 nn.ELU(),
                                 nn.Linear(64, self.out_length),
                                 nn.ELU(),
                                 nn.Softmax()
                                )
    print(self)

def forward(self, features):
    rnn_output, hiddens = self.rnn(features.float(), None)
    rnn_output, lengths = pad_packed_sequence(rnn_output, batch_first=True)
    print(rnn_output.shape)
    print(lengths)
    output = [self.network(rnn_output[i,:,:]) for i in range(len(lengths))]
    return output

0 个答案:

没有答案
相关问题