Python已被确定为数据科学和机器学习的入门语言,这在一定程度上要归功于开源ML库Pytorch。Pytorch强大的深度神经网络构建工具和易用性使其成为数据科学家的热门选择。随着其受欢迎程度的增长,越来越多的公司正在从Tensorflow转向Pytorch,现在是开始使用Pytorch的最佳时机。今天,我们将帮助您了解是什么让Pytorch如此受欢迎,使用Pytorch的一些基础知识,并帮助您制作您的第一个计算模型。什么是火炬?PyTorch是一个开源机器学习Python库,用于深度学习实现,例如计算机视觉(使用武器)和自然语言处理。它由Facebook的AI研究实验室(Fair)于2016年开发,自数据科学和ML领域以来一直被采用。Pytorch为那些已经熟悉Python的人提供了一个直观的机器,并且具有oop支持和动态计算图等强大的功能。除了构建深度神经网络,Pytorch还因其GPU加速而非常适合复杂的数学计算。此功能允许Pytorch使用计算机的GPU来大幅加速计算。这种独特的功能与Pytorch无与伦比的简单性相结合,使其成为最受欢迎的深度学习库之一,仅与Vertex的Tensorflow竞争。为什么要使用火炬?在Pytorch之前,开发人员使用高级微积分来寻找反向传播误差和节点权重之间的关系。更深层次的神经网络需要越来越复杂的操作,限制了机器学习的规模和易用性。现在,我们可以使用ML库自动执行所有演算!ML库可以在几秒钟内计算出任何大小或形状的网络,让更多的开发人员能够构建更大更好的网络。Pytorch的行为类似于标准Python,使这种访问更进一步。您可以使用现有的Python知识来快速启动现有的Python知识,而不是学习新的语法。此外,您还可以使用Pytorch来使用其他Python库,例如Pycharm调试器等流行的调试器。pytorch和tensorflow之间的主要区别。Pytorch和Tensorflow是简单性和性能之间的权衡:Pytorch更容易学习(特别是对于Python程序员),而Tensorflow有一个学习曲线,但性能更好并且使用更广泛。受欢迎程度:Tensorflow是当前行业专业人士和研究人员的首选工具,因为它比Pytorch早1年发布。然而,Pytorch用户比Tensorflow更快,这表明Pytorch可能很快就会成为最受欢迎的。数据并行性:Pytorch包括声明式数据并行性,换句话说,它会自动将数据处理的工作负载分配到不同的GPU上,以加快性能。Tensorflow具有并行性,但它需要您手动分配工作,这通常很耗时且效率较低。动态图与静态图:Pytorch默认具有动态图,可以立即响应新数据。Tensorflow使用TensoRFlowFold对动态图形的支持有限,但主要使用静态图形。集成:Pytorch由于通过arms紧密连接,因此适用于AWS上的项目。Tensorflow与谷歌云集成,由于使用了SWIFTAPI,因此非常适合移动应用程序。可视化:Tensorflow具有更强大的可视化工具,并提供对图形设置的更精细控制。Pytorch的aspirationvisualizer或其他标准绘图库(如Matplotlib)不如Tensorflow功能齐全,但它们更容易学习。pytorch基础1.张量Pytorch张量是多维数组变量,作为所有高级操作的基础。与标准数字类型不同,张量可以分配为使用CPU或GPU加速操作。它们类似于N维量,甚至可以在一行中转换为Numpy数组。张量有5种类型:Floattensor:32位FloatDoubtensor:64位FloatHalfTensor:16位FloatIntstensor:32位intlongtensor:64位int与所有数字类型一样,您希望使用适合内存的最小类型需要保存。pytorch使用floattensor作为所有张量的默认类型,但您可以使用它来使用torch.set_default_tensor_type(t)初始化两个FloatTensor:importtorch#initializingtensorsa=torch.tensor(2)b=torch.tensor(1)insimplemathTensors可以像其他数字类型一样用于操作。#additionprint(a+b)#subtractionprint(b-a)#multiplicationprint(a*b)#divisionprint(a/b)你也可以使用移动GPU的CUDA来处理张量。iftorch.cuda.is_available():xx=x.cuda()yy=y.cuda()x+y因为张量在Pytorch中是矩阵,你可以设置张量来表示数字表:ones_tensor=torch.ones((2,2))#tensorcontainingallonesrand_tensor=torch.rand((2,2))#tensorcontainingrandomvalues这里我们指定我们的张量应该是2x2平方。使用vone()函数时方块被填充,使用rand()函数时随机数被填充。2.神经网络Pytorch由于其优越的分类模型,如图像分类或卷积神经网络(CNN),经常被用来构建神经网络。神经网络是一层连接且加权的数据节点。每一层都允许模型对输入数据最匹配的类别进行分类。神经网络只有在接受训练时才会表现出色,因此需要大型数据集和GAN框架,它们会根据模型已经掌握的数据生成更具挑战性的训练数据。Pytorch使用Torch.NN包定义神经网络,它包含一组模块来表示网络的每一层。每个模块接收输入张量并计算输出张量,这些张量组合起来创建网络。torch.nn包还定义了我们用来训练神经网络的损失函数。构建神经网络的步骤是:架构:创建神经网络层、设置参数、建立权重和偏差。前向传播:使用参数计算预测输出。误差是通过比较预测和实际输出来衡量的。反向传播:发现错误后,根据神经网络的参数对错误函数求导。反向传播允许我们更新我们的权重参数。迭代优化:使用使用梯度下降的优化器迭代更新参数以最小化错误。这是Pytorch中的神经网络示例:importtorchiimporttorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):def__init__(self):super(Net,self).__init__()#1inputimagechannel,6outputchannels,3x3squareconvolution#kernelself.conv1=嗯。Conv2d(1,6,3)self.conv2=nn.Conv2d(6,16,3)#anaffineoperation:y=Wx+bself.fc1=nn.Linear(16*6*6,120)#6*6fromimagedimensionself.fc2=nn.Linear(120,84)self.fc3=nn.Linear(84,10)defforward(self,x):#Maxpoolingovera(2,2)windowx=F.max_pool2d(F.relu(self.conv1(x)),(2,2))#Ifthesizeisasquareyoucanonlyspecifyasinglenumberx=F.max_pool2d(F.relu(self.conv2(x)),2)xx=x.view(-1,self.num_flat_features(x))x=F.relu(self.fc1(x))x=F.relu(self.fc2(x))x=self.fc3(x)返回xdefnum_flat_features(self,x):size=x.size()[1:]#alldimensionsexceptthebatchdimensionnum_features=1forsinsize:num_features*=sreturnnum_featuresnet=Net()print(net)NN.Module指定这将是一个神经网络,然后我们用2个执行2D卷积的Conv2D层和执行线性变换层的3个线性层定义它。接下来,我们定义前向传播forward总结的forward方法。我们不需要定义反向传播方法,因为Pytorch默认包含backward()函数。如果现在看起来很混乱,请不要担心,我们将在本教程后面介绍一个更简单的Pytorch实现。3.AutogradAutograd是一个Pytorch包,用于计算神经网络操作所需的导数。这些导数称为梯度。在转发过程中,Autograd记录了对梯度张量的所有操作,并创建了一个无环图来查找张量与所有操作之间的关系。这种操作集合称为自动微分。图的叶子是输入张量,根是输出张量。Autograd通过从根到叶跟踪图形并使用链式法则将每个梯度乘以梯度来计算梯度。计算梯度后,导数的值自动填充为张量的梯度属性。importtorch#pytorchtensorx=torch.tensor(3.5,requires_grad=True)#yisdefinedasafunctionofxy=(x-1)*(x-2)*(x-3)#workoutgradientsy.backward()默认RESCEL_GRAD设置为FALSE,PyTorch不跟踪梯度。在初始化期间将RESECT_GRAD指定为TRUE将允许Pytorch通过某些操作跟踪该特定张量的梯度。这段代码看Y,看到它来自(x-1)(x-2)(x-3),自动使梯度dy/dx,3x^2-12x+11指令也求解数值的那个梯度,并将它放在张量x内,而x的实际值为3.5。梯度为3(3.53.5)-12*(3.5)+11=5.75。>ImageSource:Author渐变默认是累积的,如果不重新设置可能会影响结果。使用Model.zero_grad()在每个梯度后将图形重新归零。4.优化器优化器允许您更新模型中的权重和偏差以减少错误。这使您可以编辑模型的工作方式,而无需重新停止整个过程。所有Pytorch优化器都包含在torch.optim包中,每个优化方案都是针对特定情况设计的。torch.optim模块允许您通过传递参数列表来构建抽象优化方案。Pytorch有许多优化器可供选择,这意味着几乎总有一种最适合您的需求。例如,我们可以实现一种常见的优化算法SGD(随机梯度下降)来平滑我们的数据。importtorch.optimasoptimparams=torch.tensor([1.0,0.0],requires_grad=True)learning_rate=1e-3##SGDoptimoptimizer=optim.SGD([params],lr=learning_rate)更新模型后,使用optimizer.step()告诉Pytorch重新计算模型。使用优化器,我们需要使用循环手动更新模型参数:forparamsinmodel.parameters():params-=params.grad*learning_rate制定它需要时间,可以节省很多时间。5.使用pytorch计算图为了更好的理解Pytorch和神经网络,可以使用计算图来练习。这些图本质上是神经网络的简化版本,用于进行一系列操作来理解系统的输出如何受到输入的影响。换句话说,输入x用于查找y,然后使用y查找输出z。>图片来源:作者假设Y和Z计算如下:y=x^2z=2Y+3然而,我们感兴趣的是输出Z如何随输入X变化,因此我们需要进行一些微积分:dz/dx=(dz/dy)*(dy/dx)dz/dx=2.2xdz/dx=4x使用这个我们可以看到输入x=3.5将使z=14。知道如何在其他上下文中定义每个张量(y在x、z和z、y等方面)允许pytorch构建这些张量如何连接的图片。>ImageSource:Author这张照片被称为计算图,可以帮助我们了解Pytorch在幕后是如何工作的。使用此图,我们可以看到每个张量如何受到任何其他张量变化的影响。这些关系是梯度,用于在训练期间更新神经网络。这些图表与Pytorch一起使用比手动使用要容易得多,所以让我们现在尝试一下,我们就会了解幕后发生的事情。importtorch#setupsimplegraphrelatingx,yandzx=torch.tensor(3.5,requires_grad=True)y=x*xz=2*y+3print("x:",x)print("y=x*x:",y)print("z=2*y+3:",z)#workoutgradientsz.backward()print("Workingoutgradientsdz/dx")#whatisgradientatx=3.5print("Gradientatx=3.5:",x.grad)这样发现Z=146.Pytorch实践:多路径计算图现在您已经看到了具有单一关系的计算图,让我们尝试一个更复杂的示例。首先,定义两个张量a和b,用作我们的输入。确保设置RESECT_GRAD=TRUE以便我们可以将渐变缩小到底线。importtorch#setupsimplegraphrelatingx,yandza=torch.tensor(3.0,requires_grad=True)b=torch.tensor(2.0,requires_grad=True)接下来设置我们的输入和我们神经网络的每一层x,y和z的关系.请注意,z是根据x和y定义的,它们是使用我们的输入值a和b定义的。importtorch#setupsimplegraphrelatingx,yandza=torch.tensor(3.0,requires_grad=True)b=torch.tensor(2.0,requires_grad=True)x=2*a+3*by=5*a*a+3*b*b*bz=2*x+3*y这构建了一个关系链,Pytorch可以遵循它来理解数据之间的所有关系。我们现在可以通过从z到a从z到a的路径求解梯度Dz/da。有两条路径,一条通过x,另一条通过y。您应该遵循它们并将两条路径的表达式添加在一起。这是有道理的,因为从a到z的两条路径对z的值有贡献。如果我们使用链式法则的微积分来确定DZ/DA,我们会发现相同的结果。>图片来源:作者第一条路径X给我们2*2,第二条路径通过Y给我们3*10A。所以Z随4+30A变化的速率。如果A是22,那么DZ/DA就是4+30*2=64。我们可以通过从z添加反向传播然后询问a的梯度(或导数)来确认它。importtorch#setupsimplegraphrelatingx,yandza=torch.tensor(2.0,requires_grad=True)b=torch.tensor(1.0,requires_grad=True)x=2*a+3*by=5*a*a+3*b*b*bz=2*x+3*yprint("a:",a)print("b:",b)print("x:",x)print("y:",y)print("z:",z)#workoutgradientsz.backward()print("Workingoutgradientdz/da")#whatisgradientata=2.0print("Gradientata=2.0:",a.grad)学习的下一步恭喜,您现在已经完成了快速入门,是的,Pytorch和神经网络。完成计算图形是理解深度学习网络的重要部分。当您了解高级深度学习技能和应用程序时,您将想要探索:复杂的神经网络,使用GAN优化视觉设计训练快乐学习!原文链接:https://ai.plainenglish.io/pytorch-tutorial-a-quick-guide-for-new-learners-180957cb7214
