PyTorch 线性回归问题

PyTorch Linear Regression Issue

我正在尝试在 PyTorch 中实现一个简单的线性模型,可以给定 x 数据和 y 数据,然后训练它识别方程 y = mx + b。但是,每当我在训练后尝试测试我的模型时,它认为方程是 y=mx+2b。我将展示我的代码,希望有人能够发现问题。预先感谢您的帮助。

import torch

D_in = 500
D_out = 500
batch=200
model=torch.nn.Sequential(
     torch.nn.Linear(D_in,D_out),
)

接下来我创建一些数据并设置规则。让我们做 3x+4。

x_data=torch.rand(batch,D_in)
y_data=torch.randn(batch,D_out)

for i in range(batch):
    for j in range(D_in):
         y_data[i][j]=3*x_data[i][j]+5 # model thinks y=mx+c -> y=mx+2c?

loss_fn=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adam(model.parameters(),lr=0.001)

现在开始训练...

for epoch in range(500):
    y_pred=model(x_data)
    loss=loss_fn(y_pred,y_data)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

然后我用 Tensor/matrix 仅 1 测试我的模型。

test_data=torch.ones(batch,D_in) 
y_pred=model(test_data)

现在,我希望得到 3*1 + 4 = 7,但我的模型认为它是 11。

[[ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    ...,
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516]])

同样,如果我将规则更改为 y=3x+8,我的模型会猜测 19。所以,我不确定发生了什么。为什么要添加两次常量?顺便说一下,如果我只是将规则设置为 y=3x,我的模型会正确地推断出 3,而对于 y=mx,我的模型通常会正确地推断出 m。出于某种原因,常数项正在抛弃它。非常感谢任何解决此问题的帮助。谢谢!

您的网络学习时间不够长。 它得到一个具有 500 个特征的向量来描述单个数据。

您的网络必须将 500 个特征的大输入映射到包含 500 个值的输出。 你的训练数据是随机创建的,不像你的简单例子,所以我认为你只需要训练更长的时间来适应你的权重来使这个函数从 R^500 近似到 R^500。

如果我降低输入和输出维度并增加批量大小、学习率和训练步骤,我会得到预期的结果:

import torch

D_in = 100
D_out = 100
batch = 512

model=torch.nn.Sequential(
     torch.nn.Linear(D_in,D_out),
)

x_data=torch.rand(batch,D_in)
y_data=torch.randn(batch,D_out)
for i in range(batch):
    for j in range(D_in):
         y_data[i][j]=3*x_data[i][j]+4 # model thinks y=mx+c -> y=mx+2c?

loss_fn=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adam(model.parameters(),lr=0.01)

for epoch in range(10000):
    y_pred=model(x_data)
    loss=loss_fn(y_pred,y_data)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

test_data=torch.ones(batch,D_in)
y_pred=model(test_data)
print(y_pred)

如果您只想用一个输入近似 f(x) = 3x + 4,您还可以将 D_inD_out 设置为 1。