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...x1d∣y1},而线性回归就是根据(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实战计算机视觉
有问题欢迎留言: