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用作参数
生成的绘有数据点的图形如下:
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
- 收藏
- 分享
- 文章举报
- 基于TensorFlow实现一元线性回归
- Java实现一元线性回归
- PyTorch设立计算图并自动计算(梯度下降和线性回归的实现)
- matlab实现一元线性回归和多元线性回归
- Python实现机器学习一(实现一元线性回归)
- 深度学习 一元线性回归网络 Pytorch
- 一元线性回归--R实现
- 一元线性回归的Python编程实现
- 【转载】用OCTAVE实现一元线性回归的梯度下降算法
- 一元线性回归的MATLAB编程实现
- 一元线性回归的详解及其Spss和Java的实现 之 spss实现
- python实现一元线性回归分析的全部过程
- 利用最小二乘法实现图片中多个点的一元线性回归
- matlab实现一元线性回归和多元线性回归
- 利用最小二乘法实现图片中多个点的一元线性回归
- Tensorflow实现简单的一元线性回归并保存和加载模型
- 梯度下降法及一元线性回归的python实现
- 一元线性回归的详解及其Spss和Java的实现 之 理论说明
- 【机器学习】用Octave实现一元线性回归的梯度下降算法
- 一元线性回归分析及java实现