0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于PyTorch的深度学习入门教程之PyTorch重点综合实践

ss 来源:雁回晴空 作者:雁回晴空 2021-02-15 10:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

PyTorch提供了两个主要特性:

(1) 一个n维的Tensor,与numpy相似但是支持GPU运算。

(2) 搭建和训练神经网络的自动微分功能。

我们将会使用一个全连接的ReLU网络作为实例。该网络有一个隐含层,使用梯度下降来训练,目标是最小化网络输出和真实输出之间的欧氏距离。

目录

Tensors(张量)

Warm-up:numpy

PyTorch:Tensors

Autograd(自动梯度)

PyTorch:Variables and autograd (变量和自动梯度)

PyTorch : Defining new autograd functions(定义新的自动梯度函数)

TensorFlow: Static Graphs (静态图)

nn module

PyTorch: nn

PyTorch: optim

PyTorch: Custom nn Modules (定制nn模块)

PyTorch: Control Flow + Weight Sharing (控制流+权重分享)

Tensors(张量)

Warm-up:numpy

在介绍PyTorch之前,我们先使用numpy来实现一个网络。

Numpy提供了一个n维数组对象,以及操作这些数组的函数。Numpy是一个通用的科学计算框架。它不是专门为计算图、深度学习或者梯度计算而生,但是我们能用它来把一个两层的网络拟合到随机数据上,只要我们手动把numpy运算在网络上前向和反向执行即可。

Numpy是一个了不起的框架,但是它很遗憾地不能支持GPU运算,无法对数值计算进行GPU加速。对于现在的深度神经网络,GPU一般能提供50倍以上的加速,所以numpy由于对GPU缺少支持,不能满足深度神经网络的计算需求。

这里介绍一下最基本的PyTorch概念:Tensor。一个PyTorch Tensor在概念上等价于numpy array:Tensor是一个n维的array,PyTorch提供了很多函数来在Tensors上进行运算。像numpy arrays一样,PyTorch Tensors也不是为深度学习、计算图、梯度而生;他们是一个科学计算的通用工具。

PyTorch Tensors可以利用GPU来加速数值计算。为了能在GPU上跑Tensor,我们只需要将它转到新的数据类型。

我们使用PyTorch Tensors来拟合2层的网络。与上面的numpy例子一样,我们需要手动执行网络上的前向和反向过程。

Autograd(自动梯度)

PyTorch:Variables and autograd (变量和自动梯度)

在上面的例子中,我们必须手动执行网络的前向和反向通道。对于一个两层的小网络来说,手动反向执行不是什么大事,但是对于大型网络来说,就非常费劲了。

幸运的是,我们可以使用自动微分来自动计算神经网络的反向通道。PyTorch的autograd 包就提供了此项功能。当使用autograd的时候,你的网络的前向通道定义一个计算图(computational graph),图中的节点(node)是Tensors,边(edge)将会是根据输入Tensor来产生输出Tensor的函数。这个图的反向传播将会允许你很轻松地去计算梯度。

这个听起来复杂,但是实际操作非常简单。我们把PyTorch Tensors打包到Variable 对象中,一个Variable代表一个计算图中的节点。如果x是一个Variable,那么x. data 就是一个Tensor 。并且x.grad是另一个Variable,该Variable保持了x相对于某个标量值得梯度。

PyTorch的Variable具有与PyTorch Tensors相同的API。差不多所有适用于Tensor的运算都能适用于Variables。区别在于,使用Variables定义一个计算图,令我们可以自动计算梯度。

下面我们使用PyTorch 的Variables和自动梯度来执行我们的两层的神经网络。我们不再需要手动执行网络的反向通道了。

PyTorch : Defining new autograd functions(定义新的自动梯度函数)

在底层,每一个原始的自动梯度运算符实际上是两个在Tensor上运行的函数。其中,forward函数计算从输入Tensors获得的输出Tensors。而backward函数接收输出Tensors相对于某个标量值的梯度,并且计算输入Tensors相对于该相同标量值的梯度。

在PyTorch中,我们可以很容易地定义自己的自动梯度运算符。具体来讲,就是先定义torch.autograd.Function的子类,然后实现forward和backward函数。之后我们就可以使用这个新的自动梯度运算符了。使用该运算符的方式是创建一个实例,并且像一个函数一样去调用它,传递包含输入数据的Variables。

在这个例子中,我们定义自己的定制自动梯度函数来执行ReLU非线性,然后使用它执行我们的两层网络。

TensorFlow: Static Graphs(静态图)

PyTorch自动梯度看起来非常像TensorFlow:在两个框架中,我们都定义计算图,使用自动微分来计算梯度。两者最大的不同就是TensorFlow的计算图是静态的,而PyTorch使用动态的计算图。

在TensorFlow中,我们定义计算图一次,然后重复执行这个相同的图,可能会提供不同的输入数据。而在PyTorch中,每一个前向通道定义一个新的计算图。

静态图的好处在于你可以预先对图进行优化。例如,一个框架可能要融合一些图运算来提升效率,或者产生一个策略来将图分布到多个GPU或机器上。如果你重复使用相同的图,前期优化的消耗就会被分摊开,因为相同的图在多次重复运行。

静态图和动态图的一个不同之处是控制流。对于一些模型,我们希望对每个数据点执行不同的计算。例如,一个递归神经网络可能对于每个数据点执行不同的时间步数,这个展开(unrolling)可以作为一个循环来实现。对于一个静态图,循环结构要作为图的一部分。因此,TensorFlow提供了运算符(例如tf .scan)来把循环嵌入到图当中。对于动态图来说,情况更加简单:既然我们为每个例子即时创建图,我们可以使用正常的解释流控制来为每个输入执行不同的计算。

为了与上面的PyTorch自动梯度实例做对比,我们使用TensorFlow来拟合一个简单的2层网络。

计算图和自动梯度是非常强大的范式,可用于定义复杂的运算符和自动求导数。然而,对于一个大型的网络来说,原始的自动梯度有点太低级别了。

在建立神经网络的时候,我们经常把计算安排在层(layers)中。某些层有可学习的参数,将会在学习中进行优化。

在TensorFlow中,Keras,TensorFlow-Slim和TFLearn这些包提供了原始计算图之上的高级抽象,这对于构建神经网络大有裨益。

在PyTorch中, nn包服务于相同的目的。nn包定义了一系列Modules,大体上相当于神经网络的层。一个Module接收输入Variables,计算输出Variables,但是也可以保持一个内部状态,例如包含了可学习参数的Variables。nn 包还定义了一系列在训练神经网络时常用的损失函数。

在下面例子中,我们使用nn包来实现我们的两层神经网络。

目前,我们已经通过手动改变持有可学习参数的Variables的 .data成员来更新模型的权重。对于简单的优化算法(例如随机梯度下降)来说这不是一个大的负担,但是实际上我们经常使用更加复杂的优化器来训练神经网络,例如AdaGrad, RMSProp, Adam等。

PyTorch的optim包将优化算法进行抽象,并提供了常用的优化算法的实现。

下面这个例子,我们将会使用 nn包来定义模型,使用optim包提供的Adam算法来优化这个模型。

有时候,需要设定比现有模块序列更加复杂的模型。这时,你可以通过生成一个nn.Module的子类来定义一个forward。该forward可以使用其他的modules或者其他的自动梯度运算来接收输入Variables,产生输出Variables。

在这个例子中,我们实现两层神经网络作为一个定制的Module子类。

我们实现一个非常奇怪的模型来作为动态图和权重分享的例子。这个模型是一个全连接的ReLU网络。每一个前向通道选择一个1至4之间的随机数,在很多隐含层中使用。多次使用相同的权重来计算最内层的隐含层。

这个模型我们使用正常的Python流控制来实现循环。在定义前向通道时,通过多次重复使用相同的Module来实现权重分享。

我们实现这个模型作为一个Module的子类。

总结

本文介绍了PyTorch中的重点模块和使用,对于开展之后的实战练习非常重要。所以,我们需要认真练习一下本文的所有模块。最好手敲代码走一遍。

责任编辑:xj

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 深度学习
    +关注

    关注

    73

    文章

    5590

    浏览量

    123907
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14699
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    学习物联网怎么入门?

    的相关书籍和视频进行学习。也可以通过参加线下班、工作坊和实践活动来学习。不同的学习方式适合不同的人群,初学者可以根据自己的实际情况选择适合自己的学习
    发表于 10-14 10:34

    摩尔线程发布Torch-MUSA v2.1.1版本

    近日,摩尔线程发布其面向PyTorch深度学习框架的MUSA扩展库——Torch-MUSA v2.1.1。该版本在v2.1.0的基础上,进一步扩展了对大规模深度
    的头像 发表于 09-10 11:02 727次阅读

    Arm方案 基于Arm架构的边缘侧设备(树莓派或 NVIDIA Jetson Nano)上部署PyTorch模型

    本文将为你展示如何在树莓派或 NVIDIA Jetson Nano 等基于 Arm 架构的边缘侧设备上部署 PyTorch 模型。
    的头像 发表于 07-28 11:50 2497次阅读

    Nordic收购 Neuton.AI 关于产品技术的分析

    Nordic Semiconductor 于 2025 年收购了 Neuton.AI,这是一家专注于超小型机器学习(TinyML)解决方案的公司。 Neuton 开发了一种独特的神经网络框架,能够
    发表于 06-28 14:18

    摩尔线程发布Torch-MUSA v2.0.0版本 支持原生FP8和PyTorch 2.5.0

    近日,摩尔线程正式发布Torch-MUSA v2.0.0版本,这是其面向PyTorch深度学习框架的MUSA扩展库的重要升级。新版本基于MUSA Compute Capability 3.1计算架构
    的头像 发表于 05-11 16:41 1269次阅读

    海思SS626开发板

    识别/运动跟踪等)。 主板集成常用视频硬件接口,所有外设接口电路均通过严格的抗干扰测试,使产品在 EMC 及稳定性方面 具有良好表现;使用通过稳定性测试及深度优化的系统软件(Linux 系统),支持业界主流深度学习框架(如 Ca
    发表于 04-24 10:04

    使用OpenVINO™ 2021.4将经过训练的自定义PyTorch模型加载为IR格式时遇到错误怎么解决?

    使用 OpenVINO™ 2021.4 将经过训练的自定义 PyTorch 模型加载为 IR 格式时遇到错误: RuntimeError: [ GENERAL_ERROR ] Failed
    发表于 03-05 08:40

    如何在Arm Ethos-U85上使用ExecuTorch

    在快速发展的机器学习领域,PyTorch 凭借其灵活性和全面的生态系统,已成为模型开发的热门框架。Arm 与 Meta 合作在 ExecuTorch 中引入了对 Arm 平台的支持,进一步简化了模型算法开发过程,实现无缝在边缘侧设备上部署
    的头像 发表于 02-14 14:23 1015次阅读
    如何在Arm Ethos-U85上使用ExecuTorch

    操作指南:pytorch云服务器怎么设置?

    设置PyTorch云服务器需选择云平台,创建合适的GPU实例,安装操作系统、Python及Anaconda,创建虚拟环境,根据CUDA版本安装PyTorch,配置环境变量,最后验证安装。过程中需考虑
    的头像 发表于 02-08 10:33 606次阅读

    AIGC入门及鸿蒙入门

    人工智能和大数据技术的创新内容生成工具,正逐渐成为瞩目的焦点。它为创意性工作打开了全新的大门,尤其在文本和视觉内容创作方面表现卓越。对于初学者来说,可以通过学习相关基础知识和实践操作来入门AIGC领域。同时
    发表于 01-13 10:32

    【「具身智能机器人系统」阅读体验】+两本互为支持的书

    如何使用PyTorch进行数字图像处理,它借助摄像头来获取视频的图像信息,然后通过已有的图像识别框架模型经深度学习和优化以达到更精准的识别结果,从而为进一步的执行处理提供数据支持和依据。而《具身智能机器人系统
    发表于 01-01 15:50

    Triton编译器在机器学习中的应用

    多种深度学习框架,如TensorFlow、PyTorch、ONNX等,使得开发者能够轻松地将不同框架下训练的模型部署到GPU上。 2. Triton编译器的工作原理 Triton编译器通过以下几个步骤
    的头像 发表于 12-24 18:13 1629次阅读

    利用Arm Kleidi技术实现PyTorch优化

    PyTorch 是一个广泛应用的开源机器学习 (ML) 库。近年来,Arm 与合作伙伴通力协作,持续改进 PyTorch 的推理性能。本文将详细介绍如何利用 Arm Kleidi 技术提升 Arm
    的头像 发表于 12-23 09:19 1619次阅读
    利用Arm Kleidi技术实现<b class='flag-5'>PyTorch</b>优化

    vLLM项目加入PyTorch生态系统,引领LLM推理新纪元

    近日,vLLM项目宣布正式成为PyTorch生态系统的一部分,标志着该项目与PyTorch的合作进入了一个全新的阶段。本文将从以下几个方面进行介绍,特别提醒:安装方案在第四个部分,可选择性阅读
    的头像 发表于 12-18 17:06 1574次阅读
    vLLM项目加入<b class='flag-5'>PyTorch</b>生态系统,引领LLM推理新纪元

    使用英特尔AI PC为YOLO模型训练加速

    在以往的实践中,当我们针对 ultralytics 的 YOLO 模型开展训练工作时,可供选择的计算设备通常局限于 CPU、mps 以及 cuda 这几种。然而,自 PyTorch2.5 版本发布
    的头像 发表于 12-09 16:14 2105次阅读
    使用英特尔AI PC为YOLO模型训练加速