Python 损失不';t减少pytorch RNN的培训

Python 损失不';t减少pytorch RNN的培训,python,machine-learning,pytorch,rnn,Python,Machine Learning,Pytorch,Rnn,这是我为情感设计的RNN网络 class rnn(nn.Module): def __init__(self, input_size, hidden_size, output_size): super().__init__() self.hidden_size = hidden_size self.i2h = nn.Linear(input_size, hidden_size) self.h2o = nn.Linear(hi

这是我为情感设计的RNN网络

class rnn(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super().__init__()
        self.hidden_size = hidden_size
        self.i2h = nn.Linear(input_size, hidden_size)
        self.h2o = nn.Linear(hidden_size, output_size)
        self.h2h = nn.Linear(hidden_size , hidden_size)
        self.relu = nn.Tanh()
        self.sigmoid = nn.LogSigmoid()

    def forward(self, input, hidden):
        hidden_new = self.relu(self.i2h(input)+self.h2h(hidden))
        output = self.h2o(hidden)
        output = self.sigmoid(output)
        return output, hidden_new

    def init_hidden(self):
        return Variable(torch.zeros(1, self.hidden_size))
然后,我创建网络并将其训练为:

RNN = rnn(50, 50, 1)
learning_rate = 0.0005
criteria = nn.MSELoss()
optimizer = optim.Adam(RNN.parameters(), lr=learning_rate)
hidden = RNN.init_hidden()
epochs = 2
for epoch in range(epochs):
    for i in range(len(train['Phrase'])):
        input = convert_to_vectors(train['Phrase'][i])
        for j in range(len(input)):
            temp_input = Variable(torch.FloatTensor(input[j]))
            output, hidden = RNN(temp_input, hidden)
        temp_output = torch.FloatTensor([np.float64(train['Sentiment'][i])/4])
        loss = criteria( output, Variable(temp_output))
        loss.backward(retain_graph = True)
        if (i%20 == 0):
            print('Current loss is ', loss)
问题是网络的损耗并没有减少。它先增大,然后减小,依此类推。它一点也不稳定。我试着用较小的学习速度,但似乎没有帮助


为什么会发生这种情况?我如何纠正这种情况?

我认为有些事情可以给你一些帮助。 首先,在rnn类模块中,最好使用
“super(rnn,self)。\uuu init\uuuuuuuu()”
替换
“super()。\uuu init\uuuuu()”

其次,变量名应该与函数名一致,最好使用
“self.tanh=nn.tanh()”
替换
“self.relu=nn.tanh()”
。在rnn中,sigmoid函数应该是
1/(1+exp(-x))
,而不是logsigmoid函数。您应该使用
“self.sigmoid=nn.sigmoid()”
替换
“self.sigmoid=nn.LogSigmoid()”

第三,如果使用rnn进行分类,则输出应由softmax功能激活。因此,您应该添加两条语句,
“self.softmax=nn.softmax()”
“output=self.softmax(output)”

,您只需在执行
loss.backward()之后调用
optimizer.step()


顺便说一句,这说明了一个常见的误解:反向传播不是一种学习算法,它只是一种计算损耗梯度w.r.t.参数的酷方法。然后,您可以使用梯度下降的一些变体(例如,在您的例子Adam中,普通SGD、AdaGrad等)来更新给定梯度的权重。

请问您为什么不简单地使用torch.nn.RNN?@ZEWEICHU我想实现RNN表单scratch。出现此错误的原因是什么?您有
LogSigmoid
MSELoss
,是否正确?你能分享更多关于你的数据集吗?提供一个培训示例,以便我们能够理解。为什么您更喜欢
super(rnn,self)。\uuu init\uuu()
而不是
super()。\uu init\uuu()
?因为我已经习惯了python2。和super()。\uuuu init\uuuu()在python3中也可以。