首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在训练pytorch RNN时损失不会减少

在训练pytorch RNN时损失不会减少
EN

Stack Overflow用户
提问于 2018-04-01 18:25:45
回答 2查看 1.7K关注 0票数 1

这是我为一种情感而设计的RNN网络。

代码语言:javascript
运行
AI代码解释
复制
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))

然后,创建并训练网络,如下所示:

代码语言:javascript
运行
AI代码解释
复制
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)

问题是网络的损失并没有减少。它增加,然后减少,以此类推。它一点也不稳定。我试着使用较小的学习率,但似乎没有帮助。

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

EN

回答 2

Stack Overflow用户

发布于 2018-06-25 11:03:32

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

顺便说一句,这说明了一个常见的误解:反向传播不是一种学习算法,它只是计算损失的梯度的一种很酷的方式。你的参数。然后使用梯度下降的一些变体(例如,简单的SGD,AdaGrad等,在你的例子中是Adam)来更新给定的梯度的权重。

票数 1
EN

Stack Overflow用户

发布于 2018-04-02 08:11:16

我想有些东西可能会对你有所帮助。首先,在rnn类模块中,最好用"super(rnn,self).__init__()"代替"super().__init__()"

第二,变量名要和函数一致,最好用"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)"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49601263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档