Pytorch实现一元线性回归

最近用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用作参数

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

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绘制出直线,线性回归直线即绘制成功

结果如下:
Alt

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉浮sy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值