计算机系统应用教程网站

网站首页 > 技术文章 正文

收藏!10分钟轻松入门AI神器PyTorch

btikc 2024-10-12 11:47:11 技术文章 3 ℃ 0 评论

PyTorch快速入门



PyTorch快速入门

概述

本教程通过十分钟快速入门和代码实践带你走入python的AI世界。

PyTorch代码概述

model/net.py

:指定神经网络架构,损失函数和评估指标

model/data_loader.py

:指定如何将数据馈送到网络

train.py

:包含主要训练循环

evaluate.py

:包含用于评估模型的主循环

utils.py

:用于处理hyperparams /日志/存储模型的实用程序函数

建议您仔细阅读

train.py

以获得详细认识。

摸熟后,您可能需要修改代码,具体取决于您的任务和数据集

model/net.py

改变模型,即如何将输入转换为预测以及损失等。

model/data_loader.py

更改将数据提供给模型的方式。

train.py

evaluate.py

一旦您获得了适用于的数据集,可以随意编辑代码以满足需求。

绕不过的理论:张量和变量

在进一步讨论之前,我强烈建议您使用PyTorch进行快速实践,以了解PyTorch的基础知识。这是一个潜行峰。

PyTorch张量的行为与NumPy的数组相似。

>>>importtorch>>>a=torch.Tensor([[1,2],[3,4]])>>>print(a)1234[torch.FloatTensorofsize2x2]>>>print(a**2)14916[torch.FloatTensorofsize2x2]

PyTorch变量允许您包装Tensor并对其执行记录操作。

>>>fromtorch.autogradimportVariable>>>a=Variable(torch.Tensor([[1,2],[3,4]]),requires_grad=True)>>>print(a)Variablecontaining:1234[torch.FloatTensorofsize2x2]>>>y=torch.sum(a**2)# 1 + 4 + 9 + 16>>>print(y)Variablecontaining:30[torch.FloatTensorofsize1]>>>y.backward()# compute gradients of y wrt a>>>print(a.grad)# print dy/da_ij = 2*a_ij for a_11, a_12, a21, a22Variablecontaining:2468[torch.FloatTensorofsize2x2]

这PyTorch以其极简主义和直观的语法包含优雅和表现力。在继续之前,请先熟悉参考资料部分中的更多示例。

核心步骤

让我们先来看看训练算法的核心是什么样的。下面的五行通过模型传递一批输入,计算损失,执行反向传播并更新参数。

output_batch=model(train_batch)# compute model outputloss=loss_fn(output_batch,labels_batch)# calculate lossoptimizer.zero_grad()# clear previous gradientsloss.backward()# compute gradients of all variables wrt lossoptimizer.step()# perform updates using calculated gradients

每个变量

train_batch

labels_batch

output_batch

loss

是一个PyTorch变量,并且允许自动计。

我们编写的所有其他代码都是围绕这个构建的 - 模型的确切规范,如何获取一批数据和标签,计算损失和优化器的细节。在这篇文章中,将介绍如何在PyTorch中编写简单模型,计算损失并定义优化器。

PyTorch中的模型

可以通过继承类来在PyTorch中定义模型

torch.nn.Module

。该模型分为两个步骤。首先指定模型的参数,然后概述它们如何应用于输入。对于不涉及可训练参数的操作(激活函数,如ReLU,像maxpool这样的操作),我们通常使用该

torch.nn.functional

模块。以下是从这里借来的单个隐藏层神经网络的示例:

importtorch.nnasnnimporttorch.nn.functionalasFclassTwoLayerNet(nn.Module):def__init__(self,D_in,H,D_out):""" In the constructor we instantiate two nn.Linear modules and assign them as member variables. D_in: input dimension H: dimension of hidden layer D_out: output dimension """super(TwoLayerNet,self).__init__()self.linear1=nn.Linear(D_in,H)self.linear2=nn.Linear(H,D_out)defforward(self,x):""" In the forward function we accept a Variable of input data and we must return a Variable of output data. We can use Modules defined in the constructor as well as arbitrary operators on Variables. """h_relu=F.relu(self.linear1(x))y_pred=self.linear2(h_relu)returny_pred

__init__

函数初始化模型的两个线性层。PyTorch负责始化您指定的参数。在

forward

函数中,我们首先应用第一个线性层,应用ReLU激活,然后应用第二个线性层。该模块假定第一个维度

x

是批量大小。如果网络的输入只是维度为100的向量,批量大小为32,则维度为

x

32,100。让我们看一个如何定义模型和计算正向传递的示例:

# N is batch size; D_in is input dimension;# H is the dimension of the hidden layer; D_out is output dimension.N,D_in,H,D_out=32,100,50,10# Create random Tensors to hold inputs and outputs, and wrap them in Variablesx=Variable(torch.randn(N,D_in))# dim: 32 x 100# Construct our model by instantiating the class defined abovemodel=TwoLayerNet(D_in,H,D_out)# Forward pass: Compute predicted y by passing x to the modely_pred=model(x)# dim: 32 x 10

更复杂的模型遵循相同的布局,我们将在后续帖子中看到其中两个。

损失函数

PyTorch提供了许多标准loss功能,可供您在

torch.nn

模块中使用。这是一个如何计算交叉熵损失的简单示例。假设我们的模型解决了带

C

标签的多类分类问题。然后对于一批大小

N

out

NxC

通过在模型中传递输入批次获得的PyTorch维度变量。我们还有一个

target

大小的变量

N

,其中每个元素都是该示例的类,即中的标签

[0,...,C-1]

。您可以定义损失函数并计算损失,如下所示:

loss_fn=nn.CrossEntropyLoss()loss=loss_fn(out,target)

PyTorch可以很容易地扩展它并编写自己的自定义损失函数。我们可以编写自己的Cross Entropy Loss函数,如下所示(注意NumPy-esque语法):

defmyCrossEntropyLoss(outputs,labels):batch_size=outputs.size()[0]# batch_sizeoutputs=F.log_softmax(outputs,dim=1)# compute the log of softmax valuesoutputs=outputs[range(batch_size),labels]# pick the values corresponding to the labelsreturn-torch.sum(outputs)/num_examples

这是编写自己的损失函数的一个相当简单的例子。

优化



torch.optim

软件包为常见的优化算法提供了易于使用的界面。定义优化器非常简单:

# pick an SGD optimizeroptimizer=torch.optim.SGD(model.parameters(),lr=0.01,momentum=0.9)# or pick ADAMoptimizer=torch.optim.Adam(model.parameters(),lr=0.0001)

传递了每次迭代需要更新的模型参数。还可以指定更复杂的方法,例如参数学习率。

一旦使用计算梯度

loss.backward()

,调用

optimizer.step()

更新优化算法定义的参数。

训练与评估



训练与评估

在训练模型之前,必须打调用

model.train()

。同样,调用

model.eval()

在测试模型之前。这可以纠正培训和测试过程中的丢失,批量标准化的差异。

计算指标

在这个阶段,您应该能够理解大部分代码

train.py

evaluate.py

除了密切关注损失之外,监控其他指标(如准确性和精确度/召回率)也很有帮助。为此,您可以为文件中的一批模型输出定义自己的度量标准函数

model/net.py

。为了使其更容易,我们将PyTorch变量转换为NumPy数组,然后将它们传递给度量函数。对于在损失函数一节中设置的多类分类问题,我们可以使用NumPy编写一个计算精度的函数:

defaccuracy(out,labels):outputs=np.argmax(out,axis=1)returnnp.sum(outputs==labels)/float(labels.size)

您可以在

model/net.py

文件中添加自己的指标。完成后,只需将它们添加到

metrics

中:

metrics={'accuracy':accuracy,# add your own custom metrics,}

保存和加载模型

我们定义实用程序函数来保存和加载模型

utils.py

。要保存模型,请执行:

state={'epoch':epoch+1,'state_dict':model.state_dict(),'optim_dict':optimizer.state_dict()}utils.save_checkpoint(state,is_best=is_best,# True if this is the model with best metricscheckpoint=model_dir)# path to folder

utils.py

在内部使用该

torch.save(state, filepath)

方法来保存上面定义的状态。您可以向状态中添加更多,例如指标。

model.state_dict()

存储模型和参数

optimizer.state_dict()

存储优化的状态(如每个参数学习率)。

要从检查点加载已保存的状态,您可以使用:

utils.load_checkpoint(restore_path,model,optimizer)

optimizer

参数是可选的,你可以选择一个新的优化器重新启动。

load_checkpoint

内部加载保存的检查点并恢复模型权重和优化程序的状态。

使用GPU

通过代码散布,你会发现如下行:

>model=net.Net(params).cuda()ifparams.cudaelsenet.Net(params)>ifparams.cuda:batch_data,batch_labels=batch_data.cuda(),batch_labels.cuda()

PyTorch使用这些命令使GPU显式透明。调用

.cuda()

模型/ Tensor / Variable将其发送到GPU。为了在GPU上训练模型,必须将所有相关参数和变量发送到GPU

.cuda()

调试

凭借其简洁的设计,PyTorch使调试变得轻而易举。您可以

pdb.set_trace()

在代码中的任何行使用断点。然后,您可以执行进一步的计算,检查PyTorch张量/变量并查明错误的根本原因。

以上就是使用PyTorch的基本套路。大家感觉如何?欢迎评论交流。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表