为什么梯度下降在pytorch中无法如预期般运行

2024-10-01 17:35:54 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我从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}")

期望的输出是一个很小的损失值,模型训练后可以给出一个很好的预测。你知道吗


Tags: inimportselfformodeldefnpnn
1条回答
网友
1楼 · 发布于 2024-10-01 17:35:54

你的学习速度太快了。这个模型朝着正确的方向走了几步,但它不能降落在一个真正好的极小值上,从此以后就绕着它曲折前进。如果您尝试lr=0.001,您的性能会更好。这就是为什么在使用一阶优化器时,随着时间的推移衰减学习率通常是有用的。你知道吗

相关问题 更多 >

    热门问题