使用 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