Pytorch之LinearRegression

任务内容:

  • 学习《线性单元和梯度下降》相关内容,拟合一维线性方程“y = 2? + 1”。
  • 输入:随机生成一系列 x,并根据公式“y = 2? + 1”得到对应的 y,对于 每个 y 添加一些细微的随机扰动使其稍微偏离原位置。将所有的(x,y)当作用于 拟合的样本点。 之后尝试使用线性单元或是pytorch框架中的线性层对以上数据点进行拟合, 得到一条拟合曲线。
  • 输出:所有的样本点与拟合的曲线截图
  • 参考 https://www.zybuluo.com/hanbingtao/note/448086

任务要求:

  • 样本点不少于 100 个
  • 尝试使用 pytorch 完成本次任务
  • 编写项目文档,放入项目运行截图
  • 如果有兴趣,可以尝试使用不同学习率与优化函数的搭配,观察拟合的过程

程序:

生成数据集:

import torch
import matplotlib.pyplot as plt
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 2 * x + 1 + torch.rand(x.size())
# torch.rand 均匀分布, torch.randn 标准正态分布


# 上面这行代码是制造出接近y=2x+1的数据集,后面加上torch.rand()函数制造噪音

# 画图
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

生成的数据集,如图:
在这里插入图片描述
完整程序,如下:

# !/usr/bin/python
# coding: utf8
import torch
from torch.autograd import Variable
import matplotlib.pyplot as plt
from torch import nn

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 2 * x   + 1 + torch.rand(x.size())
# torch.rand 均匀分布, torch.randn 标准正态分布


# 上面这行代码是制造出接近y=2x+1的数据集,后面加上torch.rand()函数制造噪音

# 画图
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()
class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = nn.Linear(1, 1)  # 输入和输出的维度都是1

    def forward(self, x):
        out = self.linear(x)
        return out


if torch.cuda.is_available():
    model = LinearRegression().cuda()
else:
    model = LinearRegression()

criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)

num_epochs = 1000
for epoch in range(num_epochs):
    if torch.cuda.is_available():
        inputs = Variable(x).cuda()
        target = Variable(y).cuda()
    else:
        inputs = Variable(x)
        target = Variable(y)

    # 向前传播
    out = model(inputs)
    loss = criterion(out, target)

    # 向后传播
    optimizer.zero_grad()  # 注意每次迭代都需要清零
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 20 == 0:
        print('Epoch[{}/{}], loss:{:.6f}'.format(epoch + 1, num_epochs, loss.data[0]))
model.eval()
if torch.cuda.is_available():
    predict = model(Variable(x).cuda())
    predict = predict.data.cpu().numpy()
else:
    predict = model(Variable(x))
    predict = predict.data.numpy()
plt.plot(x.numpy(), y.numpy(), 'ro', label='Original Data')
plt.plot(x.numpy(), predict, label='Fitting Line')
plt.show()

绘制的拟合曲线,如图:
在这里插入图片描述

输出结果:
/home/pt/miniconda3/envs/qyh/bin/python /home/pt/yaotl/PycharmProjects/linear.py
/home/pt/yaotl/PycharmProjects/linear.py:55: UserWarning: invalid index of a 0-dim tensor. This will be an error in PyTorch 0.5. Use tensor.item() to convert a 0-dim tensor to a Python number
  print('Epoch[{}/{}], loss:{:.6f}'.format(epoch + 1, num_epochs, loss.data[0]))
Epoch[20/1000], loss:2.819824
Epoch[40/1000], loss:1.439924
Epoch[60/1000], loss:0.791905
Epoch[80/1000], loss:0.477968
Epoch[100/1000], loss:0.318931
Epoch[120/1000], loss:0.233500
Epoch[140/1000], loss:0.184350
Epoch[160/1000], loss:0.154017
Epoch[180/1000], loss:0.134083
Epoch[200/1000], loss:0.120316
Epoch[220/1000], loss:0.110465
Epoch[240/1000], loss:0.103246
Epoch[260/1000], loss:0.097876
Epoch[280/1000], loss:0.093844
Epoch[300/1000], loss:0.090801
Epoch[320/1000], loss:0.088495
Epoch[340/1000], loss:0.086745
Epoch[360/1000], loss:0.085415
Epoch[380/1000], loss:0.084404
Epoch[400/1000], loss:0.083635
Epoch[420/1000], loss:0.083050
Epoch[440/1000], loss:0.082605
Epoch[460/1000], loss:0.082266
Epoch[480/1000], loss:0.082008
Epoch[500/1000], loss:0.081812
Epoch[520/1000], loss:0.081663
Epoch[540/1000], loss:0.081549
Epoch[560/1000], loss:0.081462
Epoch[580/1000], loss:0.081396
Epoch[600/1000], loss:0.081346
Epoch[620/1000], loss:0.081308
Epoch[640/1000], loss:0.081279
Epoch[660/1000], loss:0.081257
Epoch[680/1000], loss:0.081240
Epoch[700/1000], loss:0.081227
Epoch[720/1000], loss:0.081218
Epoch[740/1000], loss:0.081210
Epoch[760/1000], loss:0.081205
Epoch[780/1000], loss:0.081200
Epoch[800/1000], loss:0.081197
Epoch[820/1000], loss:0.081195
Epoch[840/1000], loss:0.081193
Epoch[860/1000], loss:0.081191
Epoch[880/1000], loss:0.081190
Epoch[900/1000], loss:0.081189
Epoch[920/1000], loss:0.081189
Epoch[940/1000], loss:0.081188
Epoch[960/1000], loss:0.081188
Epoch[980/1000], loss:0.081188
Epoch[1000/1000], loss:0.081187

Process finished with exit code 0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值