能够以准确高效的方式构建神经网络是招聘人员最追捧的深度学习工程师技能之一。PyTorch是一个主要用于深度学习的Python库。PyTorch最基本和最重要的部分之一是创建张量,张量可以是数字、向量、矩阵或任何n维数组。为了降低构建神经网络时的计算速度,我们必须避免使用显式循环。我们可以使用向量化操作来避免这种循环。在构建神经网络时,足够快地计算矩阵运算的能力至关重要。“为什么不使用NumPy库?”对于深度学习,我们需要计算模型参数的导数。PyTorch提供了在反向传播时跟踪导数的能力,而NumPy没有,这在Pytorch中称为“AutoGrad”。PyTorch为使用GPU快速执行提供了内置支持。这对于训练模型至关重要。由于Numpy缺乏将其计算卸载到GPU的能力,因此训练模型的时间最终可能会非常长。所有使用PyTorch的深度学习项目都从创建张量开始。让我们来看看一些必须知道的函数,它们是任何涉及构建神经网络的深度学习项目的支柱。torch.tensor()torch.sum()torch.index_select()torch.stack()torch.mm()安装好Pytorch后,直接在代码中导入即可:#Importtorchandotherrequiredmodulesimporttorchtorch.tensor()首先我们定义一个A辅助函数describe(x),它将总结张量x的各种属性,例如张量的类型、张量的维度和张量的内容。#Helperfunctiondefdescribe(x):print("Type:{}".format(x.type()))print("Shape/size:{}".format(x.shape))print("Values:\n{}".format(x)在PyTorch中使用torch.Tensor创建张量PyTorch允许我们使用torch包以多种不同的方式创建张量。创建张量的一种方法是通过指定其维度来初始化随机张量describe(torch.Tensor(2,3))使用Python列表以声明方式创建张量我们还可以使用Python列表创建张量。我们只需要将列表作为参数传递给函数,我们就以张量形式获得了它。x=torch.Tensor([[1,2,3],[4,5,6]])describe(x)从NumPy数组创建张量我们也可以从NumPy数组创建PyTorch张量。张量的类型是DoubleTensor而不是默认的FloatTensor。这对应于NumPy的数据类型是float64,如下所示。importnumpyasnpnpy=np.random.rand(2,3)describe(torch.from_numpy(npy))我们不能用张量做什么?张量必须是实数或复数,而不是字符串或字符。torch.tensor([[1,2],[3,4,5]])--------------------------------------------------------------------------ValueErrorTraceback(mostrecentcallast)in1#Example3-breaking(toillustratewhenitbreaks)---->2torch.tensor([[1,2],[3,4,5]])ValueError:expectedsequenceoflength2atdim1(got3)torch.tensor()构成了任何PyTorch项目的核心,从字面上看,因为它就是张量。torch.sum()该函数返回输入张量中所有元素的总和。describe(torch.sum(x,dim=0,keepdims=True))如果您了解NumPy,您可能已经注意到,对于二维张量,我们将行表示为维度0,将列表示为维度1。torch.sum()函数允许我们计算行和列的总和。我们还为keepdims传递True以保留结果中的维度。通过定义dim=1,我们告诉函数按列折叠数组。torch.sum(npy,dim=1,keepdims=True)--------------------------------------------------------------------------TypeErrorTraceback(mostrecentcallast)in<模块>()1#Example3-breaking(toillustratewhenitbreaks)---->2torch.sum(npy,dim=1,keepdims=True)TypeError:sum()receivedaninvalidcombinationofarguments-got(numpy.ndarray,keepdims=bool,dim=int),butexpectedoneof:*(Tensorinput,*,torch.dtypedtype)不匹配,因为一些关键字不正确:keepdims,dim*(Tensorinput,tupleofintsdim,boolkeepdim,*,torch.dtypedtype,Tensorout)*(Tensorinput,tupleofnamesdim,boolkeep*,torch.dtypedtype,Tensorout)这个函数在计算指标和损失函数时非常有用。torch.index_select()此函数返回一个新的张量,该张量使用索引(LongTensor)中的条目沿着维度dim对输入张量进行索引。indices=torch.LongTensor([0,2])describe(torch.index_select(x,dim=1,index=indices))我们可以将索引作为张量传递并将轴定义为1,该函数返回一个新的张量大小rows_of_original_tensorxlength_of_indices_tensor。indices=torch.LongTensor([0,0])describe(torch.index_select(x,dim=0,index=indices))我们可以将索引作为张量传递并将轴定义为0,函数返回大小columns_of_original_tensorxlength_of_indices_tensor的新张量。indices=torch.FloatTensor([0,2])describe(torch.index_select(x,dim=1,index=indices))此函数在复杂索引中很有用,例如张量的非顺序索引。torch.stack()这将沿着一个新维度连接一系列张量。describe(torch.stack([x,x,x],dim=0))我们可以传递我们想要连接的张量作为张量列表,dim为0以将其沿行堆叠。describe(torch.stack([x,x,x],dim=1))我们可以传递我们想要连接的张量作为张量列表,dim为1以将其沿列堆叠。y=torch.tensor([3,3])describe(torch.stack([x,y,x],dim=1))-----------------------------------------------------------------------RuntimeErrorTraceback(mostrecentcalllast)in()1#Example3-breaking(toillustratewhenitbreaks)2y=torch.tensor([3,3])---->3describe(torch.stack([x,y,x],dim=1))RuntimeError:stackexpectseachtensortobeequalsize,butgot[2,3]atentry0and[2]atentry1此函数与torch.index_select()结合使用可使矩阵变平。torch.mm()这个函数执行矩阵的矩阵乘法。mat1=torch.randn(3,2)describe(torch.mm(x,mat1))我们可以通过简单地将矩阵作为参数传递来轻松执行矩阵乘法,该函数将产生一个新的张量作为两个矩阵的乘积。mat1=np.random.randn(3,2)mat1=torch.from_numpy(mat1).to(torch.float32)describe(torch.mm(x,mat1))在上面的例子中,我们定义了一个NumPy数组然后转换它是一个float32类型的张量。现在我们可以成功地对张量执行矩阵乘法。两个张量的数据类型必须匹配才能成功操作。mat1=torch.randn(2,3)describe(torch.mm(x,mat1))--------------------------------------------------------------------------RuntimeErrorTraceback(mostrecentcallast)in()1#Example3-breaking(toillustratewhenitbreaks)2mat1=torch.randn(2,3)---->3describe(torch.mm(x,mat1))RuntimeError:mat1andmat2shapescannotbemultiplied(2x3and2x3)为了执行成功的矩阵乘法运算,matrix1的列和matrix2的行必须匹配。torch.mm()函数遵循矩阵乘法的基本规则。即使矩阵顺序相同,它仍然不会自动与另一个矩阵的转置相乘,用户必须手动定义。为了在反向传播时计算导数,必须能够有效地执行矩阵乘法,这就是torch.mm()的用武之地。总结我们对5个基本PyTorch函数的研究到此结束。从基本的张量创建到具有特定用例(如torch.index_select())的高级和鲜为人知的函数,PyTorch提供了许多此类函数,让数据科学爱好者的生活更轻松。