首页 文章

PyTorch线性回归问题

提问于
浏览
1

我试图在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()

然后我用一个只有1的Tensor /矩阵测试我的模型 .

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 . 出于某种原因,常数术语将其抛弃 . 非常感谢任何帮助解决这个问题 . 谢谢!

1 回答

  • 2

    您的网络学习时间不够长 . 它获得了一个具有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 .

相关问题