您的位置:首页 > 其它

Pytorch实现一元线性回归

2020-02-01 04:53 1251 查看

最近用python在学线性回归与梯度下降算法,也有了解一些关于pytorch的内容,现在用pytorch实现一个简单的线性回归

手上有用pytorch实现简单梯度下降的代码文件,以此为基础,也去找了一些关于线性回归的资料,中途出了一些低级错误并且找了很久的解决办法(我太垃圾了),终于还是实现了正确的线性回归,现在把代码贴上来

pytorch+linear_regression.py

import torch
from torch.autograd import Variable
import torch.nn as nn
import matplotlib.pyplot as plt

x = torch.linspace(0, 100).type(torch.FloatTensor).reshape(-1,1)
# 在0~100中取100个浮点数作为x值
rand = torch.randn(100).reshape(-1,1) * 10
# 生成浮点数作为噪音,便于进行线性回归
y = x + rand                     # 目标值

plt.figure(figsize=(10,8))
# 设置窗口大小为10*8 inch
plt.plot(x.numpy(), y.numpy(), 'o', label='Original data')
# 用numpy()将tensor张量转换为numpy
plt.title('Original data')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

model = Linear(1,1)
criterion = nn.MSELoss()         # 设置判定准则
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
# lr指学习率,要适中,太大了可能造成无法回归而报错
loss = torch.nn.MSELoss()

for step in range(1000):
x = Variable(x)
y = Variable(y)
out = model(x)              # 获取模型的输出值
loss = criterion(y, out)    # 得到损失函数值
optimizer.zero_grad()       # 清空参数的所有梯度
loss.backward()             # 计算梯度值
optimizer.step()            # 更新参数

x = Variable(x)
model.eval()
predict = model(x)
predict = predict.data.numpy()

plt.figure(figsize=(10,8))
plt.plot(x.data.numpy(), y.numpy(), 'ro', label='Original data')
plt.plot(x.data.numpy(), predict, label='Fitting Line')
plt.title('Fitting Line')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

在编译过程中我遇到了几个问题,现在来分析一下:

1.生成测试数据

首先我需要生成一组维度为1的tensor张量

torch.FloatTensor 控制生成的为浮点数

reshape(-1,1) 指生成的张量列数为1,行数未知,假设共生成n个x值,则此张量的最终格式为n行1列

使用 matplotlib.pyplot.plot() 函数绘制图形,需提取出x,y中的数值来绘图,调用 numpy() 函数,不能直接将x,y用作参数

生成的绘有数据点的图形如下:

2.构造模型

使用 torch.nn.Linear(1,1) 来构造模型,两个1表示维度为(1,1)

criterion = nn.MSELoss() 调用了平方损失函数,是预测值和真实值平方差的平均数

3.开始优化

一开始我将学习率设置为1e-3,但是最后绘图的时候总是不出现任何数据点或是直线,不正常地退出程序,而且此时的 predict=model(x) 值总是nan,当时并没有想到是学习率设置的问题,所以我百思不得其解。查了之后发现出现nan的原因有几种:

(1)学习率太大,而样本数据集很小(这就是我的问题)
(2)自定义的loss除了一个过小的数字,小到接近于0
(3)数据不干净,数据本身就有nan,可以用numpy.isnan检查

4.绘制包含回归直线的图像

由于x,y值在之前的运算过程中已经由tensor张量转换成了Variable张量,因此在提取其中的数据时需采用 x.data.numpy() 和 y.data.numpy() 格式

先根据随机生成的x,y绘制出数据点,再在同一张图上根据x和预测值predict绘制出直线,线性回归直线即绘制成功

结果如下:

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
沉浮sy 发布了4 篇原创文章 · 获赞 4 · 访问量 117 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: