网站首页 > 技术文章 正文
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的基本套路。大家感觉如何?欢迎评论交流。
猜你喜欢
- 2024-10-12 新手教程:在新应用中实践深度学习的最佳建议
- 2024-10-12 一个新的基于样本数量计算的的高斯 softmax 函数
- 2024-10-12 TensorFlow和PyTorch相继发布最新版,有何变化
- 2024-10-12 来自特斯拉AI总监的“秘方”:这些训练神经网络的小技巧不能忽略
- 2024-10-12 小型深度学习框架 | TinyGrad,不到1K行代码(附代码下载)
- 2024-10-12 Pytorch损失函数简明教程 pytorch loss function
- 2024-10-12 深度学习实战第四课 深度学习基础教程
- 2024-10-12 Python pytorch 深度学习神经网络 softmax线性回归分类学习笔记
- 2024-10-12 收藏!PyTorch常用代码段合集 pytorch 编程
- 2024-10-12 深度神经网络模型训练中的最新tricks总结【原理与代码汇总】
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)