pytorch之线性回归

pytorch基本语法

写在前面:
1、了解pytorch的基本用法,pytorch类似numpy,只不过pytorch含自动求导和可以在GPU下允许,提高程序运行速度。
2、本文会根据线性回归模型的介绍引入pytorch进行运算,主要是帮助解决一些同学只懂理论不懂实践的困惑。

(一)线性模型

1.1 概念及应用

例如一个样本示例 x \boldsymbol{x} x,它由 d d d 个属性所描述, x = { x 1 ; x 2 ; . . . ; x d } \boldsymbol{x}=\{ x_1;x_2 ; ...;x_d \} x={x1;x2;...;xd},其中 x i x_i xi x x x在第 i i i个属性上的取值,线性模型就是找一个线性组合来进行预测的函数,依据这些属性的描述可以预测 y y y。一般的线性模型如下:
f ( x ) = w T x + b (1.1) f(x) = \boldsymbol{w}^T\boldsymbol{x} + b \tag{1.1} f(x)=wTx+b(1.1)
其中 w \boldsymbol{w} w 是权重参数,它的长度取决于样本属性值。 w = { w 1 ; w 2 ; . . . ; w d } \boldsymbol{w}=\{ w_1;w_2 ; ...;w_d \} w={w1;w2;...;wd} b b b学得之后,模型才得以确立。因此训练模型的过程主要是更新 w w w b b b的值。

线性模型经常用于回归与分类,本博主要先介绍线性模型在回归上的应用。

1.2 线性回归

前一节我们是给定的一个样本示例 x \boldsymbol{x} x,通常训练一个模型时一个样本是远远不够的,因此本节给定的是一个包含 m m m个样本 d d d个属性的数据集,此时样本集矩阵便如下表示:
X = ( x 11 x 12 . . . x 1 d y 1 x 21 x 22 . . . x 2 d y 2 . . . . . . . . . . . . . . . x m 1 x m 2 . . . x m d y 3 ) (1.2) \boldsymbol{X} = \left( \begin{array}{cccc|c} x_{11} & x_{12} &... & x_{1d} & y_1 \\ x_{21} & x_{22} &... & x_{2d} & y_2 \\ {...} & {...} &... & {...} & ... \\ x_{m1} & x_{m2} &... & x_{md} & y_3 \\ \end{array} \right) \tag{1.2} X=x11x21...xm1x12x22...xm2............x1dx2d...xmdy1y2...y3(1.2)
矩阵含义是第一个样本 x 1 x_1 x1的属性值由 d d d个,它的标签是 y 1 y_1 y1 因此表述为 { x 11 , x 12 . . . x 1 d ∣ y 1 } \{x_{11} , x_{12} ... x_{1d} |y_1\} {x11,x12...x1dy1},而线性回归就是根据(1.1)的公式来预测 y i y_i yi的值,它尽可能训练模型使得 f ( x i ) ≈ y i f(x_i) \approx y_i f(xi)yi,也就是它俩差距尽可能小。下面是两个简单问题:

  • (1) 那么怎么衡量预测值和真实值的差距最小?
    回归任务中经常采用均方误差来去衡量真实值与预测值的差距,因此训练模型过程就是使均方误差最小化然后确定 w w w b b b的参数值。这里所说的均方误差就是模型用到的损失函数(Loss Function)。
  • (2) 那么如何去调整确定 w w w b b b的值?
    通常采用梯度下降的方法来调整 w w w b b b的值,梯度下降方法有:SGD,Adam等方式。

本博主要介绍线性模型在pytorch上的实现,梯度下降方法将抽时间再写。

(二)pytorch基础

首先需要了解什么是张量:
0维张量就是标量也就是一个数:2
1维张量就是向量也就是这样:[1,2,3…]
2维张量就是矩阵也就是这样:[[1,2,3],[2,2,3]]
3维张量就是存储例如图像颜色RGB数据

2.1 数据类型

主要介绍常见的数据类型和生成数据的函数

函数应用
torch.FloatTensor用于生成浮点型的tensor
torch.IntTensor用于生成整型的tensor
torch.DoubleTensor用于生成双精度浮点型tensor
torch.CharTensor字符型tensor
torch.LongTensor长整型tensor
torch.rand用于生成数据类型为浮点型且维度指定的随机Tensor,数据在0~1之间均匀分布
torch.randn(a,b)用于生成数据类型为浮点型且维度指定的随机Tensor,数据满足均值为0,方差为1的正太分布
torch.range(a,b,c)用于随机生成起点a终点b步长c的浮点型tensor
torch.zeros生成浮点型且维度指定全为0的数据

注意rand不建议这样用rand(a)这样生成的是一个数组,而不是一个矩阵,推荐用rand(a,)
torch.Tensor默认数据类型是浮点型,可以采用type(变量名)或变量名.type()查看其tensor数据类型

2.2 基本运算

主要介绍常见的运算函数

函数应用
torch.abs(a)返回tensor类型的a的绝对值
torch.add(a,b)返回a+b后的和
torch.clamp(a,b,c)对参数按照自定义范围裁剪,将结果作为输出,对a进行裁剪
torch.div(a,b)求商a/b
torch.mul求积
torch.pow求幂
torch.mm求积 必须利用矩阵乘法规则进行求积
torch.mv求积 矩阵向量间乘法规则运算

2.3 线性回归实现

首先需要获取样本,设置1000个包含2个属性的样本集 ,生成1000个y=2*x+1的真实值y,通过训练1000次模型得到w和b,比较w和2,b和1的接近程度,可知道拟合的效果。

import torch 
from torch.autograd import Variable
%matplotlib inline
from matplotlib import pyplot as plt
x = torch.randn(1000,1)
y = x * 2 +  1
plt.scatter(x.numpy(),y.numpy()) #x.squeeze()将二维变为一维
w = Variable(torch.rand(1,1),requires_grad=True)
b = Variable(torch.zeros(1,1),requires_grad=True)
lr = 0.000003
for i in range(1000):
    x_train,y_train = x,y
    x_train,y_train = Variable(x_train),Variable(y_train)
    
    y_pred = x_train.mm(w) + b
    loss = (0.5 * (y_pred - y_train) ** 2).sum() #求和是因为后向传播的是标量
    
    loss.backward()
    #梯度更新
    w.data.sub_(lr * w.grad.data)
    b.data.sub_(lr * b.grad.data)
    #梯度清0
    w.grad.data.zero_()
    b.grad.data.zero_()
print(w,b)
#输出:tensor([[1.9331]], requires_grad=True) tensor([[0.9525]], requires_grad=True)

拟合曲线如下:

#生成测试样本  100个数
x_test = torch.randn(100,1)
#用训练好的w和b值得出曲线 和 真实的w和b得出的曲线拟合
y_test = torch.mm(x_test,w.data)+ b.data
y = x_test * 2 + 1 #之前的w=2,b=1
plt.plot(x_test.numpy(),y_test.numpy())
plt.scatter(x_test.numpy(),y.numpy())
plt.show()

训练100次的拟合如下:
在这里插入图片描述
此时w和b的值为:0.7199 , 0.2414
训练1000次的拟合如下:
在这里插入图片描述
此时的w和b的值如下:1.8973,0.9315
显然1000次训练效果更好

总结:本文博客算是入门,只简单的介绍了机器学习算法中的线性回归,主要就是介绍pytorch基础和线性回归的代码实现,内容中一些后向传播的求导过程直接采用的是autograd包中的自动给求导,下一节将探讨简单神经网络的pytorch实现。
感谢:周志华:机器学习,唐进民:深度学习之pytorch实战计算机视觉

有问题欢迎留言:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值