为什么pytorch梯度下降无法正常工作

时间:2019-09-04 21:31:55

标签: python machine-learning pytorch linear-regression

所以我从Pytorch开始,尝试从一个简单的线性回归示例开始。实际上,我使用Pytorch进行了线性回归的简单实现来计算方程2 * x + 1,但是损耗保持在120,并且梯度下降存在问题,因为它不会收敛到较小的损耗值。我不知道为什么会这样,这让我发疯,因为我看不出有什么问题。其实这个例子应该很容易解决。这是我正在使用的代码

import torch
import torch.nn.functional as F
from torch.utils.data import TensorDataset, DataLoader
import numpy as np

X = np.array([i for i in np.arange(1, 20)]).reshape(-1, 1)
X = torch.tensor(X, dtype=torch.float32, requires_grad=True)
y = np.array([2*i+1 for i in np.arange(1, 20)]).reshape(-1, 1)
y = torch.tensor(y, dtype=torch.float32, requires_grad=True)
print(X.shape, y.shape)

class LR(torch.nn.Module):
    def __init__(self, n_features, n_hidden1, n_out):
        super(LR, self).__init__()
        self.linear = torch.nn.Linear(n_features, n_hidden1)

        self.predict = torch.nn.Linear(n_hidden1, n_out)

    def forward(self, x):
        x = F.relu(self.linear(x))
        x = self.predict(x)
        return x

model = LR(1, 10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
loss_fn = torch.nn.MSELoss()

def train(epochs=100):
    for e in range(epochs):

        pred = model(X)
        loss = loss_fn(pred, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        print(f"epoch: {e} and loss= {loss}")

期望的输出是一个很小的损耗值,并且模型训练以后可以提供良好的预测。

1 个答案:

答案 0 :(得分:0)

您的学习率太大。该模型朝着正确的方向迈出了几步,但它无法落在实际上不错的最小化器上,因此此后会出现曲折。如果改用lr=0.001,则性能会更好。这就是为什么在使用一阶优化器时逐渐降低学习速度的原因通常很有用。