0

使用 pytroch.nn.RNN 我训练了具有 4 个输入神经元、2 个隐藏层的神经网络,每个神经网络有 8 个神经元和 2 个输出神经元。所以我训练了我的 RNN 模型,并在“非线性”选项中选择了 relu,那里一切都很好,我的结果也还可以。这是我的模型的完整代码。

class SimpleRNN(nn.Module):
def __init__(self,n_input, n_hidden, n_rnnlayers, n_outputs):
    super(SimpleRNN, self).__init__()

    torch.manual_seed(1)
    self.D = n_input
    self.M = n_hidden
    self.K = n_outputs
    #self.O = 3 
    self.L = n_rnnlayers

    # note batch_first = True
    # applies the convention that out data will be shape:
    # (num_samples, sequence length, num_features)
    # rather than :
    # (sequence_length, num_samples, num_features )

    self.rnn = nn.RNN(
        input_size = self.D,
        hidden_size = self.M,
        num_layers = self.L,
        nonlinearity = 'relu',
        batch_first = True,
        #dropout = 0.001
    )

     self.fc = nn.Linear(self.M,self.K)

     # self.fc = nn.Linear(self.M,self.O)
     # self.final = nn.Linear(self.O,self.K)

  def forward(self,data):
     # initial hidden states

     h0 = torch.zeros(self.L,data.size(0),self.M).to(device)

     # get RNN unit output
     # out is of size (N,T,M)
     # 2nd return value is hidden states at each hidden layer
     # we don't need those right now 

     out,_ = self.rnn(data,h0)

     out_h2, out_h1 = self.rnn(data,h0) # new adjustment
     # we only want h(T) at the final time step
     # N x M --> N x K

     out = self.fc(out[:,-1,:])
     out = self.fc(out_h2[:,-1,:])    #new adjustment
     return out,out_h1

现在根据我的项目要求,我必须使用上述内置模型的训练权重(我使用 pytroch 库制作)从头开始制作相同的 RNN 结构,我这样做了,但是当我应用 relu 激活函数时我的结果不匹配( relu(x) = max(0,x) )。但是当我在内置模型中使用“Tanh”激活并使用经过训练的权重时,我从头开始制作的模型给出的结果与内置模型相似。我知道有几种类型的“relu”激活函数,我尝试了很多来找出内置模型究竟使用了什么 relu,但我找不到任何答案,所以谁能告诉我 relu RNN pytorch 模块正在使用什么这样我也可以使用相同的方法并获得结果?

我也经历了几次,我无法运行torch._VF.rnn_relu。这是在源代码中给出的,我尽我所能让它运行,但是源代码中提到的库,即使在 colab 中安装了所有这些库后,我也无法在我的 google colab notebook 中导入它们。

它记录在源文件中, https://pytorch.org/docs/stable/_modules/torch/nn/modules/rnn.html#RNN

火炬._VF.rnn_relu

4

0 回答 0