所需E币: 0
时间: 2024-3-19 14:25
大小: 3.18KB
一、什么是pytorchPyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。二、为什么使用PyTorch?机器学习研究人员喜欢使用PyTorch。截至2022年2月,PyTorch是PapersWithCode上最常用的深度学习框架,该网站用于跟踪机器学习研究论文及其附带的代码存储库。PyTorch还有GPU加速,使代码运行得更快,你可以专注于操作数据和编写算法。三、PyTorch库的优势通过将模型应用到例证,深度学习允许我们执行很多复杂任务,如机器翻译、玩战略游戏以及在杂乱无章的场景中识别物体等。为了在实践中做到这一点,我们需要灵活且高效的工具,以便能够适用于这些复杂任务,能够在合理的时间内对大量数据进行训练。我们需要已被训练过的模型在输入变量变化的情况下正确执行。接下来看看我们决定使用PyTorch的一些原因。PyTorch很容易被推广,因为它很简单。许多研究人员和实践者发现它易于学习、使用、扩展和调试。它是Python化的,虽然和任何复杂领域一样,它有注意事项和最佳实践示例,但对于以前使用过Python的开发人员来说,使用该库和使用其他Python库一样。更具体地说,在PyTorch中编写深度学习机是很自然的事情。PyTorch为我们提供了一种数据类型,即张量,通常用来存储数字、向量、矩阵和数组。此外,PyTorch还提供了操作它们的函数,我们可以使用这些函数来增量编程。如果我们愿意,还可以进行交互式编程,就像平常使用Python一样。如果你知道NumPy,那么你对交互式编程应是非常熟悉的。PyTorch具备2个特性,使得它与深度学习关联紧密。首先,它使用GPU加速计算,通常比在CPU上执行相同的计算速度快50倍。其次,PyTorch提供了支持通用数学表达式数值优化的工具,该工具用于训练深度学习模型。四、创建数据Tensors张量是一种特殊的数据结构,它和数组还有矩阵十分相似。在Pytorch中,Tensors可以在gpu或其他专用硬件上运行来加速计算之外,其他用法类似Numpy。importtorchimportnumpyasnp#直接从数据创建data=[[1,2],[3,4]]x_data=torch.tensor(data)x_data.shape#全为1x_ones=torch.ones_like(x_data)#retainsthepropertiesofx_dataprint(f"OnesTensor:\n{x_ones}\n")#全为0x_rand=torch.rand_like(x_data,dtype=torch.float)#overridesthedatatypeofx_dataprint(f"RandomTensor:\n{x_rand}\n")#查看tensor类型tensor=torch.rand(3,4)print(f"Shapeoftensor:{tensor.shape}“)print(f"Datatypeoftensor:{tensor.dtype}”)print(f"Devicetensorisstoredon:{tensor.device}")步骤2:自动梯度计算在Pytorch中可以使用tensor进行计算,并最终可以从计算得到的tensor计算损失,并进行梯度信息。在Pytorch中主要关注正向传播的计算即可。#x=torch.ones(2,2,requires_grad=True)x=torch.tensor([[1,2],[3,4]],dtype=float,requires_grad=True)print(x)y=x+2print(y)print(y.grad_fn)#y就多了一个AddBackwardz=y*y*3out=z.mean()print(z)#z多了MulBackwardprint(out)#out多了MeanBackward#计算公式:out=0.25((x+2)*(x+2)*3)out.backward()print(x.grad)步骤3:拟合曲线接下来我们将尝试使用Pytorch拟合一条曲线,我们首先的创建待你和的参数,并加载待训练的数据。#需要计算得到的参数w=torch.ones(1,requires_grad=True)b=torch.ones(1,requires_grad=True)#数据x_tensor=torch.from_numpy(x)y_tensor=torch.from_numpy(y)#目标模型#y=wx+b定义损失defmse(label,pred):diff=label-predreturntorch.sqrt((diff**2).mean())pred=x_tensor*w+bloss=mse(y_tensor,pred)#执行20次参数更新for_inrange(20):#重新定义一下,梯度清空w=w.clone().detach().requires_grad_(True)b=b.clone().detach().requires_grad_(True)#正向传播pred=x_tensor*w+b#计算损失loss=mse(y_tensor,pred)print(loss)#计算梯度loss.backward()五、完整代码(GPU)使用GPU训练只需要把训练数据、模型放入GPU中即可指定是否使用GPU训练模型device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")模型放入GPU中model.to(device)数据放入GPU中inputs=torch.from_numpy(x_train).to(device)labels=torch.from_numpy(y_train).to(device)importtorchimporttorch.nnasnnimportnumpyasnpclassLinear_yy(torch.nn.Module): def__init__(self,in_dim,media_dim,out_dim): super(Linear_yy,self).__init__() self.linear_1=torch.nn.Linear(in_dim,media_dim) self.linear_2=torch.nn.Linear(media_dim,out_dim) defforward(self,x): x=self.linear_1(x) x=self.linear_2(x) returnx in_dim=1media_dim=2out_dim=1model=Linear_yy(in_dim=in_dim,media_dim=media_dim,out_dim=out_dim)device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")model.to(device)epochs=1000learning_rate=0.0001optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)loss_faction=torch.nn.MSELoss()forepochinrange(epochs): epoch+=1 #注意转行成tensor inputs=torch.from_numpy(x_train).to(device) labels=torch.from_numpy(y_train).to(device) #梯度要清零每一次迭代 optimizer.zero_grad() #前向传播 outputs=model(inputs) #计算损失 loss=loss_faction(outputs,labels) #返向传播 loss.backward() #更新权重参数 optimizer.step() ifepoch%50==0: print('epoch{},loss{}'.format(epoch,loss.item()))