PyTorch的4分钟教程,手把手教你完成线性回归

2019 年 7 月 27 日 大数据文摘

大数据文摘出品

编译:洪颖菲、宁静


PyTorch深度学习框架库之一,是来自Facebook的开源深度学习平台,提供研究原型到生产部署的无缝衔接。


本文旨在介绍PyTorch基础部分,帮助新手在4分钟内实现python PyTorch代码的初步编写。


下文出现的所有功能函数,均可以在中文文档中查看具体参数和实现细节,先附上pytorch中文文档链接:

https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/


coding前的准备


需要在电脑上安装Python包,导入一些科学计算包,如:numpy等,最最重要的,别忘记导入PyTorch,下文的运行结果均是在jupyter notebook上得到的,感兴趣的读者可以自行下载Anaconda,里面自带有jupyter notebook。(注:Anaconda支持python多个版本的虚拟编译环境,jupyter notebook是一个web形式的编译界面,将代码分割成一个个的cell,可以实时看到运行结果,使用起来非常方便!)


软件的配置和安装部分,网上有很多教程,这里不再赘述,纸上得来终觉浅,绝知此事要躬行。让我们直接进入Pytorch的世界,开始coding吧!


Tensors


Tensor张量类型,是神经网络框架中重要的基础数据类型,可以简单理解为一个包含单个数据类型元素的多维矩阵,tensor之间的通过运算进行连接,从而形成计算图。


下面的代码实例中创建了一个2*3的二维张量x,指定数据类型为浮点型(Float):

import torch#Tensorsx=torch.FloatTensor([[1,2,3],[4,5,6]])print(x.size(),"\n",x)


运行结果:


              

PyTorch包含许多关于tensors的数学运算。除此之外,它还提供了许多实用程序,如高效序列化Tensor和其他任意数据类型,以及其他有用的实用程序。


下面是Tensor的加法/减法的一个例子,其中torch.ones(*sizes, out=None) → Tensor返回一个全为1 的张量,形状由可变参数sizes定义。在实例中,和变量x相加的是创建的两个相应位置值为1的2*3的张量,相当于x每一维度的值+2,代码和运行结果如下所示:

#Add tensorsx.add_(torch.ones([2,3])+torch.ones([2,3]))


运行结果:


       

     

同样的,PyTorch也支持减法操作,实例如下,在上面的运行结果基础上每一维度再减去2,x恢复到最初的值。

#Subtract Tensorx.sub_(torch.ones([2,3])*2)


运行结果:


             


其他PyTorch运算读者可以查阅上文给出的中文链接。


PyTorch and NumPy


用户可以轻松地在PyTorch和NumPy之间来回转换。


下面是将np.matrix转换为PyTorch并将维度更改为单个列的简单示例:

#Numpy to torch tensorsimport numpy as npy=np.matrix([[2,2],[2,2],[2,2]])z=np.matrix([[2,2],[2,2],[2,2]],dtype="int16")x.short() @ torch.from_numpy(z)


运行结果:


             


其中@为张量乘法的重载运算符,x为2*3的张量,值为[[1,2,3],[4,5,6]],与转换成tensor的z相乘,z的大小是3*2,结果为2*2的张量。(与矩阵乘法类似,不明白运行结果的读者,可以看下矩阵的乘法运算)


除此外,PyTorch也支持张量结构的重构reshape,下面是将张量x重构成1*6的一维张量的实例,与numpy中的reshape功能类似。


#Reshape tensors(similar to np.reshape)x.view(1,6)


运行结果:


        

      

GitHub repo概述了PyTorch到numpy的转换,链接如下:

https://github.com/wkentaro/pytorch-for-numpy-users


CPU and GPUs


PyTorch允许变量使用 torch.cuda.device上下文管理器动态更改设备。以下是示例代码:


#move variables and copies across computer devicesx=torch.FloatTensor([[1,2,3],[4,5,6]])y=np.matrix([[2,2,2],[2,2,2]],dtype="float32")

if(torch.cuda.is_available()): x=x.cuda(); y=torch.from_numpy(y).cuda() z=x+yprint(z)
print(x.cpu())


运行结果:

             

PyTorch Variables


变量只是一个包裹着Tensor的薄层,它支持几乎所有由Tensor定义的API,变量被巧妙地定义为自动编译包的一部分。它提供了实现任意标量值函数自动区分的类和函数。


以下是PyTorch变量用法的简单示例,将v1和v2相乘的结果赋值给v3,其中里面的参数requires_grad的属性默认为False,若一个节点requires_grad被设置为True,那么所有依赖它的节点的requires_grad都为True,主要用于梯度的计算。


#Variable(part of autograd package)#Variable (graph nodes) are thin wrappers around tensors and have dependency knowle#Variable enable backpropagation of gradients and automatic differentiations#Variable are set a 'volatile' flad during infrencing

from torch.autograd import Variablev1 = Variable(torch.tensor([1.,2.,3.]), requires_grad=False)v2 = Variable(torch.tensor([4.,5.,6.]), requires_grad=True)v3 = v1*v2

v3.data.numpy()


运行结果:


            

#Variables remember what created themv3.grad_fn


运行结果:


             


Back Propagation


反向传播算法用于计算相对于输入权重和偏差的损失梯度,以在下一次优化迭代中更新权重并最终减少损失,PyTorch在分层定义对于变量的反向方法以执行反向传播方面非常智能。


以下是一个简单的反向传播计算方法,以sin(x)为例计算差分:


#Backpropagation with example of sin(x)x=Variable(torch.Tensor(np.array([0.,1.,1.5,2.])*np.pi),requires_grad=True)y=torch.sin(x)x.grady.backward(torch.Tensor([1.,1.,1.,1]))

#Check gradient is indeed cox(x)if( (x.grad.data.int().numpy()==torch.cos(x).data.int().numpy()).all() ): print ("d(sin(x)/dx=cos(x))")


运行结果:

             


对于pytorch中的变量和梯度计算可参考下面这篇文章:

https://zhuanlan.zhihu.com/p/29904755


SLR: Simple Linear Regression


现在我们了解了基础知识,可以开始运用PyTorch 解决简单的机器学习问题——简单线性回归。我们将通过4个简单步骤完成:


第一步


在步骤1中,我们创建一个由方程y = wx + b产生的人工数据集,并注入随机误差。请参阅以下示例:

#Simple Liner Regression# Fit a line to the data. Y =w.x+b#Deterministic behaviornp.random.seed(0)torch.manual_seed(0)#Step 1:Datasetw=2;b=3x=np.linspace(0,10,100)y=w*x+b+np.random.randn(100)*2x=x.reshape(-1,1)y=y.reshape(-1,1)


第二步


在第2步中,我们使用forward函数定义一个简单的类LinearRegressionModel,使用torch.nn.Linear定义构造函数以对输入数据进行线性转换:

#Step 2:Modelclass LinearRegressionModel(torch.nn.Module):        def __init__(self,in_dimn,out_dimn):        super(LinearRegressionModel,self).__init__()        self.model=torch.nn.Linear(in_dimn,out_dimn)            def forward(self,x):        y_pred=self.model(x);        return y_pred;    model=LinearRegressionModel(in_dimn=1, out_dimn=1)


torch.nn.Linear参考网站:

https://pytorch.org/docs/stable/_modules/torch/nn/modules/linear.html


第三步


下一步:使用 MSELoss 作为代价函数,SGD作为优化器来训练模型。


#Step 3: Trainingcost=torch.nn.MSELoss()optimizer=torch.optim.SGD(model.parameters(),lr=0.01,momentum=0.9)inputs=Variable(torch.from_numpy(x.astype("float32")))outputs=Variable(torch.from_numpy(y.astype("float32")))

for epoch in range(100):#3.1 forward pass: y_pred=model(inputs) #3.2 compute loss loss=cost(y_pred,outputs) #3.3 backward pass optimizer.zero_grad(); loss.backward() optimizer.step() if((epoch+1)%10==0): print("epoch{},loss{}".format(epoch+1,loss.data))


运行结果:

             


MSELoss参考网站:

https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html


SGD参考网站:

https://pytorch.org/docs/stable/_modules/torch/optim/sgd.html


第四步


现在训练已经完成,让我们直观地检查我们的模型:


#Step 4:Display model and confirmimport matplotlib.pyplot as pltplt.figure(figsize=(4,4))plt.title("Model and Dataset")plt.xlabel("X");plt.ylabel("Y")plt.grid()plt.plot(x,y,"ro",label="DataSet",marker="x",markersize=4)plt.plot(x,model.model.weight.item()*x+model.model.bias.item(),label="Regression Model")plt.legend();plt.show()


运行结果:

              

现在你已经完成了PyTorch的第一个线性回归例子的编程了,对于后续希望百尺竿头,更进一步的读者来说,可以参考PyTorch的官方文档链接,完成大部分的编码应用。


相关链接:

https://medium.com/towards-artificial-intelligence/pytorch-in-2-minutes-9e18875990fd



实习/全职编辑记者招聘ing

加入我们,亲身体验一家专业科技媒体采写的每个细节,在最有前景的行业,和一群遍布全球最优秀的人一起成长。坐标北京·清华东门,在大数据文摘主页对话页回复“招聘”了解详情。简历请直接发送至zz@bigdatadigest.cn


志愿者介绍

后台回复志愿者”加入我们



点「在看」的人都变好看了哦
登录查看更多
0

相关内容

基于Lua语言的深度学习框架 github.com/torch
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
115+阅读 · 2019年12月31日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
最新翻译的官方 PyTorch 简易入门教程
人工智能头条
10+阅读 · 2019年1月10日
从张量到自动微分:PyTorch入门教程
论智
9+阅读 · 2018年10月10日
教程 | PyTorch经验指南:技巧与陷阱
机器之心
15+阅读 · 2018年7月30日
深度学习线性代数简明教程
论智
11+阅读 · 2018年5月30日
PyTorch:60分钟入门学习
全球人工智能
13+阅读 · 2018年5月18日
教程 | 从头开始了解PyTorch的简单实现
机器之心
20+阅读 · 2018年4月11日
手把手教 | 深度学习库PyTorch(附代码)
数据分析
7+阅读 · 2018年3月20日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
手把手教你由TensorFlow上手PyTorch(附代码)
数据派THU
5+阅读 · 2017年10月1日
教程 | 如何从TensorFlow转入PyTorch
深度学习世界
38+阅读 · 2017年9月30日
A survey on deep hashing for image retrieval
Arxiv
14+阅读 · 2020年6月10日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Arxiv
4+阅读 · 2018年10月31日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
4+阅读 · 2018年4月9日
Arxiv
3+阅读 · 2018年2月22日
Arxiv
25+阅读 · 2017年12月6日
Arxiv
3+阅读 · 2015年5月16日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
115+阅读 · 2019年12月31日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
相关资讯
最新翻译的官方 PyTorch 简易入门教程
人工智能头条
10+阅读 · 2019年1月10日
从张量到自动微分:PyTorch入门教程
论智
9+阅读 · 2018年10月10日
教程 | PyTorch经验指南:技巧与陷阱
机器之心
15+阅读 · 2018年7月30日
深度学习线性代数简明教程
论智
11+阅读 · 2018年5月30日
PyTorch:60分钟入门学习
全球人工智能
13+阅读 · 2018年5月18日
教程 | 从头开始了解PyTorch的简单实现
机器之心
20+阅读 · 2018年4月11日
手把手教 | 深度学习库PyTorch(附代码)
数据分析
7+阅读 · 2018年3月20日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
手把手教你由TensorFlow上手PyTorch(附代码)
数据派THU
5+阅读 · 2017年10月1日
教程 | 如何从TensorFlow转入PyTorch
深度学习世界
38+阅读 · 2017年9月30日
相关论文
A survey on deep hashing for image retrieval
Arxiv
14+阅读 · 2020年6月10日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Arxiv
4+阅读 · 2018年10月31日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
4+阅读 · 2018年4月9日
Arxiv
3+阅读 · 2018年2月22日
Arxiv
25+阅读 · 2017年12月6日
Arxiv
3+阅读 · 2015年5月16日
Top
微信扫码咨询专知VIP会员