当前位置: 首页 > 科技观察

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

时间:2023-03-16 15:08:52 科技观察

PyTorch的4分钟教程,教你一步步Seamlessly完成线性回归。本文旨在介绍PyTorch的基础部分,帮助新手在4分钟内实现pythonPyTorch代码的初步编写。下面出现的所有功能函数,可以在中文文档中查看具体的参数和实现细节,先附上pytorch中文文档的链接:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/coding准备工作需要在电脑上安装Python包,导入一些科学计算包,比如:numpy等,最重要的是不要忘记导入PyTorch,运行结果如下jupyternotebook,感兴趣的读者可以自行下载jupyternotebook自带的Anaconda。(注:Anaconda支持多版本python的虚拟编译环境,Jupyternotebook是基于web的编译界面,将代码分割成一个个cell,可以实时看到运行结果,使用起来非常方便!)软件配置和安装部分,网上教程很多,这里不再赘述。让我们直接进入Pytorch的世界,开始编码吧!Tensors张量类型是神经网络框架中重要的基础数据类型。可以简单理解为包含单一数据类型元素的多维矩阵,张量通过运算连接起来,从而形成一个计算图。在下面的代码示例中,创建了一个2*3的二维张量x,指定数据类型为Float:importtorch#Tensorsx=torch.FloatTensor([[1,2,3],[4,5,6]])print(x.size(),"\n",x)结果:PyTorch包含许多对张量的数学运算。除此之外,它还提供了许多实用程序,例如Tensor和其他任意数据类型的高效序列化,以及其他有用的实用程序。下面是一个Tensor加减法的例子,其中torch.ones(*sizes,out=None)→Tensor返回一个全1的tensor,其形状由可变参数sizes定义。例子中将两个对应位置值为1的2*3张量添加到变量x中,相当于x+2的每个维度的值。代码及运行结果如下:#Addtensorsx。add_(torch.ones([2,3])+torch.ones([2,3]))运行结果:同理,PyTorch也支持减法运算,例子如下,根据上面的运行结果,对每个维度重新减去2,x恢复到原来的值。#SubtractTensorx.sub_(torch.ones([2,3])*2)结果:其他PyTorch操作的读者可以参考上面给出的中文链接。PyTorch和NumPy用户可以轻松地在PyTorch和NumPy之间来回切换。这是一个将np.matrix转换为PyTorch并将维度更改为单列的简单示例:#Numpytotorchtensorsimportnumpyasnpy=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]],乘以z转化为张量,z的大小为3*2,结果是一个2*2张量。(类似于矩阵乘法,不理解运算结果的读者可以看看矩阵乘法运算)另外,PyTorch还支持重构张量结构reshape,下面是将张量x重构为1*6one-dimensionalsheet一个量的实例,类似于numpy中的reshape函数。#Reshapetensors(similartonp.reshape)x.view(1,6)结果:GitHubrepo概述了PyTorch到numpy的转换,链接在这里:https://github.com/wkentaro/pytorch-for-numpy-usersCPU和GPUsPyTorch允许变量到使用torch.cuda.device上下文管理器动态更改设备。这是示例代码:#movevariablesandcopiesacrosscomputerdevicesx=torch.FloatTensor([[1,2,3],[4,5,6]])y=np.matrix([[2,2,2],[2,2,2]],dtype="float32")if(torch.cuda.is_available()):xx=x.cuda();y=torch.from_numpy(y).cuda()z=x+yprint(z)print(x.cpu())runningresult:PyTorchVariables只是包裹在Tensor上的一层薄薄的一层,它支持几乎所有Tensor定义的API,变量被巧妙地定义为自动编译包的一部分。它提供了实现任意标量值函数自动微分的类和函数。下面是PyTorch变量使用的一个简单例子。v1和v2相乘的结果赋值给v3。其中参数requires_grad的属性默认为False。如果一个节点的requires_grad设置为True,那么依赖它的所有节点的requires_grad都为True,主要用于梯度计算。#Variable(partofautogradpackage)#Variable(graphnodes)arethinwrappersaroundtensorsandhavedependencyknowle#Variableenablebackpropagationofgradientsandautomaticdifferentiations#Variableareseta'volatile'fladdduringinfrcingfromtorch.autogradimportVariablev1=Variable(torch.tensor([1.,2.,3.]),requires_grad=False)v2=。tensor([4.,5.,6.]),requires_grad=True)v3=v1*v2v3.data.numpy()运算结果:#Variablesrememberwhatcreatedthemv3.grad_fn运算结果:反向传播算法用于计算相对于输入lossgradientsforweightsandbiases来更新权重并最终减少下一次优化迭代中的损失,PyTorch很聪明地定义了分层变量的逆向方法来执行反向传播。下面是一个简单的反向传播计算方法,以sin(x)为例计算差值:#Backpropagationwithexampleofsin(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]))#Checkgradientisindeedcox(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/29904755SLR:SimpleLinearRegression现在我们了解了基础,你可以开始使用PyTorch来解决一个简单的机器学习问题——简单线性回归。我们将通过4个简单的步骤完成:第1步:在第1步中,我们创建一个由方程y=wx+b产生的人工数据集并注入随机误差。请参见以下示例:#SimpleLinerRegression#Fitalinetothedata.Y=w.x+b#Deterministicbehaviornp.random.seed(0)torch.manual_seed(0)#Step1:Datasetw=2;b=3x=np.linspace(0,10,100)y=w*x+b+np.random.randn(100)*2xx=x.reshape(-1,1)yy=y.reshape(-1,1)第二步:在第二步中,我们使用forward函数定义一个简单的类LinearRegressionModel,并使用torch.nn.Linear定义构造函数以对输入数据进行线性变换:#Step2:ModelclassLinearRegressionModel(torch.nn.Module):def__init__(self,in_dimn,out_dimn):super(LinearRegressionModel,self).__init__()self.model=torch.nn.Linear(in_dimn,out_dimn)defforward(self,x):y_pred=self.model(x);returny_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作为优化训练模型。#Step3: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")))forepochinrange(100):#3.1forwardpass:y_pred=model(inputs)#3.2computelossloss=cost(y_pred,outputs)#3.3backwardpassoptimizer.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.htmlSGD参考网站:https://pytorch.org/docs/stable/_modules/torch/optim/sgd.html第4步:现在训练已经完成,让我们直观地检查我们的模型:#Step4:Displaymodelandconfirmimportmatplotlib.pyplotasplt.figure(figsize=(4,4))plt.title("ModelandDataset")plt.xlabel("X");plt.ylabel("Y")plt.grid()plt.plot(x,y,"ro",label="DataSet",marker="x",markersize=4)plt.情节(X,模型。模型。我们ight.item()*x+model.model.bias.item(),label="RegressionModel")plt.legend();plt.show()结果:现在你已经完成了PyTorch中第一个线性回归示例的编程。以后想大有进步的读者,可以参考PyTorch官方文档链接完成大部分编码应用相关链接:https://medium.com/towards-artificial-intelligence/pytorch-in-2-minutes-9e18875990fd【本文为专栏组织大数据文摘原创翻译,微信公众号“大数据文摘(id:BigDataDigest)”】点此查看作者更多好文